From 298c2e5e4fb46f5ffa7de7bbc5a32a9da0663768 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Wed, 29 Jan 2020 03:26:43 +0900 Subject: [PATCH] sim: Fix stack alignment The recent x86-64 convention requires 16-byte alignment before (not after) calling a function. This fixes snprintf crash I observed on macOS while saving XMM registers. --- arch/sim/src/sim/up_initialstate.c | 2 +- arch/sim/src/sim/up_stackframe.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/sim/src/sim/up_initialstate.c b/arch/sim/src/sim/up_initialstate.c index 3ddb1128d7..129d3be8ee 100644 --- a/arch/sim/src/sim/up_initialstate.c +++ b/arch/sim/src/sim/up_initialstate.c @@ -67,6 +67,6 @@ void up_initial_state(struct tcb_s *tcb) { memset(&tcb->xcp, 0, sizeof(struct xcptcontext)); - tcb->xcp.regs[JB_SP] = (xcpt_reg_t)tcb->adj_stack_ptr; + tcb->xcp.regs[JB_SP] = (xcpt_reg_t)tcb->adj_stack_ptr - sizeof(xcpt_reg_t); tcb->xcp.regs[JB_PC] = (xcpt_reg_t)tcb->start; } diff --git a/arch/sim/src/sim/up_stackframe.c b/arch/sim/src/sim/up_stackframe.c index eecb3668af..887de5c703 100644 --- a/arch/sim/src/sim/up_stackframe.c +++ b/arch/sim/src/sim/up_stackframe.c @@ -124,7 +124,7 @@ FAR void *up_stack_frame(FAR struct tcb_s *tcb, size_t frame_size) /* Reset the initial state */ - tcb->xcp.regs[JB_SP] = (xcpt_reg_t)tcb->adj_stack_ptr; + tcb->xcp.regs[JB_SP] = (xcpt_reg_t)tcb->adj_stack_ptr - sizeof(xcpt_reg_t); /* And return a pointer to the allocated memory */