tests: riscv: test PMP stack guards
Test if PMP protected regions prevents write access. Signed-off-by: Volodymyr Fialko <vfialko@marvell.com>
This commit is contained in:
parent
9eee2eaee6
commit
1310856348
4 changed files with 107 additions and 0 deletions
13
tests/arch/riscv/pmp/no-multithreading/CMakeLists.txt
Normal file
13
tests/arch/riscv/pmp/no-multithreading/CMakeLists.txt
Normal file
|
@ -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
|
||||
)
|
2
tests/arch/riscv/pmp/no-multithreading/prj.conf
Normal file
2
tests/arch/riscv/pmp/no-multithreading/prj.conf
Normal file
|
@ -0,0 +1,2 @@
|
|||
CONFIG_ZTEST=y
|
||||
CONFIG_MULTITHREADING=n
|
79
tests/arch/riscv/pmp/no-multithreading/src/main.c
Normal file
79
tests/arch/riscv/pmp/no-multithreading/src/main.c
Normal file
|
@ -0,0 +1,79 @@
|
|||
/*
|
||||
* Copyright (c) 2024 Marvell.
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#include <kernel_internal.h>
|
||||
#include <zephyr/tc_util.h>
|
||||
#include <zephyr/ztest.h>
|
||||
|
||||
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);
|
13
tests/arch/riscv/pmp/no-multithreading/testcase.yaml
Normal file
13
tests/arch/riscv/pmp/no-multithreading/testcase.yaml
Normal file
|
@ -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
|
Loading…
Add table
Add a link
Reference in a new issue