This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch releases/12.7
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit fad423292559a8894e9e169924067f131c92e900
Author: p-szafonimateusz <[email protected]>
AuthorDate: Thu Aug 22 10:36:05 2024 +0200

    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 <[email protected]>
---
 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 0763b2cab5..d846ed3798 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;
         }
     }

Reply via email to