about summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux/or1k/getcontext.S
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux/or1k/getcontext.S')
-rw-r--r--sysdeps/unix/sysv/linux/or1k/getcontext.S69
1 files changed, 24 insertions, 45 deletions
diff --git a/sysdeps/unix/sysv/linux/or1k/getcontext.S b/sysdeps/unix/sysv/linux/or1k/getcontext.S
index a25b377bda..da69e6999c 100644
--- a/sysdeps/unix/sysv/linux/or1k/getcontext.S
+++ b/sysdeps/unix/sysv/linux/or1k/getcontext.S
@@ -17,56 +17,35 @@
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <shlib-compat.h>
 #include "ucontext_i.h"
 
-/* int getcontext (ucontext_t *ucp)
+#define __CONTEXT_FUNC_NAME __getcontext
+#define __CONTEXT_ENABLE_FPCSR 1
+#define __CONTEXT_SIGMASK_OFFSET UCONTEXT_SIGMASK
 
-   Returns 0 on success -1 and errno on failure.
- */
-	.text
-ENTRY(__getcontext)
-	/* Store r1, the stack pointer.  */
-	l.sw	(UCONTEXT_MCONTEXT +  1*4)(r3), r1
-	/* Store r2, the frame pointer.  */
-	l.sw	(UCONTEXT_MCONTEXT +  2*4)(r3), r2
-	/* Store r9, the link register.  */
-	l.sw	(UCONTEXT_MCONTEXT +  9*4)(r3), r9
-	/* Store r9 to reg[11] too, as we need two links for makecontext.  */
-	l.sw	(UCONTEXT_MCONTEXT + 11*4)(r3), r9
-	/* Store r10, the TLS register.  */
-	l.sw	(UCONTEXT_MCONTEXT + 10*4)(r3), r10
-	/* Store r14-r30 even, callee saved registers.  */
-	l.sw	(UCONTEXT_MCONTEXT + 14*4)(r3), r14
-	l.sw	(UCONTEXT_MCONTEXT + 16*4)(r3), r16
-	l.sw	(UCONTEXT_MCONTEXT + 18*4)(r3), r18
-	l.sw	(UCONTEXT_MCONTEXT + 20*4)(r3), r20
-	l.sw	(UCONTEXT_MCONTEXT + 22*4)(r3), r22
-	l.sw	(UCONTEXT_MCONTEXT + 24*4)(r3), r24
-	l.sw	(UCONTEXT_MCONTEXT + 26*4)(r3), r26
-	l.sw	(UCONTEXT_MCONTEXT + 28*4)(r3), r28
-	l.sw	(UCONTEXT_MCONTEXT + 30*4)(r3), r30
+#include "getcontext-common.S"
 
-	/* Get signal mask.  */
-	/* rt_sigprocmask (SIG_BLOCK, NULL, &ucp->uc_sigmask, _NSIG8) */
-	l.ori	r6, r0, _NSIG8
-	l.addi	r5, r3, UCONTEXT_SIGMASK
-	l.ori	r4, r0, 0
-	l.ori	r3, r0, SIG_BLOCK
-	l.ori	r11, r0, SYS_ify (rt_sigprocmask)
-	/* Do the syscall.  */
-	l.sys	1
-	 l.nop
+versioned_symbol (libc, __getcontext, getcontext, GLIBC_2_40)
 
-	/* if -4096 < ret < 0 holds, it's an error */
-	l.sfgeui r11, 0xf001
-	l.bf	1f
-	 l.nop
+#if SHLIB_COMPAT (libc, GLIBC_2_35, GLIBC_2_40)
 
-	l.jr	r9
-	 l.ori r11, r0, 0
+/* Define a compat version of getcontext for glibc's before the fpcsr
+   field was added to mcontext_t.  The offset sigmask changed with this
+   introduction, the change was done because glibc's definition of
+   ucontext_t was initially defined incompatible with the Linux
+   definition of ucontext_t.  We keep the compatability definition to
+   allow getcontext, setcontext and swapcontext to work in older
+   binaries.  */
 
-1:	l.j	__syscall_error
-	 l.ori	r3, r11, 0
+# undef __CONTEXT_FUNC_NAME
+# undef __CONTEXT_ENABLE_FPCSR
+# undef __CONTEXT_SIGMASK_OFFSET
+# define __CONTEXT_FUNC_NAME __getcontext_nofpcsr
+# define __CONTEXT_SIGMASK_OFFSET (UCONTEXT_SIGMASK - 4)
 
-END(__getcontext)
-weak_alias(__getcontext, getcontext)
+# include "getcontext-common.S"
+
+compat_symbol (libc, __getcontext_nofpcsr, getcontext, GLIBC_2_35)
+
+#endif