From a770ff20174c4d8fdcf60f8147f768d65a367292 Mon Sep 17 00:00:00 2001 From: "chao.an" Date: Fri, 18 Mar 2022 21:54:01 +0800 Subject: [PATCH] arm/vfork: update the SP to stack top Signed-off-by: chao.an --- arch/arm/src/common/arm_vfork.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/arch/arm/src/common/arm_vfork.c b/arch/arm/src/common/arm_vfork.c index f265aaf51bf..edad4cc2a4e 100644 --- a/arch/arm/src/common/arm_vfork.c +++ b/arch/arm/src/common/arm_vfork.c @@ -137,10 +137,18 @@ pid_t up_vfork(const struct vfork_s *context) * effort is overkill. */ - newtop = STACK_ALIGN_DOWN((uint32_t)child->cmn.stack_base_ptr + - child->cmn.adj_stack_size - - XCPTCONTEXT_SIZE); + newtop = (uint32_t)child->cmn.stack_base_ptr + + child->cmn.adj_stack_size; + newsp = newtop - stackutil; + + /* Move the register context to newtop. */ + + memcpy((void *)(newsp - XCPTCONTEXT_SIZE), + child->cmn.xcp.regs, XCPTCONTEXT_SIZE); + + child->cmn.xcp.regs = (void *)(newsp - XCPTCONTEXT_SIZE); + memcpy((void *)newsp, (const void *)context->sp, stackutil); /* Was there a frame pointer in place before? */