__sigreturn2 uses _hurd_sigstate_unlock after restoring the interrupted
xmm values, we thus need it not to touch xmm. It makes sense to inline
sigstate_is_global_rcv _hurd_sigstate_lock/unlock anyway. unlock calls
gsync_wake, so we need to avoid xmm there as well.
---
 hurd/hurdsig.c                     | 38 ++++--------------------------
 sysdeps/hurd/include/hurd/signal.h | 34 ++++++++++++++++++++++++++
 sysdeps/mach/hurd/x86/Makefile     |  1 +
 3 files changed, 40 insertions(+), 33 deletions(-)

diff --git a/hurd/hurdsig.c b/hurd/hurdsig.c
index 2b2b57ac0d..91e664d0f1 100644
--- a/hurd/hurdsig.c
+++ b/hurd/hurdsig.c
@@ -168,6 +168,7 @@ _hurd_sigstate_delete (thread_t thread)
       free (ss);
     }
 }
+libc_hidden_def (_hurd_sigstate_delete)
 
 /* Make SS a global receiver, with pthread signal semantics.  */
 void
@@ -178,42 +179,13 @@ _hurd_sigstate_set_global_rcv (struct hurd_sigstate *ss)
 }
 libc_hidden_def (_hurd_sigstate_set_global_rcv)
 
-/* Check whether SS is a global receiver.  */
-static int
-sigstate_is_global_rcv (const struct hurd_sigstate *ss)
-{
-  return (_hurd_global_sigstate != NULL)
-        && (ss->actions[0].sa_handler == SIG_IGN);
-}
-libc_hidden_def (_hurd_sigstate_delete)
-
-/* Lock/unlock a hurd_sigstate structure.  If the accessors below require
-   it, the global sigstate will be locked as well.  */
-void
-_hurd_sigstate_lock (struct hurd_sigstate *ss)
-{
-  if (sigstate_is_global_rcv (ss))
-    __spin_lock (&_hurd_global_sigstate->lock);
-  __spin_lock (&ss->lock);
-}
-libc_hidden_def (_hurd_sigstate_lock)
-
-void
-_hurd_sigstate_unlock (struct hurd_sigstate *ss)
-{
-  __spin_unlock (&ss->lock);
-  if (sigstate_is_global_rcv (ss))
-    __spin_unlock (&_hurd_global_sigstate->lock);
-}
-libc_hidden_def (_hurd_sigstate_unlock)
-
 /* Retrieve a thread's full set of pending signals, including the global
    ones if appropriate.  SS must be locked.  */
 sigset_t
 _hurd_sigstate_pending (const struct hurd_sigstate *ss)
 {
   sigset_t pending = ss->pending;
-  if (sigstate_is_global_rcv (ss))
+  if (_hurd_sigstate_is_global_rcv (ss))
     __sigorset (&pending, &pending, &_hurd_global_sigstate->pending);
   return pending;
 }
