From 8f6314a8644901acdf3efe558cd7f54a483d752a Mon Sep 17 00:00:00 2001 From: p-szafonimateusz Date: Fri, 30 Aug 2024 11:36:32 +0200 Subject: [PATCH 1/3] arch/x86_64/intel64/intel64_head.S: move initial RSP for AP cores below regs area move initial RSP for AP cores below regs area. otherwise IDLE thread for AP cores can be corrupted XCP region now match regs allocation in up_initial_state() Signed-off-by: p-szafonimateusz --- arch/x86_64/src/intel64/intel64_head.S | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/arch/x86_64/src/intel64/intel64_head.S b/arch/x86_64/src/intel64/intel64_head.S index 9b0cf93705e24..488f487fa697d 100644 --- a/arch/x86_64/src/intel64/intel64_head.S +++ b/arch/x86_64/src/intel64/intel64_head.S @@ -392,6 +392,10 @@ ap_start: add %rax, %rbx mov (%rbx), %rsp + /* Move initial RSP below IDLE TCB regs */ + sub $XCPTCONTEXT_SIZE, %rsp + and $(~XCPTCONTEXT_SIZE), %rsp + /* Jump to ap_start routine */ movabs $x86_64_ap_boot, %rbx jmp *%rbx From e2e13b6977f129a28446273326af1f13a71dcb46 Mon Sep 17 00:00:00 2001 From: p-szafonimateusz Date: Fri, 30 Aug 2024 11:38:08 +0200 Subject: [PATCH 2/3] arch/x86_64/intel64/intel64_cpuidlestack.c: stack_alloc should point to stack base not stack top stack_alloc should point to stack base not stack top Signed-off-by: p-szafonimateusz --- arch/x86_64/src/intel64/intel64_cpuidlestack.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/x86_64/src/intel64/intel64_cpuidlestack.c b/arch/x86_64/src/intel64/intel64_cpuidlestack.c index 05d8771b43c28..e9aec20395628 100644 --- a/arch/x86_64/src/intel64/intel64_cpuidlestack.c +++ b/arch/x86_64/src/intel64/intel64_cpuidlestack.c @@ -88,7 +88,8 @@ int up_cpu_idlestack(int cpu, struct tcb_s *tcb, size_t stack_size) /* Get the top of the stack */ - stack_alloc = (uintptr_t)g_idle_topstack[cpu]; + stack_alloc = (uintptr_t)g_idle_topstack[cpu] - + CONFIG_IDLETHREAD_STACKSIZE; tcb->adj_stack_size = stack_size - 8; tcb->stack_alloc_ptr = (void *)stack_alloc; tcb->stack_base_ptr = tcb->stack_alloc_ptr; From 051a6bc6d9fee944f252314a2b09c19449d38035 Mon Sep 17 00:00:00 2001 From: p-szafonimateusz Date: Thu, 22 Aug 2024 10:36:05 +0200 Subject: [PATCH 3/3] arch/x86_64/intel64/intel64_schedulesigaction.c: properly align signal handler stack for vector operations signal handler stack must be properly aligned, otherwise vector instructions doesn't work in signal handler Signed-off-by: p-szafonimateusz --- arch/x86_64/src/intel64/intel64_schedulesigaction.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/arch/x86_64/src/intel64/intel64_schedulesigaction.c b/arch/x86_64/src/intel64/intel64_schedulesigaction.c index 0763b2cab5bf8..d846ed3798a73 100644 --- a/arch/x86_64/src/intel64/intel64_schedulesigaction.c +++ b/arch/x86_64/src/intel64/intel64_schedulesigaction.c @@ -130,6 +130,7 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver) */ up_current_regs()[REG_RIP] = (uint64_t)x86_64_sigdeliver; + up_current_regs()[REG_RSP] = up_current_regs()[REG_RSP] - 8; up_current_regs()[REG_RFLAGS] = 0; /* And make sure that the saved context in the TCB @@ -162,6 +163,7 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver) */ tcb->xcp.regs[REG_RIP] = (uint64_t)x86_64_sigdeliver; + tcb->xcp.regs[REG_RSP] = tcb->xcp.regs[REG_RSP] - 8; tcb->xcp.regs[REG_RFLAGS] = 0; } } @@ -242,6 +244,7 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver) */ tcb->xcp.regs[REG_RIP] = (uint64_t)x86_64_sigdeliver; + tcb->xcp.regs[REG_RSP] = tcb->xcp.regs[REG_RSP] - 8; tcb->xcp.regs[REG_RFLAGS] = 0; } else @@ -261,7 +264,10 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver) * disabled */ - up_current_regs()[REG_RIP] = (uint64_t)x86_64_sigdeliver; + up_current_regs()[REG_RIP] = + (uint64_t)x86_64_sigdeliver; + up_current_regs()[REG_RSP] = + up_current_regs()[REG_RSP] - 8; up_current_regs()[REG_RFLAGS] = 0; /* And make sure that the saved context in the TCB @@ -308,6 +314,7 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver) */ tcb->xcp.regs[REG_RIP] = (uint64_t)x86_64_sigdeliver; + tcb->xcp.regs[REG_RSP] = tcb->xcp.regs[REG_RSP] - 8; tcb->xcp.regs[REG_RFLAGS] = 0; } }