From c25fa96a68c3ff9ca760eeb34849089869342329 Mon Sep 17 00:00:00 2001 From: Daniel Leung Date: Wed, 31 Jul 2024 11:46:07 -0700 Subject: [PATCH] x86: only set psp pointer for thread stacks Only set the privileged stack pointer for thread stacks, but nullify the pointer for kernel-only stacks, as these stacks do not have the reserved space. The psp pointer may point to arbitrary memory in this case if stack is not big enough. Signed-off-by: Daniel Leung --- arch/x86/core/userspace.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/arch/x86/core/userspace.c b/arch/x86/core/userspace.c index dbe40b2bda0..2434e67ea13 100644 --- a/arch/x86/core/userspace.c +++ b/arch/x86/core/userspace.c @@ -70,15 +70,18 @@ void *z_x86_userspace_prepare_thread(struct k_thread *thread) { void *initial_entry; - struct z_x86_thread_stack_header *header = + if (z_stack_is_user_capable(thread->stack_obj)) { + struct z_x86_thread_stack_header *header = #ifdef CONFIG_THREAD_STACK_MEM_MAPPED - (struct z_x86_thread_stack_header *)thread->stack_info.mapped.addr; + (struct z_x86_thread_stack_header *)thread->stack_info.mapped.addr; #else - (struct z_x86_thread_stack_header *)thread->stack_obj; + (struct z_x86_thread_stack_header *)thread->stack_obj; #endif /* CONFIG_THREAD_STACK_MEM_MAPPED */ - thread->arch.psp = - header->privilege_stack + sizeof(header->privilege_stack); + thread->arch.psp = header->privilege_stack + sizeof(header->privilege_stack); + } else { + thread->arch.psp = NULL; + } #ifndef CONFIG_X86_COMMON_PAGE_TABLE /* Important this gets cleared, so that arch_mem_domain_* APIs