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