diff options
author | Jakub Jelinek <jakub@redhat.com> | 2008-05-05 09:34:18 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2008-05-05 09:34:18 +0000 |
commit | a86a7a3946738554b473c3d3501e6e23ee6ee8e8 (patch) | |
tree | f9744f9ca105433a7575a28b77e7eff292fd5785 | |
parent | 4ce349e5599dd02c81fb860ecc908ec9109cc668 (diff) | |
download | glibc-a86a7a3946738554b473c3d3501e6e23ee6ee8e8.tar glibc-a86a7a3946738554b473c3d3501e6e23ee6ee8e8.tar.gz glibc-a86a7a3946738554b473c3d3501e6e23ee6ee8e8.tar.bz2 glibc-a86a7a3946738554b473c3d3501e6e23ee6ee8e8.zip |
* sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym: New file.
* sysdeps/unix/sysv/linux/sparc/sparc32/Makefile [$(subdir) = stdlib]:
(gen-as-const-headers): Add it.
* sysdeps/unix/sysv/linux/sparc/sparc32/getcontext.S: New file.
* sysdeps/unix/sysv/linux/sparc/sparc32/makecontext.c: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc32/setcontext.S: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc32/swapcontext.S: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym: New file.
* sysdeps/unix/sysv/linux/sparc/sparc32/Makefile [$(subdir) = stdlib]:
(gen-as-const-headers): Add it.
* sysdeps/unix/sysv/linux/sparc/sparc32/getcontext.S: New file.
* sysdeps/unix/sysv/linux/sparc/sparc32/makecontext.c: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc32/setcontext.S: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc32/swapcontext.S: Likewise.
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/sparc32/Makefile | 4 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/sparc32/getcontext.S | 85 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/sparc32/makecontext.c | 93 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/sparc32/setcontext.S | 119 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/sparc32/swapcontext.S | 119 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym | 61 |
7 files changed, 489 insertions, 0 deletions
@@ -1,5 +1,13 @@ 2008-05-01 David S. Miller <davem@davemloft.net> + * sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym: New file. + * sysdeps/unix/sysv/linux/sparc/sparc32/Makefile [$(subdir) = stdlib]: + (gen-as-const-headers): Add it. + * sysdeps/unix/sysv/linux/sparc/sparc32/getcontext.S: New file. + * sysdeps/unix/sysv/linux/sparc/sparc32/makecontext.c: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc32/setcontext.S: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc32/swapcontext.S: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc32/syscall.S: Add support for six system call parameters. * sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S: Likewise. diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/Makefile b/sysdeps/unix/sysv/linux/sparc/sparc32/Makefile index cd1b3fb793..8f7e76be2a 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/Makefile +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/Makefile @@ -2,6 +2,10 @@ asm-CPPFLAGS = -D__ASSEMBLY__ ASFLAGS-.os += -fPIC LD += -melf32_sparc +ifeq ($(subdir),stdlib) +gen-as-const-headers += ucontext_i.sym +endif + # When I get this to work, this is the right thing ifeq ($(subdir),elf) CFLAGS-rtld.c += -mcpu=v8 diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/getcontext.S b/sysdeps/unix/sysv/linux/sparc/sparc32/getcontext.S new file mode 100644 index 0000000000..f8664a7975 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/getcontext.S @@ -0,0 +1,85 @@ +/* Save current context. + Copyright (C) 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by David S. Miller <davem@davemloft.net>, 2008. + + 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, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> + +#include "ucontext_i.h" + +/* int __getcontext (ucontext_t *ucp) + + Saves the machine context in UCP such that when it is activated, + it appears as if __getcontext() returned again. + + This implementation is intended to be used for *synchronous* context + switches only. Therefore, it does not have to save anything + other than the PRESERVED state. */ + + +ENTRY(__getcontext) + save %sp, -112, %sp + st %g0, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_PSR] + + /* In reality, we only use the GREG_PC value when setting + or swapping contexts. But we fill in NPC for completeness. */ + add %i7, 8, %o0 + st %o0, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_PC] + add %o0, 4, %o0 + st %o0, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_NPC] + + rd %y, %o1 + st %o1, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_Y] + + st %g1, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G1] + st %g2, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G2] + st %g3, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G3] + st %g4, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G4] + st %g5, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G5] + st %g6, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G6] + st %g7, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G7] + + mov SIG_BLOCK, %o0 + clr %o1 + add %i0, UC_SIGMASK, %o2 + mov 8, %o3 + mov __NR_rt_sigprocmask, %g1 + ta 0x10 + + /* Zero, success, return value. */ + st %g0, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O0] + st %i1, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O1] + st %i2, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O2] + st %i3, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O3] + st %i4, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O4] + st %i5, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O5] + st %i6, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O6] + st %i7, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O7] + + st %g0, [%i0 + UC_MCONTEXT + MC_GWINS] + + /* Do not save FPU state, it is volatile across calls. */ + stb %g0, [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_EN] + + st %g0, [%i0 + UC_MCONTEXT + MC_XRS + XRS_ID] + st %g0, [%i0 + UC_MCONTEXT + MC_XRS + XRS_PTR] + jmpl %i7 + 8, %g0 + restore %g0, %g0, %o0 +END(__getcontext) + +weak_alias (__getcontext, getcontext) diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/makecontext.c b/sysdeps/unix/sysv/linux/sparc/sparc32/makecontext.c new file mode 100644 index 0000000000..9b48dade63 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/makecontext.c @@ -0,0 +1,93 @@ +/* Create new context. + Copyright (C) 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by David S. Miller <davem@davemloft.net>, 2008. + + 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, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> +#include <stdarg.h> +#include <stdint.h> +#include <ucontext.h> + +/* Sets up the outgoing arguments and the program counter for a user + context for the requested function call. + + Returning to the correct parent context is pretty simple on + Sparc. We only need to link up the register windows correctly. + Since global registers are clobbered by calls, we need not be + concernred about those, and thus is all could be worked out without + using a trampoline. + + Except that we must deal with the signal mask, thus a trampoline + is unavoidable. 32-bit stackframe layout: + +-----------------------------------------+ + | 7th and further parameters | + +-----------------------------------------+ + | backup storage for initial 6 parameters | + +-----------------------------------------+ + | struct return pointer | + +-----------------------------------------+ + | 8 incoming registers | + +-----------------------------------------+ + | 8 local registers | + %sp --> +-----------------------------------------+ + +*/ + +void +__makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...) +{ + extern void __start_context (void); + unsigned long int *sp; + va_list ap; + int i; + + sp = (unsigned long int *) (ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size); + sp -= 16 + 7 + argc; + sp = (unsigned long int *) (((uintptr_t) sp) & ~(8 - 1)); + + for (i = 0; i < 8; i++) + sp[i + 8] = ucp->uc_mcontext.gregs[REG_O0 + i]; + + /* The struct return pointer is essentially unused, so we can + place the link there. */ + sp[16] = (unsigned long int) ucp->uc_link; + + va_start (ap, argc); + + /* Fill in outgoing arguments, including those which will + end up being passed on the stack. */ + for (i = 0; i < argc; i++) + { + unsigned long int arg = va_arg (ap, unsigned long int); + if (i < 6) + ucp->uc_mcontext.gregs[REG_O0 + i] = arg; + else + sp[i + 23] = arg; + } + + va_end (ap); + + ucp->uc_mcontext.gregs[REG_O6] = (unsigned long int) sp; + + ucp->uc_mcontext.gregs[REG_O7] = ((unsigned long int) __start_context) - 8; + + ucp->uc_mcontext.gregs[REG_PC] = (unsigned long int) func; + ucp->uc_mcontext.gregs[REG_nPC] = ucp->uc_mcontext.gregs[REG_PC] + 4; +} + +weak_alias (__makecontext, makecontext) diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/setcontext.S b/sysdeps/unix/sysv/linux/sparc/sparc32/setcontext.S new file mode 100644 index 0000000000..33e40ac65a --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/setcontext.S @@ -0,0 +1,119 @@ +/* Install given context. + Copyright (C) 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by David S. Miller <davem@davemloft.net>, 2008. + + 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, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> +#include <sys/trap.h> + +#include "ucontext_i.h" + + +/* int __setcontext (const ucontext_t *ucp) + + Restores the machine context in UCP and thereby resumes execution + in that context. + + This implementation is intended to be used for *synchronous* context + switches only. Therefore, it does not have to restore anything + other than the PRESERVED state. */ + +ENTRY(__setcontext) + save %sp, -112, %sp + + mov SIG_SETMASK, %o0 + add %i0, UC_SIGMASK, %o1 + clr %o2 + mov 8, %o3 + mov __NR_rt_sigprocmask, %g1 + ta 0x10 + + /* This is a bit on the expensive side, and we could optimize + the unwind similar to how the 32-bit sparc longjmp code + does if performance of this routine really matters. */ + ta ST_FLUSH_WINDOWS + + ldub [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_EN], %g1 + cmp %g1, 0 + be 1f + nop + ld [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_FSR], %fsr + ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D0], %f0 + ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D2], %f2 + ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D4], %f4 + ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D6], %f6 + ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D8], %f8 + ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D10], %f10 + ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D12], %f12 + ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D14], %f14 + ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D16], %f16 + ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D18], %f18 + ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D20], %f20 + ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D22], %f22 + ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D24], %f24 + ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D26], %f26 + ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D28], %f28 + ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D30], %f30 +1: + ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_Y], %g1 + wr %g1, 0x0, %y + + /* We specifically do not restore %g1 since we need it here as + a temporary. */ + ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G2], %g2 + ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G3], %g3 + ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G4], %g4 + ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G5], %g5 + ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G6], %g6 + ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G7], %g7 + ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O1], %i1 + ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O2], %i2 + ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O3], %i3 + ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O4], %i4 + ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O5], %i5 + ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O6], %i6 + restore + ld [%o0 + UC_MCONTEXT + MC_GREGS + GREG_O7], %o7 + ld [%o0 + UC_MCONTEXT + MC_GREGS + GREG_PC], %g1 + jmpl %g1, %g0 + ld [%o0 + UC_MCONTEXT + MC_GREGS + GREG_O0], %o0 +END(__setcontext) + +weak_alias (__setcontext, setcontext) + +/* This is the helper code which gets called if a function which is + registered with 'makecontext' returns. In this case we have to + install the context listed in the uc_link element of the context + 'makecontext' manipulated at the time of the 'makecontext' call. + If the pointer is NULL the process must terminate. */ + +ENTRY(__start_context) + ld [%sp + (16 * 4)], %g1 + cmp %g1, 0 + be,a 1f + clr %o0 + call __setcontext + mov %g1, %o0 + /* If this returns (which can happen if the syscall fails) we'll + exit the program with the return error value (-1). */ +1: call exit + nop + /* The 'exit' call should never return. In case it does cause + the process to terminate. */ + unimp +END(__start_context) diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/swapcontext.S b/sysdeps/unix/sysv/linux/sparc/sparc32/swapcontext.S new file mode 100644 index 0000000000..154746689a --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/swapcontext.S @@ -0,0 +1,119 @@ +/* Save current context and install the given one. + Copyright (C) 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by David S. Miller <davem@davemloft.net>, 2008. + + 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, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> +#include <sys/trap.h> + +#include "ucontext_i.h" + + +/* int __swapcontext (ucontext_t *oucp, const ucontext_t *ucp); + + Saves the machine context in oucp such that when it is activated, + it appears as if __swapcontext() returned again, restores the + machine context in ucp and thereby resumes execution in that + context. + + This implementation is intended to be used for *synchronous* context + switches only. Therefore, it does not have to save anything + other than the PRESERVED state. */ + +ENTRY(__swapcontext) + save %sp, -112, %sp + ta ST_FLUSH_WINDOWS + st %g0, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_PSR] + add %i7, 8, %o0 + st %o0, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_PC] + add %o0, 4, %o0 + st %o0, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_NPC] + rd %y, %o1 + st %o1, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_Y] + st %g1, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G1] + st %g2, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G2] + st %g3, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G3] + st %g4, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G4] + st %g5, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G5] + st %g6, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G6] + st %g7, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G7] + st %g0, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O0] + st %i1, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O1] + st %i2, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O2] + st %i3, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O3] + st %i4, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O4] + st %i5, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O5] + st %i6, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O6] + st %i7, [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O7] + st %g0, [%i0 + UC_MCONTEXT + MC_GWINS] + stb %g0, [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_EN] + st %g0, [%i0 + UC_MCONTEXT + MC_XRS + XRS_ID] + st %g0, [%i0 + UC_MCONTEXT + MC_XRS + XRS_PTR] + + mov SIG_SETMASK, %o0 + add %i1, UC_SIGMASK, %o1 + add %i0, UC_SIGMASK, %o2 + mov 8, %o3 + mov __NR_rt_sigprocmask, %g1 + ta 0x10 + + mov %i1, %i0 + ldub [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_EN], %g1 + cmp %g1, 0 + be 1f + nop + ld [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_FSR], %fsr + ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D0], %f0 + ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D2], %f2 + ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D4], %f4 + ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D6], %f6 + ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D8], %f8 + ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D10], %f10 + ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D12], %f12 + ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D14], %f14 + ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D16], %f16 + ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D18], %f18 + ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D20], %f20 + ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D22], %f22 + ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D24], %f24 + ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D26], %f26 + ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D28], %f28 + ldd [%i0 + UC_MCONTEXT + MC_FPREGS + FPU_D30], %f30 +1: + ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_Y], %g1 + wr %g1, 0x0, %y + ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G2], %g2 + ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G3], %g3 + ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G4], %g4 + ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G5], %g5 + ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G6], %g6 + ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_G7], %g7 + ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O1], %i1 + ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O2], %i2 + ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O3], %i3 + ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O4], %i4 + ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O5], %i5 + ld [%i0 + UC_MCONTEXT + MC_GREGS + GREG_O6], %i6 + restore + ld [%o0 + UC_MCONTEXT + MC_GREGS + GREG_O7], %o7 + ld [%o0 + UC_MCONTEXT + MC_GREGS + GREG_PC], %g1 + jmpl %g1, %g0 + ld [%o0 + UC_MCONTEXT + MC_GREGS + GREG_O0], %o0 +END(__swapcontext) + +weak_alias (__swapcontext, swapcontext) diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym b/sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym new file mode 100644 index 0000000000..544030ce8b --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym @@ -0,0 +1,61 @@ +#include <stddef.h> +#include <signal.h> +#include <sys/ucontext.h> + +-- + +SIG_BLOCK +SIG_SETMASK + +UC_FLAGS offsetof (ucontext_t, uc_flags) +UC_LINK offsetof (ucontext_t, uc_link) +UC_SIGMASK offsetof (ucontext_t, uc_sigmask) +UC_STACK offsetof (ucontext_t, uc_stack) +UC_MCONTEXT offsetof (ucontext_t, uc_mcontext) +MC_GREGS offsetof (mcontext_t, gregs) +MC_GWINS offsetof (mcontext_t, gwins) +MC_FPREGS offsetof (mcontext_t, fpregs) +MC_XRS offsetof (mcontext_t, xrs) +MC_FILLER offsetof (mcontext_t, filler) +GREG_PSR (REG_PSR * sizeof(greg_t)) +GREG_PC (REG_PC * sizeof(greg_t)) +GREG_NPC (REG_nPC * sizeof(greg_t)) +GREG_Y (REG_Y * sizeof(greg_t)) +GREG_G1 (REG_G1 * sizeof(greg_t)) +GREG_G2 (REG_G2 * sizeof(greg_t)) +GREG_G3 (REG_G3 * sizeof(greg_t)) +GREG_G4 (REG_G4 * sizeof(greg_t)) +GREG_G5 (REG_G5 * sizeof(greg_t)) +GREG_G6 (REG_G6 * sizeof(greg_t)) +GREG_G7 (REG_G7 * sizeof(greg_t)) +GREG_O0 (REG_O0 * sizeof(greg_t)) +GREG_O1 (REG_O1 * sizeof(greg_t)) +GREG_O2 (REG_O2 * sizeof(greg_t)) +GREG_O3 (REG_O3 * sizeof(greg_t)) +GREG_O4 (REG_O4 * sizeof(greg_t)) +GREG_O5 (REG_O5 * sizeof(greg_t)) +GREG_O6 (REG_O6 * sizeof(greg_t)) +GREG_O7 (REG_O7 * sizeof(greg_t)) +FPU_D0 offsetof (fpregset_t, fpu_fr.fpu_dregs[0]) +FPU_D2 offsetof (fpregset_t, fpu_fr.fpu_dregs[1]) +FPU_D4 offsetof (fpregset_t, fpu_fr.fpu_dregs[2]) +FPU_D6 offsetof (fpregset_t, fpu_fr.fpu_dregs[3]) +FPU_D8 offsetof (fpregset_t, fpu_fr.fpu_dregs[4]) +FPU_D10 offsetof (fpregset_t, fpu_fr.fpu_dregs[5]) +FPU_D12 offsetof (fpregset_t, fpu_fr.fpu_dregs[6]) +FPU_D14 offsetof (fpregset_t, fpu_fr.fpu_dregs[7]) +FPU_D16 offsetof (fpregset_t, fpu_fr.fpu_dregs[8]) +FPU_D18 offsetof (fpregset_t, fpu_fr.fpu_dregs[9]) +FPU_D20 offsetof (fpregset_t, fpu_fr.fpu_dregs[10]) +FPU_D22 offsetof (fpregset_t, fpu_fr.fpu_dregs[11]) +FPU_D24 offsetof (fpregset_t, fpu_fr.fpu_dregs[12]) +FPU_D26 offsetof (fpregset_t, fpu_fr.fpu_dregs[13]) +FPU_D28 offsetof (fpregset_t, fpu_fr.fpu_dregs[14]) +FPU_D30 offsetof (fpregset_t, fpu_fr.fpu_dregs[15]) +FPU_Q offsetof (fpregset_t, fpu_q) +FPU_FSR offsetof (fpregset_t, fpu_fsr) +FPU_QCNT offsetof (fpregset_t, fpu_qcnt) +FPU_Q_ENTRY_SZ offsetof (fpregset_t, fpu_q_entrysize) +FPU_EN offsetof (fpregset_t, fpu_en) +XRS_ID offsetof (xrs_t, xrs_id) +XRS_PTR offsetof (xrs_t, xrs_ptr) |