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:
Volodymyr Fialko 2024-11-18 09:23:39 +01:00 committed by Anas Nashif
commit 1310856348
4 changed files with 107 additions and 0 deletions

View 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
)

View file

@ -0,0 +1,2 @@
CONFIG_ZTEST=y
CONFIG_MULTITHREADING=n

View 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);

View 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