(__getcontext): Save uc_link around trap. Copy __uc_sigmask into first word of
authordrepper <drepper>
Thu, 19 Apr 2001 16:28:25 +0000 (16:28 +0000)
committerdrepper <drepper>
Thu, 19 Apr 2001 16:28:25 +0000 (16:28 +0000)
uc_sigmask, clear the rest. Make sure setcontext to the created
context doesn't do this though.

sysdeps/unix/sysv/linux/sparc/sparc64/getcontext.S

index 05b0626..457f074 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 2001 Free Software Foundation, Inc.
    Contributed by Richard Henderson (rth@tamu.edu).
 
    The GNU C Library is free software; you can redistribute it and/or
    Boston, MA 02111-1307, USA.  */
 
 #include <sysdep.h>
+#include "ucontext_i.h"
 
-/* void getcontext(ucontext_t *); */
+/* int getcontext(ucontext_t *); */
 
 ENTRY(__getcontext)
 
+       ldx     [%o0 + UC_LINK], %o1    /* Preserve uc_link field, the
+                                          trap clears it.  */
        ta      0x6e
-       ret
+1:
+       ldx     [%o0 + UC_M_PC], %o2
+       ldx     [%o0 + UC_M_NPC], %o3
+       ldx     [%o0 + __UC_SIGMASK], %o4
+       stx     %o1, [%o0 + UC_LINK]
+       add     %o2, 2f - 1b, %o2
+       stx     %o2, [%o0 + UC_M_PC]
+       add     %o3, 2f - 1b, %o3
+       stx     %o3, [%o0 + UC_M_NPC]
+#if SIGMASK_WORDS == 16
+       stx     %o4, [%o0 + UC_SIGMASK]
+       stx     %g0, [%o0 + UC_SIGMASK + 8]
+       stx     %g0, [%o0 + UC_SIGMASK + 16]
+       stx     %g0, [%o0 + UC_SIGMASK + 24]
+       stx     %g0, [%o0 + UC_SIGMASK + 32]
+       stx     %g0, [%o0 + UC_SIGMASK + 40]
+       stx     %g0, [%o0 + UC_SIGMASK + 48]
+       stx     %g0, [%o0 + UC_SIGMASK + 56]
+       stx     %g0, [%o0 + UC_SIGMASK + 64]
+       stx     %g0, [%o0 + UC_SIGMASK + 72]
+       stx     %g0, [%o0 + UC_SIGMASK + 80]
+       stx     %g0, [%o0 + UC_SIGMASK + 88]
+       stx     %g0, [%o0 + UC_SIGMASK + 96]
+       stx     %g0, [%o0 + UC_SIGMASK + 104]
+       stx     %g0, [%o0 + UC_SIGMASK + 112]
+       stx     %g0, [%o0 + UC_SIGMASK + 120]
+#else
+# error Adjust __getcontext
+#endif
+2:
+       retl
+        clr    %o0
 
 END(__getcontext)