From 131085634856695f6e1293f1921490aabe485ebe Mon Sep 17 00:00:00 2001 From: Volodymyr Fialko Date: Mon, 18 Nov 2024 09:23:39 +0100 Subject: [PATCH] tests: riscv: test PMP stack guards Test if PMP protected regions prevents write access. Signed-off-by: Volodymyr Fialko --- .../pmp/no-multithreading/CMakeLists.txt | 13 +++ .../arch/riscv/pmp/no-multithreading/prj.conf | 2 + .../riscv/pmp/no-multithreading/src/main.c | 79 +++++++++++++++++++ .../riscv/pmp/no-multithreading/testcase.yaml | 13 +++ 4 files changed, 107 insertions(+) create mode 100644 tests/arch/riscv/pmp/no-multithreading/CMakeLists.txt create mode 100644 tests/arch/riscv/pmp/no-multithreading/prj.conf create mode 100644 tests/arch/riscv/pmp/no-multithreading/src/main.c create mode 100644 tests/arch/riscv/pmp/no-multithreading/testcase.yaml diff --git a/tests/arch/riscv/pmp/no-multithreading/CMakeLists.txt b/tests/arch/riscv/pmp/no-multithreading/CMakeLists.txt new file mode 100644 index 00000000000..e0f392177d6 --- /dev/null +++ b/tests/arch/riscv/pmp/no-multithreading/CMakeLists.txt @@ -0,0 +1,13 @@ +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.20.0) +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) +project(riscv_pmp) + +FILE(GLOB app_sources src/*.c) +target_sources(app PRIVATE ${app_sources}) + +target_include_directories(app PRIVATE + ${ZEPHYR_BASE}/kernel/include + ${ZEPHYR_BASE}/arch/${ARCH}/include + ) diff --git a/tests/arch/riscv/pmp/no-multithreading/prj.conf b/tests/arch/riscv/pmp/no-multithreading/prj.conf new file mode 100644 index 00000000000..7414c11237a --- /dev/null +++ b/tests/arch/riscv/pmp/no-multithreading/prj.conf @@ -0,0 +1,2 @@ +CONFIG_ZTEST=y +CONFIG_MULTITHREADING=n diff --git a/tests/arch/riscv/pmp/no-multithreading/src/main.c b/tests/arch/riscv/pmp/no-multithreading/src/main.c new file mode 100644 index 00000000000..26ded61165f --- /dev/null +++ b/tests/arch/riscv/pmp/no-multithreading/src/main.c @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2024 Marvell. + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include + +static volatile ZTEST_BMEM bool valid_fault; + +void k_sys_fatal_error_handler(unsigned int reason, const struct arch_esf *pEsf) +{ + int rv = TC_PASS; + + TC_PRINT("Caught system error -- reason %d %d\n", reason, valid_fault); + if (!valid_fault) { + TC_PRINT("Fatal error was unexpected, aborting...\n"); + rv = TC_FAIL; + } + TC_END_RESULT_CUSTOM(rv, "test_pmp"); + TC_END_REPORT(rv); + arch_system_halt(reason); +} + +#ifdef CONFIG_PMP_STACK_GUARD +static void check_isr_stack_guard(void) +{ + char *isr_stack = (char *)z_interrupt_stacks; + + valid_fault = true; + *isr_stack = 42; +} + +static void check_main_stack_guard(void) +{ + char *main_stack = (char *)z_main_stack; + + valid_fault = true; + *main_stack = 42; +} + +#else + +static void check_isr_stack_guard(void) +{ + ztest_test_skip(); +} + +static void check_main_stack_guard(void) +{ + ztest_test_skip(); +} + +#endif /* CONFIG_PMP_STACK_GUARD */ + +typedef void (*pmp_test_func_t)(void); + +static const pmp_test_func_t pmp_test_func[] = { + check_isr_stack_guard, + check_main_stack_guard, +}; + +/** + * @brief Verify RISC-V specific PMP stack guard regions. + * @details Manually write to the protected stack region to trigger fatal error. + */ +ZTEST(riscv_pmp_no_mt, test_pmp) +{ +#ifndef PMP_TEST_FUNC_IDX +#define PMP_TEST_FUNC_IDX 0 +#endif + pmp_test_func[PMP_TEST_FUNC_IDX](); + + zassert_unreachable("Write to stack guard did not fault"); + TC_END_REPORT(TC_FAIL); +} + +ZTEST_SUITE(riscv_pmp_no_mt, NULL, NULL, NULL, NULL, NULL); diff --git a/tests/arch/riscv/pmp/no-multithreading/testcase.yaml b/tests/arch/riscv/pmp/no-multithreading/testcase.yaml new file mode 100644 index 00000000000..d8f887fa341 --- /dev/null +++ b/tests/arch/riscv/pmp/no-multithreading/testcase.yaml @@ -0,0 +1,13 @@ +common: + platform_allow: + - qemu_riscv32 + - qemu_riscv32e + - qemu_riscv64 + filter: CONFIG_RISCV_PMP + ignore_faults: true + +tests: + arch.riscv.pmp.no-mt.isr-stack-guard: + extra_args: EXTRA_CFLAGS=-DPMP_TEST_FUNC_IDX=0 + arch.riscv.pmp.no-mt.main-stack-guard: + extra_args: EXTRA_CFLAGS=-DPMP_TEST_FUNC_IDX=1