@@ -225,7 +197,7 @@ libc_hidden_def (_hurd_sigstate_pending)
 static struct hurd_signal_detail
 sigstate_clear_pending (struct hurd_sigstate *ss, int signo)
 {
-  if (sigstate_is_global_rcv (ss)
+  if (_hurd_sigstate_is_global_rcv (ss)
       && __sigismember (&_hurd_global_sigstate->pending, signo))
     {
       __sigdelset (&_hurd_global_sigstate->pending, signo);
@@ -241,7 +213,7 @@ sigstate_clear_pending (struct hurd_sigstate *ss, int signo)
 struct sigaction *
 _hurd_sigstate_actions (struct hurd_sigstate *ss)
 {
-  if (sigstate_is_global_rcv (ss))
+  if (_hurd_sigstate_is_global_rcv (ss))
     return _hurd_global_sigstate->actions;
   else
     return ss->actions;
@@ -746,7 +718,7 @@ post_signal (struct hurd_sigstate *ss,
     __mutex_lock (&_hurd_siglock);
     for (rss = _hurd_sigstates; rss != NULL; rss = rss->next)
       {
-       if (! sigstate_is_global_rcv (rss))
+       if (! _hurd_sigstate_is_global_rcv (rss))
          continue;
 
        /* The global sigstate is already locked.  */
diff --git a/sysdeps/hurd/include/hurd/signal.h 
b/sysdeps/hurd/include/hurd/signal.h
index a7b157dd9c..4d94b5ab82 100644
--- a/sysdeps/hurd/include/hurd/signal.h
+++ b/sysdeps/hurd/include/hurd/signal.h
@@ -6,6 +6,8 @@ extern struct hurd_sigstate *_hurd_self_sigstate (void) 
__attribute__ ((__const_
 libc_hidden_proto (_hurd_self_sigstate)
 #endif
 
+extern int _hurd_sigstate_is_global_rcv (const struct hurd_sigstate *ss);
+
 #include_next <hurd/signal.h>
 
 #ifndef _ISOMAC
@@ -66,6 +68,16 @@ _hurd_critical_section_lock (void)
   return ss;
 }
 
+/* Check whether SS is a global receiver.  */
+_HURD_SIGNAL_H_EXTERN_INLINE int
+_hurd_sigstate_is_global_rcv (const struct hurd_sigstate *ss)
+{
+  extern struct hurd_sigstate *_hurd_global_sigstate;
+
+  return (_hurd_global_sigstate != NULL)
+        && (ss->actions[0].sa_handler == SIG_IGN);
+}
+
 _HURD_SIGNAL_H_EXTERN_INLINE void
 _hurd_critical_section_unlock (void *our_lock)
 {
@@ -88,6 +100,24 @@ _hurd_critical_section_unlock (void *our_lock)
        __msg_sig_post (_hurd_msgport, 0, 0, __mach_task_self ());
     }
 }
+
+/* Lock/unlock a hurd_sigstate structure.  If the accessors below require
+   it, the global sigstate will be locked as well.  */
+_HURD_SIGNAL_H_EXTERN_INLINE void
+_hurd_sigstate_lock (struct hurd_sigstate *ss)
+{
+  if (_hurd_sigstate_is_global_rcv (ss))
+    __spin_lock (&_hurd_global_sigstate->lock);
+  __spin_lock (&ss->lock);
+}
+
+_HURD_SIGNAL_H_EXTERN_INLINE void
+_hurd_sigstate_unlock (struct hurd_sigstate *ss)
+{
+  __spin_unlock (&ss->lock);
+  if (_hurd_sigstate_is_global_rcv (ss))
+    __spin_unlock (&_hurd_global_sigstate->lock);
+}
 #endif /* defined __USE_EXTERN_INLINES && IS_IN (libc) */
 
 
@@ -96,6 +126,7 @@ libc_hidden_proto (_hurd_intr_rpc_mach_msg)
 libc_hidden_proto (_hurd_thread_sigstate)
 libc_hidden_proto (_hurd_raise_signal)
 libc_hidden_proto (_hurd_sigstate_set_global_rcv)
+libc_hidden_proto (_hurd_sigstate_is_global_rcv)
 libc_hidden_proto (_hurd_sigstate_lock)
 libc_hidden_proto (_hurd_sigstate_pending)
 libc_hidden_proto (_hurd_sigstate_unlock)
@@ -103,5 +134,8 @@ libc_hidden_proto (_hurd_sigstate_delete)
 #endif
 #ifdef _HURD_SIGNAL_H_HIDDEN_DEF
 libc_hidden_def (_hurd_self_sigstate)
+libc_hidden_def (_hurd_sigstate_is_global_rcv)
+libc_hidden_def (_hurd_sigstate_lock)
+libc_hidden_def (_hurd_sigstate_unlock)
 #endif
 #endif
diff --git a/sysdeps/mach/hurd/x86/Makefile b/sysdeps/mach/hurd/x86/Makefile
index 27c4b06590..97e3287c87 100644
--- a/sysdeps/mach/hurd/x86/Makefile
+++ b/sysdeps/mach/hurd/x86/Makefile
@@ -18,4 +18,5 @@ endif
 ifeq ($(subdir),mach)
 # Avoid SSE&MMX to avoid __sigreturn2 thrashing it
 CFLAGS-RPC_mach_port_mod_refs.c = -mno-sse -mno-mmx
+CFLAGS-RPC_gsync_wake.c = -mno-sse -mno-mmx
 endif
-- 
2.51.0


Reply via email to