When cancelling a thread, __pthread_do_cancel forces calling call_exit,
but we need to align down the stack, so any further SSE use can work.
---
 sysdeps/mach/hurd/x86_64/htl/pt-machdep.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/sysdeps/mach/hurd/x86_64/htl/pt-machdep.c 
b/sysdeps/mach/hurd/x86_64/htl/pt-machdep.c
index 2cb0ce9838..e11a1f994b 100644
--- a/sysdeps/mach/hurd/x86_64/htl/pt-machdep.c
+++ b/sysdeps/mach/hurd/x86_64/htl/pt-machdep.c
@@ -24,6 +24,7 @@
 #include <mach/x86_64/mach_i386.h>
 #include <mach/mig_errors.h>
 #include <mach/thread_status.h>
+#include <thread_state.h>
 #include <pt-sysdep.h>
 
 int
@@ -48,7 +49,11 @@ __thread_set_pcsptp (thread_t thread,
   if (set_sp)
     state.ursp = (uintptr_t) sp;
   if (set_ip)
-    state.rip = (uintptr_t) ip;
+    {
+      /* Making it call something else, we have to re-align the stack for SSE. 
 */
+      state.ursp = PTR_ALIGN_DOWN_8_16 (state.ursp);
+      state.rip = (uintptr_t) ip;
+    }
 
   err = __thread_set_state (thread, i386_REGS_SEGS_STATE,
                             (thread_state_t) &state, i386_THREAD_STATE_COUNT);
-- 
2.51.0


Reply via email to