about summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux/sparc/sparc32
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux/sparc/sparc32')
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/Dist8
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/Makefile12
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/__sigtrampoline.S143
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/bits/mman.h77
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/brk.c56
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/clone.S70
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/fork.S33
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/init-first.h52
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/kernel_stat.h28
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/pipe.S37
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/profil-counter.h26
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/sigaction.c136
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/socket.S58
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/syscall.S41
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list3
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.S3
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h80
17 files changed, 863 insertions, 0 deletions
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/Dist b/sysdeps/unix/sysv/linux/sparc/sparc32/Dist
new file mode 100644
index 0000000000..9729f0709b
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/Dist
@@ -0,0 +1,8 @@
+__sigtrampoline.S
+bits/mman.h
+clone.S
+pipe.S
+fork.S
+kernel_stat.h
+init-first.h
+sys/trap.h
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/Makefile b/sysdeps/unix/sysv/linux/sparc/sparc32/Makefile
new file mode 100644
index 0000000000..4cbd3bd004
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/Makefile
@@ -0,0 +1,12 @@
+ifeq ($(subdir),signal)
+sysdep_routines += __sigtrampoline
+endif
+
+asm-CPPFLAGS=-D__ASSEMBLY__
+as-FLAGS-.so=-fPIC
+
+# When I get this to work, this is the right thing
+ifeq ($(subdir),elf)
+CFLAGS-rtld.c += -mv8
+#rtld-routines += dl-sysdepsparc
+endif   # elf
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/__sigtrampoline.S b/sysdeps/unix/sysv/linux/sparc/sparc32/__sigtrampoline.S
new file mode 100644
index 0000000000..a639511f3e
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/__sigtrampoline.S
@@ -0,0 +1,143 @@
+/* Userland trampoline code for sigaction on Linux/SPARC        */
+/* (C) 1996, 1997 Free Software Foundation, Inc.                */
+/* This file is part of the GNU C Library.                      */
+/* Contributed by Miguel de Icaza (miguel@gnu.ai.mit.edu)       */
+/* Many thanks go to David Miller for explaining all this to me */
+/* miguel@nuclecu.unam.mx                                       */
+/* Sources:     David Miller, 4.4BSD/SPARC code                */
+
+#include <sysdep.h>
+#define __ASSEMBLY__
+/* For REGWIN_SZ */
+#include <asm/ptrace.h>
+#include <asm/psr.h>
+
+/* The C compiler frame size */
+#define CCFSZ  96
+
+	.text
+
+ENTRY(____sparc_signal_trampoline)
+	.global C_SYMBOL_NAME(____sig_table)
+
+	/* Make room for 32 %f registers + %fsr
+	 * this is 132 bytes + alignement = 136
+	 * 96 is the C frame size
+	 */
+	save    %sp,-136-CCFSZ,%sp
+
+	/* save regular registers */
+	mov	%g2,%l2
+	mov	%g3,%l3
+	mov	%g4,%l4
+	mov	%g5,%l5
+	mov	%g6,%l6
+	mov	%g7,%l7
+
+       /* save fpu registers */
+	ld	[%fp+64+16+20],%l0	/* load the psr from sigcontext */
+	sethi	%hi(PSR_EF),%l1
+	andcc	%l0,%l1,%l0		/* is floating point enabled?   */
+	be	1f
+	rd	%y,%l1			/* save y anyways */
+
+	/* save fpu registers */
+	st	%fsr, [%sp + CCFSZ + 0]
+	std	%f0, [%sp + CCFSZ + 8]
+	std	%f2, [%sp + CCFSZ + 16]
+	std	%f4, [%sp + CCFSZ + 24]
+	std	%f6, [%sp + CCFSZ + 32]
+	std	%f8, [%sp + CCFSZ + 40]
+	std	%f10, [%sp + CCFSZ + 48]
+	std	%f12, [%sp + CCFSZ + 56]
+	std	%f14, [%sp + CCFSZ + 64]
+	std	%f16, [%sp + CCFSZ + 72]
+	std	%f18, [%sp + CCFSZ + 80]
+	std	%f20, [%sp + CCFSZ + 88]
+	std	%f22, [%sp + CCFSZ + 96]
+	std	%f24, [%sp + CCFSZ + 104]
+	std	%f26, [%sp + CCFSZ + 112]
+	std	%f28, [%sp + CCFSZ + 120]
+	std	%f30, [%sp + CCFSZ + 128]
+
+1:
+	/* Load signal number */
+	ld	[%fp + REGWIN_SZ],%o0
+	mov	%fp,%o1
+	mov	0xfea,%o2
+
+	/* Sanity check */
+	cmp	%o0,33
+	bl	1f
+	or	%g0,%g0,%g1     /*Call sys_setup */
+	t	0x10
+1:
+#ifdef PIC
+	/* Save return address */
+	mov	%o7,%o4
+___sxx:
+	call	___syy
+	nop
+___syy:
+	sethi	%hi(_GLOBAL_OFFSET_TABLE_-(___sxx-.)),%o5
+	or	%o5,%lo(_GLOBAL_OFFSET_TABLE_-(___sxx-.)),%o5
+	add	%o7,%o5,%o5
+	/* restore return address */
+	mov	%o4,%o7
+	mov	%o5,%o4
+	/* o4 has the GOT pointer */
+#endif
+	sethi	%hi(C_SYMBOL_NAME(____sig_table)),%o5
+	or	%o5,%lo(C_SYMBOL_NAME(____sig_table)),%o5
+#ifdef PIC
+	add	%o5,%o4,%o4
+	ld	[%o4],%o5
+#endif
+	sll	%o0,2,%o4
+	add	%o5,%o4,%o4
+	ld	[%o4],%o4
+	ld	[%fp + REGWIN_SZ + 4],%o1         /* Load subcode */
+	ld	[%fp + REGWIN_SZ + 8],%o2         /* pointer to sigcontext */
+	call	%o4
+	ld	[%fp + REGWIN_SZ + 12],%o3        /* Address where signal ocurre
+ */
+
+	/* handler returned, restore state */
+	tst	%l0
+	be	1f
+	wr	%l1,%g0,%y
+
+	/* fpu restoration */
+	ld	[%sp + CCFSZ + 0], %fsr
+	ldd	[%sp + CCFSZ + 8], %f0
+	ldd	[%sp + CCFSZ + 16], %f2
+	ldd	[%sp + CCFSZ + 24], %f4
+	ldd	[%sp + CCFSZ + 32], %f6
+	ldd	[%sp + CCFSZ + 40], %f8
+	ldd	[%sp + CCFSZ + 48], %f10
+	ldd	[%sp + CCFSZ + 56], %f12
+	ldd	[%sp + CCFSZ + 64], %f14
+	ldd	[%sp + CCFSZ + 72], %f16
+	ldd	[%sp + CCFSZ + 80], %f18
+	ldd	[%sp + CCFSZ + 88], %f20
+	ldd	[%sp + CCFSZ + 96], %f22
+	ldd	[%sp + CCFSZ + 104], %f24
+	ldd	[%sp + CCFSZ + 112], %f26
+	ldd	[%sp + CCFSZ + 120], %f28
+	ldd	[%sp + CCFSZ + 128], %f30
+
+1:
+	mov	%l2,%g2
+	mov	%l3,%g3
+	mov	%l4,%g4
+	mov	%l5,%g5
+	mov	%l6,%g6
+	mov	%l7,%g7
+
+       /* call sigreturn */
+	restore	%g0,SYS_ify(sigreturn),%g1	/* register back and set syscal */
+	add	%sp,64+16,%o0
+	t	0x10
+	/* if we return, sysreturn failed */
+	mov	SYS_ify(exit),%g1
+	t	0x10
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/bits/mman.h b/sysdeps/unix/sysv/linux/sparc/sparc32/bits/mman.h
new file mode 100644
index 0000000000..3e7f2900fa
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/bits/mman.h
@@ -0,0 +1,77 @@
+/* Definitions for POSIX memory map inerface.  Linux/SPARC version.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _SYS_MMAN_H
+# error "Never include this file directly.  Use <sys/mman.h> instead"
+#endif
+
+/* The following definitions basically come from the kernel headers.
+   But the kernel header is not namespace clean.  */
+
+
+/* Protections are chosen from these bits, OR'd together.  The
+   implementation does not necessarily support PROT_EXEC or PROT_WRITE
+   without PROT_READ.  The only guarantees are that no writing will be
+   allowed without PROT_WRITE and no access will be allowed for PROT_NONE. */
+
+#define PROT_READ	0x1		/* Page can be read.  */
+#define PROT_WRITE	0x2		/* Page can be written.  */
+#define PROT_EXEC	0x4		/* Page can be executed.  */
+#define PROT_NONE	0x0		/* Page can not be accessed.  */
+
+/* Sharing types (must choose one and only one of these).  */
+#define MAP_SHARED	0x01		/* Share changes.  */
+#define MAP_PRIVATE	0x02		/* Changes are private.  */
+#ifdef __USE_MISC
+# define MAP_TYPE	0x0f		/* Mask for type of mapping.  */
+#endif
+
+/* Other flags.  */
+#define MAP_FIXED	0x10		/* Interpret addr exactly.  */
+#ifdef __USE_MISC
+# define MAP_FILE	0x00
+# define MAP_ANONYMOUS	0x20		/* Don't use a file.  */
+# define MAP_ANON	MAP_ANONYMOUS
+# define MAP_RENAME	MAP_ANONYMOUS
+#endif
+
+/* These are Linux-specific.  */
+#ifdef __USE_MISC
+# define MAP_GROWSDOWN	0x0100		/* Stack-like segment.  */
+# define MAP_DENYWRITE	0x0800		/* ETXTBSY */
+# define MAP_EXECUTABLE	0x1000		/* Mark it as an executable.  */
+# define MAP_LOCKED	0x0100		/* Lock the mapping.  */
+# define MAP_NORESERVE	0x0040		/* Don't check for reservations.  */
+# define _MAP_NEW	0x80000000	/* Binary compatibility with SunOS.  */
+#endif
+
+/* Flags to `msync'.  */
+#define MS_ASYNC	1		/* Sync memory asynchronously.  */
+#define MS_SYNC		4		/* Synchronous memory sync.  */
+#define MS_INVALIDATE	2		/* Invalidate the caches.  */
+
+/* Flags for `mlockall'.  */
+#define MCL_CURRENT	0x2000		/* Lock all currently mapped pages.  */
+#define MCL_FUTURE	0x4000		/* Lock all additions to address
+					   space.  */
+
+/* Flags for `mremap'.  */
+#ifdef __USE_GNU
+# define MREMAP_MAYMOVE	1
+#endif
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/brk.c b/sysdeps/unix/sysv/linux/sparc/sparc32/brk.c
new file mode 100644
index 0000000000..8f079bf444
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/brk.c
@@ -0,0 +1,56 @@
+/* brk system call for Linux/SPARC.
+   Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Miguel de Icaza (miguel@nuclecu.unam.mx)
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <errno.h>
+#include <unistd.h>
+#include <sysdep.h>
+
+/* This must be initialized data because commons can't have aliases.  */
+void *__curbrk = 0;
+
+/* Old braindamage in GCC's crtstuff.c requires this symbol in an attempt
+   to work around different old braindamage in the old Linux ELF dynamic
+   linker.  */
+weak_alias (__curbrk, ___brk_addr)
+
+int
+__brk (void *addr)
+{
+  void *newbrk, *scratch;
+
+  asm ("mov %1, %%g1\n\t"
+       "mov %2, %%o0\n\t"
+       "t 0x10\n\t"
+       "mov %%o0, %0\n\t"
+       : "=r" (newbrk)
+       : "0" (__NR_brk), "r" (addr)
+       : "g1", "o0");
+
+  __curbrk = newbrk;
+
+  if (newbrk < addr)
+    {
+      __set_errno (ENOMEM);
+      return -1;
+    }
+
+  return 0;
+}
+weak_alias (__brk, brk)
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S b/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S
new file mode 100644
index 0000000000..64735e9dbc
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S
@@ -0,0 +1,70 @@
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+   Contributed by Richard Henderson (rth@tamu.edu).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/* clone() is even more special than fork() as it mucks with stacks
+   and invokes a function in the right context after its all over.  */
+
+#include <asm/errno.h>
+#include <asm/unistd.h>
+
+/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */
+
+	.text
+	.align	4
+	.globl	__libc_clone
+	.type	__libc_clone,@function
+	.weak	clone
+	__clone = __libc_clone
+	clone   = __libc_clone
+
+__libc_clone:
+	save	%sp,-96,%sp
+
+	/* sanity check arguments */
+	tst	%i0
+	be	__clone_syscall_error
+	tst	%i1
+	be	__clone_syscall_error
+	nop
+
+	/* Do the system call */
+	mov	%i1,%o1
+	mov	%i2,%o0
+	set	__NR_clone,%g1
+	ta	0x10
+	bcs	__clone_syscall_error
+	tst	%o1
+	bne	__thread_start
+	nop
+	mov	%o0,%i0
+	ret
+	restore
+
+__clone_syscall_error:
+	call	__errno_location
+	set	EINVAL,%i0
+	st	%i0,[%o0]
+	mov	-1,%i0
+	ret
+	restore
+
+__thread_start:
+	call	%i0
+	mov	%i3,%o0
+	call	_exit,0
+	nop
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/fork.S b/sysdeps/unix/sysv/linux/sparc/sparc32/fork.S
new file mode 100644
index 0000000000..951ab4981b
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/fork.S
@@ -0,0 +1,33 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Miguel de Icaza <miguel@gnu.ai.mit.edu>, 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <sysdep.h>
+
+PSEUDO (__libc_fork, fork, 0)
+	tst %o1
+	be,a parent
+	nop
+	/* child: return 0 */
+	clr %o0
+parent:
+	ret
+
+PSEUDO_END (__libc_fork)
+weak_alias (__libc_fork, __fork)
+weak_alias (__libc_fork, fork)
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/init-first.h b/sysdeps/unix/sysv/linux/sparc/sparc32/init-first.h
new file mode 100644
index 0000000000..39822fc595
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/init-first.h
@@ -0,0 +1,52 @@
+/* Prepare arguments for library initialization function.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/* The job of this fragment it to find argc and friends for INIT.
+   This is done in one of two ways: either in the stack context
+   of program start, or having dlopen pass them in.  */
+
+#define SYSDEP_CALL_INIT(NAME, INIT)					      \
+void NAME (void *arg)							      \
+{									      \
+  int argc;								      \
+  char **argv, **envp;							      \
+  /* The next variable is only here to work around a bug in gcc <= 2.7.2.2.   \
+     If the address would be taken inside the expression the optimizer	      \
+     would try to be too smart and throws it away.  Grrr.  */		      \
+  int *dummy_addr = &_dl_starting_up;					      \
+									      \
+  __libc_multiple_libcs = dummy_addr && !_dl_starting_up;		      \
+									      \
+  if (!__libc_multiple_libcs)						      \
+    {									      \
+      argc = *(int *) arg;						      \
+      argv = (char **) (arg + 4);					      \
+      envp = &argv[argc+1];						      \
+    }									      \
+  else									      \
+    {									      \
+      argc = (int) arg;							      \
+      argv = ((char ***) &arg)[1];					      \
+      envp = ((char ***) &arg)[2];					      \
+    }									      \
+									      \
+  INIT (argc, argv, envp);						      \
+}
+
+
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/kernel_stat.h b/sysdeps/unix/sysv/linux/sparc/sparc32/kernel_stat.h
new file mode 100644
index 0000000000..91f02f4e20
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/kernel_stat.h
@@ -0,0 +1,28 @@
+/* Definition of `struct stat' used in the kernel */
+struct kernel_stat
+  {
+    unsigned short int st_dev;
+    unsigned long int st_ino;
+    unsigned short int st_mode;
+    short int st_nlink;
+    unsigned short int st_uid;
+    unsigned short int st_gid;
+    unsigned short int st_rdev;
+    long int st_size;
+    long int st_atime;
+    unsigned long int __unused1;
+    long int st_mtime;
+    unsigned long int __unused2;
+    long int st_ctime;
+    unsigned long int __unused3;
+    long int st_blksize;
+    long int st_blocks;
+    unsigned long int __unused4;
+    unsigned long int __unused5;
+  };
+
+#define _HAVE___UNUSED1
+#define _HAVE___UNUSED2
+#define _HAVE___UNUSED3
+#define _HAVE___UNUSED4
+#define _HAVE___UNUSED5
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/pipe.S b/sysdeps/unix/sysv/linux/sparc/sparc32/pipe.S
new file mode 100644
index 0000000000..4c50656d6c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/pipe.S
@@ -0,0 +1,37 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Miguel de Icaza <miguel@gnu.ai.mit.edu>, 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <sysdep.h>
+	.globl __libc_pipe
+ENTRY (__libc_pipe)
+        mov %o0, %o2            /* Save PIPEDES. */
+	mov SYS_ify(pipe),%g1
+	ta 0x10
+	bcc,a 2f
+	nop
+	SYSCALL_ERROR_HANDLER
+2:
+	st %o0, [%o2]           /* PIPEDES[0] = %o0; */
+        st %o1, [%o2 + 4]       /* PIPEDES[1] = %o1; */
+	retl
+	clr %o0
+
+PSEUDO_END (__libc_pipe)
+weak_alias (__libc_pipe, __pipe)
+weak_alias (__libc_pipe, pipe)
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/profil-counter.h b/sysdeps/unix/sysv/linux/sparc/sparc32/profil-counter.h
new file mode 100644
index 0000000000..1bd06482c9
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/profil-counter.h
@@ -0,0 +1,26 @@
+/* Low-level statistical profiling support function.  Linux/SPARC version.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <signal.h>
+
+void
+profil_counter (int signo, __siginfo_t si)
+{
+  profil_count ((void *) si.si_regs.pc);
+}
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/sigaction.c b/sysdeps/unix/sysv/linux/sparc/sparc32/sigaction.c
new file mode 100644
index 0000000000..d39eb7cc76
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/sigaction.c
@@ -0,0 +1,136 @@
+/* POSIX.1 sigaction call for Linux/SPARC.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Miguel de Icaza (miguel@nuclecu.unam.mx), 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <syscall.h>
+#include <sys/signal.h>
+#include <errno.h>
+
+/* Commented out while I figure out what the fuck goes on */
+long ____sig_table [NSIG];
+#if 0
+
+/* The kernel will deliver signals in the old way if the signal
+   number is a positive number.  The kernel will deliver a signal
+   with the new stack layout if the signal number is a negative number.
+
+   Our sigaction code takes care of selecting the type of kernel we are
+   using at runtime.  */
+
+extern void ____sparc_signal_trampoline (int);
+
+int
+__trampoline_sigaction (int sig, struct sigaction *new, struct sigaction *old)
+{
+  int ret;
+  int need_to_hide_trick = 0;
+  __sighandler_t old_sh;
+
+  if (new)
+    {
+      if (new->sa_handler != SIG_DFL && new->sa_handler != SIG_IGN)
+	{
+	  old_sh = ____sig_table[sig];
+	  ____sig_table[sig] = (long int) new->sa_handler;
+	  new->sa_handler = ____sparc_signal_trampoline;
+	  need_to_hide_trick = 1;
+	}
+    }
+  __asm__("or %%g0,%0,%%g1\n\t"
+	  "or %%g0,%1,%%o0\n\t"
+	  "or %%g0,%2,%%o1\n\t"
+	  "or %%g0,%3,%%o2\n\t"
+	  "t  0x10\n\t"
+	  "bcc 1f\n\t"
+	  "or %%o0, %%g0, %0\n\t"
+	  "sub %%g0, %%o0, %0\n\t"
+	  "1:"
+	  : "=r" (ret), "=r" ((long int) sig), "=r" ((long int) new),
+	    "=r" ((long int) old)
+	  : "0" (__NR_sigaction), "1" (sig), "2" (new), "3" (old)
+	  : "g1", "o0", "o1", "o2");
+
+  if (ret >= 0)
+    {
+      if (old && old->sa_handler == ____sparc_signal_trampoline)
+	{
+	  if (need_to_hide_trick)
+	    old->sa_handler = old_sh;
+	  else
+	    old->sa_handler = ____sig_table[sig];
+	}
+      if (need_to_hide_trick)
+	new->sa_handler = ____sig_table[sig];
+      return 0;
+    }
+  __set_errno (-ret);
+  return -1;
+}
+#else
+#    define __new_sigaction __sigaction
+#endif
+
+int
+__new_sigaction (int sig, __const struct sigaction *new, struct sigaction *old)
+{
+  int ret;
+
+  sig = -sig;
+
+  __asm__("or %%g0,%0,%%g1\n\t"
+	  "or %%g0,%1,%%o0\n\t"
+	  "or %%g0,%2,%%o1\n\t"
+	  "or %%g0,%3,%%o2\n\t"
+	  "t  0x10\n\t"
+	  "bcc 1f\n\t"
+	  "or %%o0, %%g0, %0\n\t"
+	  "sub %%g0,%%o0,%0\n\t"
+	  "1:"
+	  : "=r" (ret), "=r" ((long int) sig), "=r" ((long int) new),
+	    "=r" ((long int) old)
+	  : "0" (__NR_sigaction), "1" (sig), "2" (new), "3" (old)
+	  : "g1", "o0", "o1", "o2");
+  if (ret >= 0)
+    return 0;
+  __set_errno (-ret);
+  return -1;
+}
+
+#if 0
+int
+__sigaction (int sig, __const struct sigaction *new, struct sigaction *old)
+{
+  static (*sigact_routine) (int, __const struct sigaction *, struct sigaction *);
+  int ret;
+  struct sigaction sa;
+
+  if (sigact_routine)
+    return (*sigact_routine) (sig, new, old);
+
+  ret = __new_sigaction (1, NULL, &sa);
+  if (ret == -1)
+    sigact_routine = __trampoline_sigaction;
+  else
+    sigact_routine = __new_sigaction;
+
+  return __sigaction (sig, new, old);
+}
+#endif
+
+weak_alias (__sigaction, sigaction);
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/socket.S b/sysdeps/unix/sysv/linux/sparc/sparc32/socket.S
new file mode 100644
index 0000000000..bdfc2fcc6d
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/socket.S
@@ -0,0 +1,58 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Miguel de Icaza <miguel@gnu.ai.mit.edu>, 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <sysdep.h>
+#include <socketcall.h>
+
+#define P(a, b) P2(a, b)
+#define P2(a, b) a##b
+
+	.text
+/* The socket-oriented system calls are handled unusually in Linux.
+   They are all gated through the single `socketcall' system call number.
+   `socketcall' takes two arguments: the first is the subcode, specifying
+   which socket function is being called; and the second is a pointer to
+   the arguments to the specific function.
+
+   The .S files for the other calls just #define socket and #include this.  */
+
+.globl P(__,socket)
+ENTRY (P(__,socket))
+	mov SYS_ify(socketcall), %g1    /* System call number */
+
+	/* Use ## so `socket' is a separate token that might be #define'd.  */
+	mov P(SOCKOP_,socket), %o0	/* Subcode is first arg to syscall.  */
+	mov %i0,%o1		        /* args pointer is second arg to syscall */
+
+	t 0x10
+	bcc,a	1
+	nop
+	save %sp,96,%sp
+	call __errno_location
+	nop
+	st %i0,[%o0]
+	restore
+	retl
+	mov -1,%o0
+1:
+	ret
+
+PSEUDO_END (P(__,socket))
+
+weak_alias (P(__,socket), socket)
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/syscall.S b/sysdeps/unix/sysv/linux/sparc/sparc32/syscall.S
new file mode 100644
index 0000000000..3921ca52dc
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/syscall.S
@@ -0,0 +1,41 @@
+/* Copyright (C) 1991, 1992, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <sysdep.h>
+	.text
+ENTRY (syscall)
+	or	%o0,%g0,%g1
+	or	%o1,%g0,%o0
+	or	%o2,%g0,%o1
+	or	%o3,%g0,%o2
+	or	%o4,%g0,%o3
+	or	%o5,%g0,%o4
+	ta	0x10
+	bcc	1f
+	nop
+	save %sp, -96, %sp
+	call __errno_location
+	nop
+	st %i0,[%o0]
+	restore
+	retl
+	mov -1, %o0
+1:
+	ret
+
+PSEUDO_END (syscall)
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list b/sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list
new file mode 100644
index 0000000000..7883d70719
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list
@@ -0,0 +1,3 @@
+# File name	Caller	Syscall name	# args	Strong name	Weak names
+
+s_llseek	llseek	_llseek		5	__sys_llseek
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.S b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.S
new file mode 100644
index 0000000000..7e9023901b
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.S
@@ -0,0 +1,3 @@
+/* Define errno */
+
+	.common errno,4,4
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
new file mode 100644
index 0000000000..0e5a8cd218
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
@@ -0,0 +1,80 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Miguel de Icaza <miguel@gnu.ai.mit.edu>, January 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _LINUX_SPARC_SYSDEP_H
+#define _LINUX_SPARC_SYSDEP_H 1
+
+#include <sysdeps/unix/sparc/sysdep.h>
+
+#undef SYS_ify
+#define SYS_ify(syscall_name) __NR_##syscall_name
+
+#ifdef ASSEMBLER
+
+#ifdef DONT_LOAD_G1
+# define LOADSYSCALL(x)
+#else
+# define LOADSYSCALL(x) mov __NR_##x, %g1
+#endif
+
+/* Linux/SPARC uses a different trap number */
+#undef PSEUDO
+#undef ENTRY
+
+#define ENTRY(name) \
+	.global C_SYMBOL_NAME(name); \
+	.align 2;\
+	C_LABEL(name);\
+	.type name,@function;
+
+#ifdef PIC
+#define SYSCALL_ERROR_HANDLER \
+	.global C_SYMBOL_NAME(__errno_location);\
+        .type   C_SYMBOL_NAME(__errno_location),@function;\
+	save   %sp,-96,%sp;\
+	call   __errno_location;\
+	nop;\
+	st %i0,[%o0];\
+	restore;\
+	retl;\
+	mov -1,%o0;
+#else
+#define SYSCALL_ERROR_HANDLER \
+	save %sp,-96,%sp;						      \
+	call __errno_location;						      \
+	nop;								      \
+	st %i0,[%o0];							      \
+	restore;							      \
+	retl;								      \
+	mov -1,%o0;
+#endif   /* PIC */
+
+#define PSEUDO(name, syscall_name, args) \
+	.text;								      \
+	ENTRY(name);							      \
+	LOADSYSCALL(syscall_name);					      \
+	ta 0x10;							      \
+	bcc,a 1f;							      \
+	nop;								      \
+	SYSCALL_ERROR_HANDLER;						      \
+1:;
+
+#endif	/* ASSEMBLER */
+
+#endif /* linux/sparc/sysdep.h */