[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[commits] r6112 - in /fsf/trunk/libc: ./ bits/ sysdeps/mach/hurd/bits/ sysdeps/unix/sysv/linux/sparc/sparc32/ sysdeps/unix/sysv/linux/...



Author: eglibc
Date: Tue May  6 00:04:37 2008
New Revision: 6112

Log:
Import glibc-mainline for 2008-05-06

Added:
    fsf/trunk/libc/sysdeps/unix/sysv/linux/sparc/sparc32/getcontext.S
    fsf/trunk/libc/sysdeps/unix/sysv/linux/sparc/sparc32/makecontext.c
    fsf/trunk/libc/sysdeps/unix/sysv/linux/sparc/sparc32/setcontext.S
    fsf/trunk/libc/sysdeps/unix/sysv/linux/sparc/sparc32/swapcontext.S
    fsf/trunk/libc/sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym
Modified:
    fsf/trunk/libc/ChangeLog
    fsf/trunk/libc/bits/termios.h
    fsf/trunk/libc/sysdeps/mach/hurd/bits/ioctls.h
    fsf/trunk/libc/sysdeps/unix/sysv/linux/sparc/sparc32/Makefile
    fsf/trunk/libc/sysdeps/unix/sysv/linux/sparc/sparc32/syscall.S
    fsf/trunk/libc/sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S

Modified: fsf/trunk/libc/ChangeLog
==============================================================================
--- fsf/trunk/libc/ChangeLog (original)
+++ fsf/trunk/libc/ChangeLog Tue May  6 00:04:37 2008
@@ -1,3 +1,40 @@
+2007-09-14  Samuel Thibault  <samuel.thibault@xxxxxxxxxxxx>
+
+	Fix termios bit macros.
+	Move *DLY definitions where they belong, in termios.h.
+	Add *[0-3] definitions.
+	Fixes confusion between VT and FF.
+	* sysdeps/mach/hurd/bits/ioctls.h (NL0, NL1, TAB0, TAB1, TAB2, CR0,
+	CR1, CR2, CR3, FF0, FF1, BS0, BS1): Undefine these at start if they
+	are already defined to avoid collision with termios.h.
+	(NLDLY, TABDLY, TAB3, CRDLY, VTDLY, BSDLY): Remove macros.
+	* bits/termios.h [__USE_MISC || __USE_XOPEN] (NL0, NL1, TAB0,
+	TAB1, TAB2, CR0, CR1, CR2, CR3, FF0, FF1, BS0, BS1): Likewise.
+	[__USE_BSD || __USE_XOPEN] (OCRNL, ONOCR, ONLRET): New macros.
+	[__USE_MISC || __USE_XOPEN] (NLDLY, NL0, NL1, TABDLY, TAB0, TAB1, TAB2,
+	TAB3, CRDLY, CR0, CR1, CR2, CR3, FFDLY, FF0, FF1, BSDLY, BS0, BS1,
+	VTDLY, VT0, VT1): New macros.
+	[__USE_GNU] (OLCUC): Change value of macro.
+	[__USE_XOPEN] (OFILL): New macro.
+	[__USE_BSD] (CRTSCTS): Change value.
+	(CRTS_IFLOW, CCTS_OFLOW): Change into compatibility macros.
+	[__USE_BSD] (CDTRCTS, CHWFLOW): New macros.
+	(B7200, B14400, B28800, B76800): New macros.
+
+2008-05-01  David S. Miller  <davem@xxxxxxxxxxxxx>
+
+	* 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.
+
 2008-04-30  Ulrich Drepper  <drepper@xxxxxxxxxx>
 
 	* sysdeps/unix/sysv/linux/bits/resource.h: Define RUSAGE_THREAD and

Modified: fsf/trunk/libc/bits/termios.h
==============================================================================
--- fsf/trunk/libc/bits/termios.h (original)
+++ fsf/trunk/libc/bits/termios.h Tue May  6 00:04:37 2008
@@ -24,6 +24,50 @@
 /* These macros are also defined in some <bits/ioctls.h> files (with
    numerically identical values), but this serves to shut up cpp's
    complaining. */
+#if defined __USE_MISC || defined __USE_XOPEN
+
+# ifdef NL0
+#  undef NL0
+# endif
+# ifdef NL1
+#  undef NL1
+# endif
+# ifdef TAB0
+#  undef TAB0
+# endif
+# ifdef TAB1
+#  undef TAB1
+# endif
+# ifdef TAB2
+#  undef TAB2
+# endif
+# ifdef CR0
+#  undef CR0
+# endif
+# ifdef CR1
+#  undef CR1
+# endif
+# ifdef CR2
+#  undef CR2
+# endif
+# ifdef CR3
+#  undef CR3
+# endif
+# ifdef FF0
+#  undef FF0
+# endif
+# ifdef FF1
+#  undef FF1
+# endif
+# ifdef BS0
+#  undef BS0
+# endif
+# ifdef BS1
+#  undef BS1
+# endif
+
+#endif /* __USE_MISC || __USE_XOPEN */
+
 #ifdef __USE_BSD
 
 # ifdef MDMBUF
@@ -93,11 +137,43 @@
 #define	OPOST	(1 << 0)	/* Perform output processing.  */
 #ifdef	__USE_BSD
 # define ONLCR	(1 << 1)	/* Map NL to CR-NL on output.  */
-# define OXTABS	(1 << 2)	/* Expand tabs to spaces.  */
+# define OXTABS	TAB3		/* Expand tabs to spaces.  */
 # define ONOEOT	(1 << 3)	/* Discard EOT (^D) on output.  */
 #endif
+#if defined __USE_BSD || defined __USE_XOPEN
+# define OCRNL	(1 << 4)	/* Map CR to NL.  */
+# define ONOCR	(1 << 5)	/* Discard CR's when on column 0.  */
+# define ONLRET	(1 << 6)	/* Move to column 0 on NL.  */
+#endif
+#if defined __USE_MISC || defined __USE_XOPEN
+# define NLDLY	(3 << 8)	/* NL delay.  */
+# define NL0	(0 << 8)	/* NL type 0.  */
+# define NL1	(1 << 8)	/* NL type 1.  */
+# define TABDLY	(3 << 10)	/* TAB delay.  */
+# define TAB0	(0 << 10)	/* TAB delay type 0.  */
+# define TAB1	(1 << 10)	/* TAB delay type 1.  */
+# define TAB2	(2 << 10)	/* TAB delay type 2.  */
+# define TAB3	(1 << 2)	/* Expand tabs to spaces.  */
+# define CRDLY	(3 << 12)	/* CR delay.  */
+# define CR0	(0 << 12)	/* CR delay type 0.  */
+# define CR1	(1 << 12)	/* CR delay type 1.  */
+# define CR2	(2 << 12)	/* CR delay type 2.  */
+# define CR3	(3 << 12)	/* CR delay type 3.  */
+# define FFDLY	(1 << 14)	/* FF delay.  */
+# define FF0	(0 << 14)	/* FF delay type 0.  */
+# define FF1	(1 << 14)	/* FF delay type 1.  */
+# define BSDLY	(1 << 15)	/* BS delay.  */
+# define BS0	(0 << 15)	/* BS delay type 0.  */
+# define BS1	(1 << 15)	/* BS delay type 1.  */
+# define VTDLY	(1 << 16)	/* VT delay.  */
+# define VT0	(0 << 16)	/* VT delay type 0.  */
+# define VT1	(1 << 16)	/* VT delay type 1.  */
+#endif /* __USE_MISC || __USE_XOPEN */
 #ifdef __USE_GNU
-# define OLCUC	(1 << 9)	/* Translate lower case output to upper case */
+# define OLCUC	(1 << 17)	/* Translate lower case output to upper case */
+#endif
+#ifdef __USE_XOPEN
+# define OFILL	(1 << 18)	/* Send fill characters for delays.  */
 #endif
 
   /* Control modes.  */
@@ -117,10 +193,12 @@
 #define	HUPCL	(1 << 14)	/* Hang up on last close.  */
 #define	CLOCAL	(1 << 15)	/* Ignore modem status lines.  */
 #ifdef	__USE_BSD
-# define CCTS_OFLOW	(1 << 16)	/* CTS flow control of output.  */
-# define CRTS_IFLOW	(1 << 17)	/* RTS flow control of input.  */
-# define CRTSCTS	(CCTS_OFLOW|CRTS_IFLOW)	/* CTS/RTS flow control.  */
-# define MDMBUF		(1 << 20)	/* Carrier flow control of output.  */
+# define CRTSCTS	(1 << 16)	/* RTS/CTS flow control.  */
+# define CRTS_IFLOW	CRTSCTS		/* Compatibility.  */
+# define CCTS_OFLOW	CRTSCTS		/* Compatibility.  */
+# define CDTRCTS	(1 << 17)	/* DTR/CTS flow control.  */
+# define MDMBUF		(1 << 20)	/* DTR/DCD flow control.  */
+# define CHWFLOW	(MDMBUF|CRTSCTS|CDTRCTS) /* All types of flow control.  */
 #endif
 
   /* Local modes.  */
@@ -210,13 +288,17 @@
 #define	B2400	2400		/* 2400 baud.  */
 #define	B4800	4800		/* 4800 baud.  */
 #define	B9600	9600		/* 9600 baud.  */
+#define	B7200	7200		/* 7200 baud.  */
+#define	B14400	14400		/* 14400 baud.  */
 #define	B19200	19200		/* 19200 baud.  */
+#define	B28800	28800		/* 28800 baud.  */
 #define	B38400	38400		/* 38400 baud.  */
 #ifdef	__USE_MISC
 # define EXTA	19200
 # define EXTB	38400
 #endif
 #define	B57600	57600
+#define	B76800	76800
 #define	B115200	115200
 #define	B230400	230400
 #define	B460800	460800

Modified: fsf/trunk/libc/sysdeps/mach/hurd/bits/ioctls.h
==============================================================================
--- fsf/trunk/libc/sysdeps/mach/hurd/bits/ioctls.h (original)
+++ fsf/trunk/libc/sysdeps/mach/hurd/bits/ioctls.h Tue May  6 00:04:37 2008
@@ -25,6 +25,46 @@
 
 /* These macros are also defined in <bits/termios.h> (with numerically
    identical values) but this serves to shut up cpp's complaining. */
+
+#ifdef NL0
+# undef NL0
+#endif
+#ifdef NL1
+# undef NL1
+#endif
+#ifdef TAB0
+# undef TAB0
+#endif
+#ifdef TAB1
+# undef TAB1
+#endif
+#ifdef TAB2
+# undef TAB2
+#endif
+#ifdef CR0
+# undef CR0
+#endif
+#ifdef CR1
+# undef CR1
+#endif
+#ifdef CR2
+# undef CR2
+#endif
+#ifdef CR3
+# undef CR3
+#endif
+#ifdef FF0
+# undef FF0
+#endif
+#ifdef FF1
+# undef FF1
+#endif
+#ifdef BS0
+# undef BS0
+#endif
+#ifdef BS1
+# undef BS1
+#endif
 #ifdef MDMBUF
 # undef MDMBUF
 #endif
@@ -284,31 +324,25 @@
 #define		ODDP		0x00000040	/* get/send odd parity */
 #define		EVENP		0x00000080	/* get/send even parity */
 #define		ANYP		0x000000c0	/* get any parity/send none */
-#define		NLDLY		0x00000300	/* \n delay */
-#define		NLDELAY		NLDLY		/* traditional BSD name */
+#define		NLDELAY		0x00000300	/* \n delay */
 #define			NL0	0x00000000
 #define			NL1	0x00000100	/* tty 37 */
 #define			NL2	0x00000200	/* vt05 */
 #define			NL3	0x00000300
-#define		TABDLY		0x00000c00	/* horizontal tab delay */
-#define		TBDELAY		TABDLY		/* traditional BSD name */
+#define		TBDELAY		0x00000c00	/* horizontal tab delay */
 #define			TAB0	0x00000000
 #define			TAB1	0x00000400	/* tty 37 */
 #define			TAB2	0x00000800
-#define			TAB3	0x00000c00
 #define		XTABS		0x00000c00	/* expand tabs on output */
-#define		CRDLY		0x00003000	/* \r delay */
-#define		CRDELAY		CRDLY		/* traditional BSD name */
+#define		CRDELAY		0x00003000	/* \r delay */
 #define			CR0	0x00000000
 #define			CR1	0x00001000	/* tn 300 */
 #define			CR2	0x00002000	/* tty 37 */
 #define			CR3	0x00003000	/* concept 100 */
-#define		VTDLY		0x00004000	/* vertical tab delay */
-#define		VTDELAY		VTDLY		/* traditional BSD name */
+#define		VTDELAY		0x00004000	/* vertical tab delay */
 #define			FF0	0x00000000
 #define			FF1	0x00004000	/* tty 37 */
-#define		BSDLY		0x00008000	/* \b delay */
-#define		BSDELAY		BSDLY		/* traditional BSD name */
+#define		BSDELAY		0x00008000	/* \b delay */
 #define			BS0	0x00000000
 #define			BS1	0x00008000
 #define		ALLDELAY	(NLDELAY|TBDELAY|CRDELAY|VTDELAY|BSDELAY)

Modified: fsf/trunk/libc/sysdeps/unix/sysv/linux/sparc/sparc32/Makefile
==============================================================================
--- fsf/trunk/libc/sysdeps/unix/sysv/linux/sparc/sparc32/Makefile (original)
+++ fsf/trunk/libc/sysdeps/unix/sysv/linux/sparc/sparc32/Makefile Tue May  6 00:04:37 2008
@@ -1,6 +1,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)

