aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv/linux/sparc/sparc64/getcontext.S
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux/sparc/sparc64/getcontext.S')
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/getcontext.S40
1 files changed, 37 insertions, 3 deletions
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/getcontext.S b/sysdeps/unix/sysv/linux/sparc/sparc64/getcontext.S
index 05b06269e4..457f07448c 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/getcontext.S
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/getcontext.S
@@ -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
@@ -17,13 +17,47 @@
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)