blob: cbba4820ff49ecd24ee03c067d1029498caf9133 [file] [log] [blame]
mardyk01f5b46352023-10-24 16:23:23 -05001/*
mardyk017b51dbe2024-01-17 15:25:36 -06002 * Copyright (c) 2023-2024, Arm Limited. All rights reserved.
mardyk01f5b46352023-10-24 16:23:23 -05003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
Mark Dykes50297972024-03-15 12:49:22 -05007#include <arg_struct_def.h>
8#include "constraint.h"
mardyk017b51dbe2024-01-17 15:25:36 -06009#include <fuzz_names.h>
mardyk01f5b46352023-10-24 16:23:23 -050010#include <sdei_fuzz_helper.h>
11
Mark Dykes50297972024-03-15 12:49:22 -050012#define INTERRUPT_BIND_INT_LOWVAL 170
13#define INTERRUPT_BIND_INT_HIGHVAL 200
14
15int stbev = 0;
16
mardyk017b51dbe2024-01-17 15:25:36 -060017/*
18 * SDEI function that has no arguments
19 */
mardyk01f5b46352023-10-24 16:23:23 -050020void tftf_test_sdei_noarg(int64_t (*sdei_func)(void), char *funcstr)
21{
22 int64_t ret = (*sdei_func)();
23
24 if (ret < 0) {
25 tftf_testcase_printf("%s failed: 0x%llx\n", funcstr, ret);
26 }
27}
28
mardyk017b51dbe2024-01-17 15:25:36 -060029/*
30 * SDEI function that has single argument
31 */
mardyk01f5b46352023-10-24 16:23:23 -050032void tftf_test_sdei_singlearg(int64_t (*sdei_func)(uint64_t), char *funcstr)
33{
Mark Dykes50297972024-03-15 12:49:22 -050034 struct sdei_intr_ctx intr_ctx;
35 int bev;
36
37 bev = sdei_interrupt_bind(tftf_get_timer_irq(), &intr_ctx);
38 int64_t ret = (*sdei_func)(bev);
mardyk01f5b46352023-10-24 16:23:23 -050039
40 if (ret < 0) {
41 tftf_testcase_printf("%s failed: 0x%llx\n", funcstr, ret);
42 }
43}
44
mardyk017b51dbe2024-01-17 15:25:36 -060045/*
46 * SDEI function called from fuzzer
47 */
Mark Dykes50297972024-03-15 12:49:22 -050048void run_sdei_fuzz(int funcid, struct memmod *mmod)
mardyk01f5b46352023-10-24 16:23:23 -050049{
mardyk017b51dbe2024-01-17 15:25:36 -060050 if (funcid == sdei_version_funcid) {
mardyk01f5b46352023-10-24 16:23:23 -050051 long long ret = sdei_version();
52
53 if (ret != MAKE_SDEI_VERSION(1, 0, 0)) {
54 tftf_testcase_printf("Unexpected SDEI version: 0x%llx\n",
55 ret);
56 }
mardyk017b51dbe2024-01-17 15:25:36 -060057 } else if (funcid == sdei_pe_unmask_funcid) {
58 tftf_test_sdei_noarg(sdei_pe_unmask, "sdei_pe_unmuask");
59 } else if (funcid == sdei_pe_mask_funcid) {
mardyk01f5b46352023-10-24 16:23:23 -050060 tftf_test_sdei_noarg(sdei_pe_mask, "sdei_pe_mask");
Mark Dykes50297972024-03-15 12:49:22 -050061 } else if (funcid == sdei_interrupt_bind_funcid) {
62 struct sdei_intr_ctx intr_ctx;
63 uint64_t inputbind[2] = {INTERRUPT_BIND_INT_LOWVAL, INTERRUPT_BIND_INT_HIGHVAL};
64
65 setconstraint(FUZZER_CONSTRAINT_RANGE, inputbind, 2,
66 SDEI_INTERRUPT_BIND_CALL_ARG1_INUM, mmod, FUZZER_CONSTRAINT_EXCMODE);
67
68 struct inputparameters inp = generate_args(SDEI_INTERRUPT_BIND_CALL, SMC_FUZZ_SANITY_LEVEL);
69
70 stbev = sdei_interrupt_bind(inp.x1, &intr_ctx);
71
mardyk017b51dbe2024-01-17 15:25:36 -060072 } else if (funcid == sdei_event_status_funcid) {
Mark Dykes50297972024-03-15 12:49:22 -050073 int64_t ret = sdei_event_status(stbev);
74
75 if (ret < 0) {
76 tftf_testcase_printf("sdei_event_status failed: 0x%llx %d\n", ret, stbev);
77 }
78
mardyk01f5b46352023-10-24 16:23:23 -050079 tftf_test_sdei_singlearg((int64_t (*)(uint64_t))sdei_event_status,
80 "sdei_event_status");
mardyk017b51dbe2024-01-17 15:25:36 -060081 } else if (funcid == sdei_event_signal_funcid) {
Mark Dykes50297972024-03-15 12:49:22 -050082 int64_t ret = sdei_event_signal(read_mpidr_el1());
83
84 if (ret < 0) {
85 tftf_testcase_printf("sdei_event_status failed: 0x%llx\n", ret);
86 }
87
mardyk01f5b46352023-10-24 16:23:23 -050088 tftf_test_sdei_singlearg(sdei_event_signal, "sdei_event_signal");
mardyk017b51dbe2024-01-17 15:25:36 -060089 } else if (funcid == sdei_private_reset_funcid) {
mardyk01f5b46352023-10-24 16:23:23 -050090 tftf_test_sdei_noarg(sdei_private_reset, "sdei_private_reset");
mardyk017b51dbe2024-01-17 15:25:36 -060091 } else if (funcid == sdei_shared_reset_funcid) {
mardyk01f5b46352023-10-24 16:23:23 -050092 tftf_test_sdei_noarg(sdei_shared_reset, "sdei_shared_reset");
93 }
94}