summaryrefslogtreecommitdiff
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 */