From 3ca962eb37644cfa8a80566eb3dab63ae3a6a6dc Mon Sep 17 00:00:00 2001 From: Daniel Leung Date: Mon, 10 Mar 2025 14:30:21 -0700 Subject: [PATCH] tests: mem_protect/syscalls: multiple buffers for stress test This modifies string_copy() to have an addition ID as function argument so that it can copy into different buffers during the multi-threaded stress test, instead of all threads writing into the same buffer. This is to prevent a situation where one thread writes incorrect data but being overwritten by another thread with correct data, thus making the following strcmp() passing for both threads. Logically this should never happen since the same function is being called which should give same result, but it is simply to test for weird situations. Signed-off-by: Daniel Leung --- tests/kernel/mem_protect/syscalls/src/main.c | 38 ++++++++++--------- .../mem_protect/syscalls/src/test_syscalls.h | 2 +- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/tests/kernel/mem_protect/syscalls/src/main.c b/tests/kernel/mem_protect/syscalls/src/main.c index 8500e5f9c17..d5eabe4a1e2 100644 --- a/tests/kernel/mem_protect/syscalls/src/main.c +++ b/tests/kernel/mem_protect/syscalls/src/main.c @@ -32,8 +32,15 @@ #define FAULTY_ADDRESS 0xFFFFFFF0 #endif +#define NR_THREADS (arch_num_cpus() * 4) +#define MAX_NR_THREADS (CONFIG_MP_MAX_NUM_CPUS * 4) +#define STACK_SZ (1024 + CONFIG_TEST_EXTRA_STACK_SIZE) + +struct k_thread torture_threads[MAX_NR_THREADS]; +K_THREAD_STACK_ARRAY_DEFINE(torture_stacks, MAX_NR_THREADS, STACK_SZ); + char kernel_string[BUF_SIZE]; -char kernel_buf[BUF_SIZE]; +char kernel_buf[MAX_NR_THREADS][BUF_SIZE]; ZTEST_BMEM char user_string[BUF_SIZE]; void k_sys_fatal_error_handler(unsigned int reason, const struct arch_esf *pEsf) @@ -91,8 +98,10 @@ static inline int z_vrfy_string_alloc_copy(char *src) } #include -int z_impl_string_copy(char *src) +int z_impl_string_copy(char *src, int id) { + ARG_UNUSED(id); + if (!strcmp(src, kernel_string)) { return 0; } else { @@ -100,15 +109,15 @@ int z_impl_string_copy(char *src) } } -static inline int z_vrfy_string_copy(char *src) +static inline int z_vrfy_string_copy(char *src, int id) { - int ret = k_usermode_string_copy(kernel_buf, (char *)src, BUF_SIZE); + int ret = k_usermode_string_copy(kernel_buf[id], (char *)src, BUF_SIZE); if (ret) { return ret; } - return z_impl_string_copy(kernel_buf); + return z_impl_string_copy(kernel_buf[id], id); } #include @@ -279,16 +288,16 @@ ZTEST_USER(syscalls, test_user_string_copy) { int ret; - ret = string_copy("asdkajshdazskjdh"); + ret = string_copy("asdkajshdazskjdh", 0); zassert_equal(ret, ESRCH, "got %d", ret); - ret = string_copy("asdkajshdazskjdhikfsdjhfskdjfhsdkfjhskdfjhdskfjhs"); + ret = string_copy("asdkajshdazskjdhikfsdjhfskdjfhsdkfjhskdfjhdskfjhs", 0); zassert_equal(ret, EINVAL, "got %d", ret); - ret = string_copy(kernel_string); + ret = string_copy(kernel_string, 0); zassert_equal(ret, EFAULT, "got %d", ret); - ret = string_copy("this is a kernel string"); + ret = string_copy("this is a kernel string", 0); zassert_equal(ret, 0, "string should have matched"); } @@ -304,7 +313,7 @@ ZTEST_USER(syscalls, test_to_copy) char buf[BUF_SIZE]; int ret; - ret = to_copy(kernel_buf); + ret = to_copy(kernel_buf[0]); zassert_equal(ret, EFAULT, "should have faulted"); ret = to_copy(buf); @@ -336,13 +345,6 @@ ZTEST_USER(syscalls, test_more_args) "syscall didn't match impl"); } -#define NR_THREADS (arch_num_cpus() * 4) -#define MAX_NR_THREADS (CONFIG_MP_MAX_NUM_CPUS * 4) -#define STACK_SZ (1024 + CONFIG_TEST_EXTRA_STACK_SIZE) - -struct k_thread torture_threads[MAX_NR_THREADS]; -K_THREAD_STACK_ARRAY_DEFINE(torture_stacks, MAX_NR_THREADS, STACK_SZ); - void syscall_torture(void *arg1, void *arg2, void *arg3) { int count = 0; @@ -363,7 +365,7 @@ void syscall_torture(void *arg1, void *arg2, void *arg3) ret = string_alloc_copy("this is a kernel string"); zassert_equal(ret, 0, "string should have matched"); - ret = string_copy("this is a kernel string"); + ret = string_copy("this is a kernel string", (int)id); zassert_equal(ret, 0, "string should have matched"); ret = to_copy(buf); diff --git a/tests/kernel/mem_protect/syscalls/src/test_syscalls.h b/tests/kernel/mem_protect/syscalls/src/test_syscalls.h index 88f2c8e29f6..bb58ee731a2 100644 --- a/tests/kernel/mem_protect/syscalls/src/test_syscalls.h +++ b/tests/kernel/mem_protect/syscalls/src/test_syscalls.h @@ -10,7 +10,7 @@ __syscall int string_alloc_copy(char *src); -__syscall int string_copy(char *src); +__syscall int string_copy(char *src, int id); __syscall int to_copy(char *dest);