[uclibc-ng-devel] uClibc-ng - small C library for embedded systems branch master updated. v1.0.14-2-g2b3cdad

wbx wbx at helium.openadk.org
Tue Apr 26 19:43:04 CEST 2016


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "uClibc-ng - small C library for embedded systems".

The branch, master has been updated
       via  2b3cdadee36b0445ed799932358dd94a1e839b46 (commit)
      from  f1dcb9beedc5d05238e90cfbad026736d6efe891 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 2b3cdadee36b0445ed799932358dd94a1e839b46
Author: Waldemar Brodkorb <wbx at uclibc-ng.org>
Date:   Sat Apr 23 12:17:56 2016 +0200

    sparc: add deprecated context switching functions
    
    Ported over from glibc mostly without changes.
    Lightly tested with mongrel2 in qemu-system-sparc.

-----------------------------------------------------------------------

Summary of changes:
 extra/Configs/Config.sparc              |   1 +
 libc/sysdeps/linux/sparc/Makefile.arch  |   3 +
 libc/sysdeps/linux/sparc/getcontext.S   |  84 +++++++++++++++++++++++
 libc/sysdeps/linux/sparc/makecontext.c  |  92 +++++++++++++++++++++++++
 libc/sysdeps/linux/sparc/setcontext.S   | 118 ++++++++++++++++++++++++++++++++
 libc/sysdeps/linux/sparc/swapcontext.S  | 118 ++++++++++++++++++++++++++++++++
 libc/sysdeps/linux/sparc/ucontext_i.sym |  61 +++++++++++++++++
 7 files changed, 477 insertions(+)
 create mode 100644 libc/sysdeps/linux/sparc/getcontext.S
 create mode 100644 libc/sysdeps/linux/sparc/makecontext.c
 create mode 100644 libc/sysdeps/linux/sparc/setcontext.S
 create mode 100644 libc/sysdeps/linux/sparc/swapcontext.S
 create mode 100644 libc/sysdeps/linux/sparc/ucontext_i.sym

diff --git a/extra/Configs/Config.sparc b/extra/Configs/Config.sparc
index 47c8ac2..8b5da33 100644
--- a/extra/Configs/Config.sparc
+++ b/extra/Configs/Config.sparc
@@ -11,6 +11,7 @@ config FORCE_OPTIONS_FOR_ARCH
 	bool
 	default y
 	select ARCH_BIG_ENDIAN
+	select ARCH_HAS_UCONTEXT
 	select ARCH_HAS_DEPRECATED_SYSCALLS
 
 choice
diff --git a/libc/sysdeps/linux/sparc/Makefile.arch b/libc/sysdeps/linux/sparc/Makefile.arch
index 0173eff..92ea7d9 100644
--- a/libc/sysdeps/linux/sparc/Makefile.arch
+++ b/libc/sysdeps/linux/sparc/Makefile.arch
@@ -13,6 +13,9 @@ SSRC-y := \
 
 SSRC-$(if $(UCLIBC_HAS_THREADS_NATIVE),,y) += fork.S vfork.S clone.S
 
+CSRC-$(UCLIBC_HAS_CONTEXT_FUNCS) += makecontext.c
+SSRC-$(UCLIBC_HAS_CONTEXT_FUNCS) += getcontext.S setcontext.S swapcontext.S
+
 # check weather __LONG_DOUBLE_128__ is defined (long double support)
 UCLIBC_SPARC_HAS_LONG_DOUBLE=$(shell if [ "x`$(CC) -E -dM -xc /dev/null 2>&1 | grep __LONG_DOUBLE_128__`" != "x" ]; then echo "y"; fi)
 ifeq ($(UCLIBC_SPARC_HAS_LONG_DOUBLE),y)
diff --git a/libc/sysdeps/linux/sparc/getcontext.S b/libc/sysdeps/linux/sparc/getcontext.S
new file mode 100644
index 0000000..615a2c1
--- /dev/null
+++ b/libc/sysdeps/linux/sparc/getcontext.S
@@ -0,0 +1,84 @@
+/* Save current context.
+   Copyright (C) 2008-2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by David S. Miller <davem at 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, see
+   <http://www.gnu.org/licenses/>.  */
+
+#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/libc/sysdeps/linux/sparc/makecontext.c b/libc/sysdeps/linux/sparc/makecontext.c
new file mode 100644
index 0000000..3a9f70c
--- /dev/null
+++ b/libc/sysdeps/linux/sparc/makecontext.c
@@ -0,0 +1,92 @@
+/* Create new context.
+   Copyright (C) 2008-2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by David S. Miller <davem at 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, see
+   <http://www.gnu.org/licenses/>.  */
+
+#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
+   concerned 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 - 6] = 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/libc/sysdeps/linux/sparc/setcontext.S b/libc/sysdeps/linux/sparc/setcontext.S
new file mode 100644
index 0000000..f9da215
--- /dev/null
+++ b/libc/sysdeps/linux/sparc/setcontext.S
@@ -0,0 +1,118 @@
+/* Install given context.
+   Copyright (C) 2008-2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by David S. Miller <davem at 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, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+
+#include "ucontext_i.h"
+
+#define ST_FLUSH_WINDOWS 3
+
+/*  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	HIDDEN_JUMPTARGET(exit)
+	 nop
+	/* The 'exit' call should never return.  In case it does cause
+	   the process to terminate.  */
+	unimp
+END(__start_context)
diff --git a/libc/sysdeps/linux/sparc/swapcontext.S b/libc/sysdeps/linux/sparc/swapcontext.S
new file mode 100644
index 0000000..7dc7e2e
--- /dev/null
+++ b/libc/sysdeps/linux/sparc/swapcontext.S
@@ -0,0 +1,118 @@
+/* Save current context and install the given one.
+   Copyright (C) 2008-2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by David S. Miller <davem at 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, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+
+#include "ucontext_i.h"
+
+#define ST_FLUSH_WINDOWS 3
+
+/* 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/libc/sysdeps/linux/sparc/ucontext_i.sym b/libc/sysdeps/linux/sparc/ucontext_i.sym
new file mode 100644
index 0000000..544030c
--- /dev/null
+++ b/libc/sysdeps/linux/sparc/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)


hooks/post-receive
-- 
uClibc-ng - small C library for embedded systems


More information about the devel mailing list