]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
* sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym: New file.
authorJakub Jelinek <jakub@redhat.com>
Mon, 5 May 2008 09:34:18 +0000 (09:34 +0000)
committerJakub Jelinek <jakub@redhat.com>
Mon, 5 May 2008 09:34:18 +0000 (09:34 +0000)
* 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.

ChangeLog
sysdeps/unix/sysv/linux/sparc/sparc32/Makefile
sysdeps/unix/sysv/linux/sparc/sparc32/getcontext.S [new file with mode: 0644]
sysdeps/unix/sysv/linux/sparc/sparc32/makecontext.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sparc/sparc32/setcontext.S [new file with mode: 0644]
sysdeps/unix/sysv/linux/sparc/sparc32/swapcontext.S [new file with mode: 0644]
sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym [new file with mode: 0644]

index d74ed4977b19d0984b95a09ee999dd48a3d26ecd..164aff87cb852f1b00648aa0a56e81dad12ee23b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
index cd1b3fb793b7d2203dd7850f60bfd562bc2ee883..8f7e76be2a1b50ec81f066f113f5a1fefe6add4b 100644 (file)
@@ -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 (file)
index 0000000..f8664a7
--- /dev/null
@@ -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 (file)
index 0000000..9b48dad
--- /dev/null
@@ -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 (file)
index 0000000..33e40ac
--- /dev/null
@@ -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 (file)
index 0000000..1547466
--- /dev/null
@@ -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 (file)
index 0000000..544030c
--- /dev/null
@@ -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)