diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux/or1k/swapcontext.S')
-rw-r--r-- | sysdeps/unix/sysv/linux/or1k/swapcontext.S | 109 |
1 files changed, 22 insertions, 87 deletions
diff --git a/sysdeps/unix/sysv/linux/or1k/swapcontext.S b/sysdeps/unix/sysv/linux/or1k/swapcontext.S index d09651a5b2..861c1e26ba 100644 --- a/sysdeps/unix/sysv/linux/or1k/swapcontext.S +++ b/sysdeps/unix/sysv/linux/or1k/swapcontext.S @@ -16,101 +16,36 @@ License along with the GNU C Library; if not, see <https://www.gnu.org/licenses/>. */ +#include <shlib-compat.h> #include <sysdep.h> #include "ucontext_i.h" -/* int swapcontext (ucontext_t *oucp, const ucontext_t *ucp) */ - .text -ENTRY(__swapcontext) +#define __CONTEXT_FUNC_NAME __swapcontext +#define __CONTEXT_ENABLE_FPCSR 1 +#define __CONTEXT_SIGMASK_OFFSET UCONTEXT_SIGMASK - /* Same as 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 "swapcontext-common.S" - /* Store ucp to non-argument syscall preserved register. */ - l.ori r30, r4, 0 +versioned_symbol (libc, __swapcontext, swapcontext, GLIBC_2_40) - /* 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 +#if SHLIB_COMPAT (libc, GLIBC_2_35, GLIBC_2_40) - /* if -4096 < ret < 0 holds, it's an error */ - l.sfgeui r11, 0xf001 - l.bf 1f - l.nop +/* Define a compat version of swapcontext 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. */ - /* Same as setcontext. */ +# undef __CONTEXT_FUNC_NAME +# undef __CONTEXT_ENABLE_FPCSR +# undef __CONTEXT_SIGMASK_OFFSET +# define __CONTEXT_FUNC_NAME __swapcontext_nofpcsr +# define __CONTEXT_SIGMASK_OFFSET (UCONTEXT_SIGMASK - 4) - /* Restore signal mask. */ - /* rt_sigprocmask (SIG_SETMASK, &ucp->uc_sigmask, NULL, _NSIG8) */ - l.ori r6, r0, _NSIG8 - l.ori r5, r0, 0 - l.addi r4, r30, UCONTEXT_SIGMASK - l.ori r3, r0, SIG_SETMASK - l.ori r11, r0, SYS_ify (rt_sigprocmask) - /* Do the syscall. */ - l.sys 1 - l.nop +# include "swapcontext-common.S" - /* if -4096 < ret < 0 holds, it's an error */ - l.sfgeui r11, 0xf001 - l.bf 1f - l.nop +compat_symbol (libc, __swapcontext_nofpcsr, swapcontext, GLIBC_2_35) - /* Restore argument registers, for the makecontext case. */ - l.lwz r3, (UCONTEXT_MCONTEXT + 3*4)(r30) - l.lwz r4, (UCONTEXT_MCONTEXT + 4*4)(r30) - l.lwz r5, (UCONTEXT_MCONTEXT + 5*4)(r30) - l.lwz r6, (UCONTEXT_MCONTEXT + 6*4)(r30) - l.lwz r7, (UCONTEXT_MCONTEXT + 7*4)(r30) - l.lwz r8, (UCONTEXT_MCONTEXT + 8*4)(r30) - - /* Restore registers stored in getcontext. */ - l.lwz r1, (UCONTEXT_MCONTEXT + 1*4)(r30) - l.lwz r2, (UCONTEXT_MCONTEXT + 2*4)(r30) - l.lwz r9, (UCONTEXT_MCONTEXT + 9*4)(r30) - l.lwz r10, (UCONTEXT_MCONTEXT + 10*4)(r30) - l.lwz r11, (UCONTEXT_MCONTEXT + 11*4)(r30) - l.lwz r14, (UCONTEXT_MCONTEXT + 14*4)(r30) - l.lwz r16, (UCONTEXT_MCONTEXT + 16*4)(r30) - l.lwz r18, (UCONTEXT_MCONTEXT + 18*4)(r30) - l.lwz r20, (UCONTEXT_MCONTEXT + 20*4)(r30) - l.lwz r22, (UCONTEXT_MCONTEXT + 22*4)(r30) - l.lwz r24, (UCONTEXT_MCONTEXT + 24*4)(r30) - l.lwz r26, (UCONTEXT_MCONTEXT + 26*4)(r30) - l.lwz r28, (UCONTEXT_MCONTEXT + 28*4)(r30) - l.lwz r30, (UCONTEXT_MCONTEXT + 30*4)(r30) - - l.jr r11 - l.ori r11, r0, 0 - -1: l.j __syscall_error - l.ori r3, r11, 0 - -END (__swapcontext) -weak_alias (__swapcontext, swapcontext) +#endif |