mardyk01 | f5b4635 | 2023-10-24 16:23:23 -0500 | [diff] [blame] | 1 | /* |
mardyk01 | 7b51dbe | 2024-01-17 15:25:36 -0600 | [diff] [blame] | 2 | * Copyright (c) 2023-2024, Arm Limited. All rights reserved. |
mardyk01 | f5b4635 | 2023-10-24 16:23:23 -0500 | [diff] [blame] | 3 | * |
| 4 | * SPDX-License-Identifier: BSD-3-Clause |
| 5 | */ |
| 6 | |
Mark Dykes | 5029797 | 2024-03-15 12:49:22 -0500 | [diff] [blame^] | 7 | #include <arg_struct_def.h> |
| 8 | #include "constraint.h" |
mardyk01 | 7b51dbe | 2024-01-17 15:25:36 -0600 | [diff] [blame] | 9 | #include <fuzz_names.h> |
mardyk01 | f5b4635 | 2023-10-24 16:23:23 -0500 | [diff] [blame] | 10 | #include <sdei_fuzz_helper.h> |
| 11 | |
Mark Dykes | 5029797 | 2024-03-15 12:49:22 -0500 | [diff] [blame^] | 12 | #define INTERRUPT_BIND_INT_LOWVAL 170 |
| 13 | #define INTERRUPT_BIND_INT_HIGHVAL 200 |
| 14 | |
| 15 | int stbev = 0; |
| 16 | |
mardyk01 | 7b51dbe | 2024-01-17 15:25:36 -0600 | [diff] [blame] | 17 | /* |
| 18 | * SDEI function that has no arguments |
| 19 | */ |
mardyk01 | f5b4635 | 2023-10-24 16:23:23 -0500 | [diff] [blame] | 20 | void 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 | |
mardyk01 | 7b51dbe | 2024-01-17 15:25:36 -0600 | [diff] [blame] | 29 | /* |
| 30 | * SDEI function that has single argument |
| 31 | */ |
mardyk01 | f5b4635 | 2023-10-24 16:23:23 -0500 | [diff] [blame] | 32 | void tftf_test_sdei_singlearg(int64_t (*sdei_func)(uint64_t), char *funcstr) |
| 33 | { |
Mark Dykes | 5029797 | 2024-03-15 12:49:22 -0500 | [diff] [blame^] | 34 | 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); |
mardyk01 | f5b4635 | 2023-10-24 16:23:23 -0500 | [diff] [blame] | 39 | |
| 40 | if (ret < 0) { |
| 41 | tftf_testcase_printf("%s failed: 0x%llx\n", funcstr, ret); |
| 42 | } |
| 43 | } |
| 44 | |
mardyk01 | 7b51dbe | 2024-01-17 15:25:36 -0600 | [diff] [blame] | 45 | /* |
| 46 | * SDEI function called from fuzzer |
| 47 | */ |
Mark Dykes | 5029797 | 2024-03-15 12:49:22 -0500 | [diff] [blame^] | 48 | void run_sdei_fuzz(int funcid, struct memmod *mmod) |
mardyk01 | f5b4635 | 2023-10-24 16:23:23 -0500 | [diff] [blame] | 49 | { |
mardyk01 | 7b51dbe | 2024-01-17 15:25:36 -0600 | [diff] [blame] | 50 | if (funcid == sdei_version_funcid) { |
mardyk01 | f5b4635 | 2023-10-24 16:23:23 -0500 | [diff] [blame] | 51 | 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 | } |
mardyk01 | 7b51dbe | 2024-01-17 15:25:36 -0600 | [diff] [blame] | 57 | } 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) { |
mardyk01 | f5b4635 | 2023-10-24 16:23:23 -0500 | [diff] [blame] | 60 | tftf_test_sdei_noarg(sdei_pe_mask, "sdei_pe_mask"); |
Mark Dykes | 5029797 | 2024-03-15 12:49:22 -0500 | [diff] [blame^] | 61 | } 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 | |
mardyk01 | 7b51dbe | 2024-01-17 15:25:36 -0600 | [diff] [blame] | 72 | } else if (funcid == sdei_event_status_funcid) { |
Mark Dykes | 5029797 | 2024-03-15 12:49:22 -0500 | [diff] [blame^] | 73 | 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 | |
mardyk01 | f5b4635 | 2023-10-24 16:23:23 -0500 | [diff] [blame] | 79 | tftf_test_sdei_singlearg((int64_t (*)(uint64_t))sdei_event_status, |
| 80 | "sdei_event_status"); |
mardyk01 | 7b51dbe | 2024-01-17 15:25:36 -0600 | [diff] [blame] | 81 | } else if (funcid == sdei_event_signal_funcid) { |
Mark Dykes | 5029797 | 2024-03-15 12:49:22 -0500 | [diff] [blame^] | 82 | 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 | |
mardyk01 | f5b4635 | 2023-10-24 16:23:23 -0500 | [diff] [blame] | 88 | tftf_test_sdei_singlearg(sdei_event_signal, "sdei_event_signal"); |
mardyk01 | 7b51dbe | 2024-01-17 15:25:36 -0600 | [diff] [blame] | 89 | } else if (funcid == sdei_private_reset_funcid) { |
mardyk01 | f5b4635 | 2023-10-24 16:23:23 -0500 | [diff] [blame] | 90 | tftf_test_sdei_noarg(sdei_private_reset, "sdei_private_reset"); |
mardyk01 | 7b51dbe | 2024-01-17 15:25:36 -0600 | [diff] [blame] | 91 | } else if (funcid == sdei_shared_reset_funcid) { |
mardyk01 | f5b4635 | 2023-10-24 16:23:23 -0500 | [diff] [blame] | 92 | tftf_test_sdei_noarg(sdei_shared_reset, "sdei_shared_reset"); |
| 93 | } |
| 94 | } |