Added: fsf/trunk/libc/sysdeps/unix/sysv/linux/sparc/sparc32/getcontext.S
==============================================================================
--- fsf/trunk/libc/sysdeps/unix/sysv/linux/sparc/sparc32/getcontext.S (added)
+++ fsf/trunk/libc/sysdeps/unix/sysv/linux/sparc/sparc32/getcontext.S Tue May  6 00:04:37 2008
@@ -1,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@xxxxxxxxxxxxx>, 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)

Added: fsf/trunk/libc/sysdeps/unix/sysv/linux/sparc/sparc32/makecontext.c
==============================================================================
--- fsf/trunk/libc/sysdeps/unix/sysv/linux/sparc/sparc32/makecontext.c (added)
+++ fsf/trunk/libc/sysdeps/unix/sysv/linux/sparc/sparc32/makecontext.c Tue May  6 00:04:37 2008
@@ -1,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@xxxxxxxxxxxxx>, 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)

Added: fsf/trunk/libc/sysdeps/unix/sysv/linux/sparc/sparc32/setcontext.S
==============================================================================
--- fsf/trunk/libc/sysdeps/unix/sysv/linux/sparc/sparc32/setcontext.S (added)
+++ fsf/trunk/libc/sysdeps/unix/sysv/linux/sparc/sparc32/setcontext.S Tue May  6 00:04:37 2008
@@ -1,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@xxxxxxxxxxxxx>, 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)

