diff --git a/tests/kernel/fatal/prj.conf b/tests/kernel/fatal/prj.conf index acc932d71dc52..08e37bab0d04b 100644 --- a/tests/kernel/fatal/prj.conf +++ b/tests/kernel/fatal/prj.conf @@ -2,4 +2,5 @@ CONFIG_HW_STACK_PROTECTION=y CONFIG_ZTEST=y CONFIG_COVERAGE=n CONFIG_TEST_USERSPACE=y +CONFIG_APPLICATION_DEFINED_SYSCALL=y CONFIG_SMP=n diff --git a/tests/kernel/fatal/src/main.c b/tests/kernel/fatal/src/main.c index 2add79aa2d85a..4d79509308a09 100644 --- a/tests/kernel/fatal/src/main.c +++ b/tests/kernel/fatal/src/main.c @@ -11,6 +11,11 @@ #include #include +#if defined(CONFIG_USERSPACE) +#include +#include "test_syscalls.h" +#endif + #if defined(CONFIG_X86) && defined(CONFIG_X86_MMU) #define STACKSIZE (8192) #else @@ -136,7 +141,18 @@ void blow_up_stack(void) { stack_smasher(37); } -#endif + +#if defined(CONFIG_USERSPACE) + +void z_impl_blow_up_priv_stack(void) +{ + blow_up_stack(); +} + +Z_SYSCALL_HANDLER0_SIMPLE_VOID(blow_up_priv_stack); + +#endif /* CONFIG_USERSPACE */ +#endif /* CONFIG_STACK_SENTINEL */ void stack_sentinel_timer(void) { @@ -174,6 +190,18 @@ void stack_hw_overflow(void) rv = TC_FAIL; } +#if defined(CONFIG_USERSPACE) +void user_priv_stack_hw_overflow(void) +{ + /* Test that HW stack overflow check works + * on a user thread's privilege stack. + */ + blow_up_priv_stack(); + TC_ERROR("should never see this\n"); + rv = TC_FAIL; +} +#endif /* CONFIG_USERSPACE */ + void check_stack_overflow(void *handler, u32_t flags) { crash_reason = -1; @@ -289,6 +317,12 @@ void test_fatal(void) TC_PRINT("test stack HW-based overflow - user 2\n"); check_stack_overflow(stack_hw_overflow, K_USER); + + TC_PRINT("test stack HW-based overflow - user priv stack 1\n"); + check_stack_overflow(user_priv_stack_hw_overflow, K_USER); + + TC_PRINT("test stack HW-based overflow - user priv stack 2\n"); + check_stack_overflow(user_priv_stack_hw_overflow, K_USER); #endif /* CONFIG_USERSPACE */ #endif /* !CONFIG_ARCH_POSIX */ diff --git a/tests/kernel/fatal/src/test_syscalls.h b/tests/kernel/fatal/src/test_syscalls.h new file mode 100644 index 0000000000000..a3b337228b9c2 --- /dev/null +++ b/tests/kernel/fatal/src/test_syscalls.h @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2017 Intel Corporation + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef _TEST_SYSCALLS_H_ +#define _TEST_SYSCALLS_H_ +#include + +__syscall void blow_up_priv_stack(void); + +#include + +#endif /* _TEST_SYSCALLS_H_ */