summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/sparc64/getcontext.S
diff options
context:
space:
mode:
authorWaldemar Brodkorb <wbx@openadk.org>2017-05-24 20:49:02 +0200
committerWaldemar Brodkorb <wbx@openadk.org>2017-06-23 23:46:04 +0200
commit041cdc2769407c4d3869b218ad7ee7638e1c306e (patch)
tree1ea25250d74dcb230cf5feee99226fc080dbd678 /libc/sysdeps/linux/sparc64/getcontext.S
parent58a5ba12bffad5916d9897c2870fc483f1db8282 (diff)
sparc64: add basic support
No NPTL, no LDSO support. Bootup with Busybox Ash in Qemu working. Testuite shows only two failures, but mksh continue/break support doesn't work.
Diffstat (limited to 'libc/sysdeps/linux/sparc64/getcontext.S')
-rw-r--r--libc/sysdeps/linux/sparc64/getcontext.S63
1 files changed, 63 insertions, 0 deletions
diff --git a/libc/sysdeps/linux/sparc64/getcontext.S b/libc/sysdeps/linux/sparc64/getcontext.S
new file mode 100644
index 000000000..44b716d6a
--- /dev/null
+++ b/libc/sysdeps/linux/sparc64/getcontext.S
@@ -0,0 +1,63 @@
+/* Copyright (C) 1997-2017 Free Software Foundation, Inc.
+ Contributed by Richard Henderson (rth@tamu.edu).
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <sysdep.h>
+#include "ucontext_i.h"
+
+/* int getcontext(ucontext_t *); */
+
+ENTRY(__getcontext)
+
+ ldx [%o0 + UC_LINK], %o1 /* Preserve uc_link field, the
+ trap clears it. */
+ ta 0x6e
+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)
+
+weak_alias (__getcontext, getcontext)