Added: fsf/trunk/libc/sysdeps/unix/sysv/linux/sparc/sparc32/swapcontext.S
==============================================================================
--- fsf/trunk/libc/sysdeps/unix/sysv/linux/sparc/sparc32/swapcontext.S (added)
+++ fsf/trunk/libc/sysdeps/unix/sysv/linux/sparc/sparc32/swapcontext.S Tue May  6 00:04:37 2008
@@ -1,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@xxxxxxxxxxxxx>, 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)

Modified: fsf/trunk/libc/sysdeps/unix/sysv/linux/sparc/sparc32/syscall.S
==============================================================================
--- fsf/trunk/libc/sysdeps/unix/sysv/linux/sparc/sparc32/syscall.S (original)
+++ fsf/trunk/libc/sysdeps/unix/sysv/linux/sparc/sparc32/syscall.S Tue May  6 00:04:37 2008
@@ -27,6 +27,7 @@
 	mov	%o3, %o2
 	mov	%o4, %o3
 	mov	%o5, %o4
+	ld	[%sp + 92], %o5
 	ta	0x10
 	bcc	1f
 	 mov	%o7, %g1

Added: fsf/trunk/libc/sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym
==============================================================================
--- fsf/trunk/libc/sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym (added)
+++ fsf/trunk/libc/sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym Tue May  6 00:04:37 2008
@@ -1,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)

Modified: fsf/trunk/libc/sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S
==============================================================================
--- fsf/trunk/libc/sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S (original)
+++ fsf/trunk/libc/sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S Tue May  6 00:04:37 2008
@@ -27,6 +27,7 @@
 	mov	%o3,%o2
 	mov	%o4,%o3
 	mov	%o5,%o4
+	ldx	[%sp + STACK_BIAS + 176],%o5
 
 	ta	0x6d