summaryrefslogtreecommitdiff
path: root/sysdeps/unix
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix')
-rw-r--r--sysdeps/unix/sysv/linux/sparc/errno.c1
-rw-r--r--sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h12
-rw-r--r--sysdeps/unix/sysv/linux/sparc/kernel_stat.h9
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sys/trap.h7
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/Makefile4
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/__longjmp.S1
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/bits/setjmp.h26
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/bits/types.h95
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/brk.S97
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/clone.S89
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/fork.S33
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/getcontext.S30
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/init-first.h92
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/kernel_stat.h22
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/longjmp.S44
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/pipe.S37
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/profil-counter.h26
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/setcontext.S33
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/setjmp.S48
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/sigjmp.S1
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/syscalls.list26
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/sysdep.S31
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/sysdep.h116
-rw-r--r--sysdeps/unix/sysv/linux/sparc64/ucontext.h67
-rw-r--r--sysdeps/unix/sysv/linux/syscalls.list2
25 files changed, 935 insertions, 14 deletions
diff --git a/sysdeps/unix/sysv/linux/sparc/errno.c b/sysdeps/unix/sysv/linux/sparc/errno.c
deleted file mode 100644
index 663ab33e93..0000000000
--- a/sysdeps/unix/sysv/linux/sparc/errno.c
+++ /dev/null
@@ -1 +0,0 @@
-itn errno;
diff --git a/sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h b/sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h
deleted file mode 100644
index f870d15082..0000000000
--- a/sysdeps/unix/sysv/linux/sparc/kernel_sigaction.h
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Linux/SPARC version. This is the sigaction struction from the Linux
- 2.1.20 kernel. */
-
-struct sigaction
- {
- __sighandler_t sa_handler;
- sigset_t sa_mask;
- unsigned long int sa_flags;
- void (*sa_restorer) (void); /* not used by Linux/SPARC yet */
- };
-
-#define HAVE_SA_RESTORER
diff --git a/sysdeps/unix/sysv/linux/sparc/kernel_stat.h b/sysdeps/unix/sysv/linux/sparc/kernel_stat.h
index 993a8664dc..91f02f4e20 100644
--- a/sysdeps/unix/sysv/linux/sparc/kernel_stat.h
+++ b/sysdeps/unix/sysv/linux/sparc/kernel_stat.h
@@ -17,5 +17,12 @@ struct kernel_stat
unsigned long int __unused3;
long int st_blksize;
long int st_blocks;
- unsigned long int __unused4[2];
+ 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/sys/trap.h b/sysdeps/unix/sysv/linux/sparc/sys/trap.h
new file mode 100644
index 0000000000..99b9c60e06
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sys/trap.h
@@ -0,0 +1,7 @@
+/* Include Linux/SPARC specific trap definitions. */
+#ifndef _SYS_TRAP_H
+#define _SYS_TRAP_H 1
+
+#include <asm/traps.h>
+
+#endif /* sys/trap.h */
diff --git a/sysdeps/unix/sysv/linux/sparc64/Makefile b/sysdeps/unix/sysv/linux/sparc64/Makefile
new file mode 100644
index 0000000000..c4d83226a2
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/Makefile
@@ -0,0 +1,4 @@
+ifeq ($(subdir),misc)
+sysdep_headers += ucontext.h
+sysdep_routines += getcontext setcontext
+endif
diff --git a/sysdeps/unix/sysv/linux/sparc64/__longjmp.S b/sysdeps/unix/sysv/linux/sparc64/__longjmp.S
new file mode 100644
index 0000000000..3107179fdc
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/__longjmp.S
@@ -0,0 +1 @@
+/* There is no need for __longjmp what with setcontext. */
diff --git a/sysdeps/unix/sysv/linux/sparc64/bits/setjmp.h b/sysdeps/unix/sysv/linux/sparc64/bits/setjmp.h
new file mode 100644
index 0000000000..ab850e5301
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/bits/setjmp.h
@@ -0,0 +1,26 @@
+/* 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 _JMP_BUF_H
+#define _JMP_BUF_H 1
+
+#include <ucontext.h>
+
+typedef ucontext_t __jmp_buf[1];
+
+#endif /* jmp_buf.h */
diff --git a/sysdeps/unix/sysv/linux/sparc64/bits/types.h b/sysdeps/unix/sysv/linux/sparc64/bits/types.h
new file mode 100644
index 0000000000..222967881f
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/bits/types.h
@@ -0,0 +1,95 @@
+/* Copyright (C) 1991, 92, 94, 95, 96, 97 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. */
+
+/*
+ * Never include this file directly; use <sys/types.h> instead.
+ */
+
+#ifndef _BITS_TYPES_H
+#define _BITS_TYPES_H 1
+
+#include <features.h>
+
+/* Convenience types. */
+typedef unsigned char __u_char;
+typedef unsigned short __u_short;
+typedef unsigned int __u_int;
+typedef unsigned long __u_long;
+typedef unsigned long int __u_quad_t;
+typedef long int __quad_t;
+typedef signed char __int8_t;
+typedef unsigned char __uint8_t;
+typedef signed short int __int16_t;
+typedef unsigned short int __uint16_t;
+typedef signed int __int32_t;
+typedef unsigned int __uint32_t;
+typedef signed long int __int64_t;
+typedef unsigned long int __uint64_t;
+typedef __quad_t *__qaddr_t;
+
+typedef __u_int __dev_t; /* Type of device numbers. */
+typedef __u_int __uid_t; /* Type of user identifications. */
+typedef __u_int __gid_t; /* Type of group identifications. */
+typedef __u_int __ino_t; /* Type of file serial numbers. */
+typedef __u_int __mode_t; /* Type of file attribute bitmasks. */
+typedef __u_int __nlink_t; /* Type of file link counts. */
+typedef long int __off_t; /* Type of file sizes and offsets. */
+typedef __quad_t __loff_t; /* Type of file sizes and offsets. */
+typedef int __pid_t; /* Type of process identifications. */
+typedef long int __ssize_t; /* Type of a byte count, or error. */
+
+typedef struct
+ {
+ int __val[2];
+ } __fsid_t; /* Type of file system IDs. */
+
+/* Everythin' else. */
+typedef int __daddr_t; /* The type of a disk address. */
+typedef char *__caddr_t;
+typedef long int __time_t;
+typedef long int __swblk_t; /* Type of a swap block maybe? */
+
+typedef long int __clock_t;
+
+/* One element in the file descriptor mask array. */
+typedef unsigned long int __fd_mask;
+
+/* Due to incaution, we may have gotten these from a kernel header file. */
+#undef __FD_SETSIZE
+#undef __NFDBITS
+#undef __FDMASK
+
+/* Number of descriptors that can fit in an `fd_set'. */
+#define __FD_SETSIZE 1024
+
+/* It's easier to assume 8-bit bytes than to get CHAR_BIT. */
+#define __NFDBITS (8 * sizeof (__fd_mask))
+#define __FDELT(d) ((d) / __NFDBITS)
+#define __FDMASK(d) (1 << ((d) % __NFDBITS))
+
+/* fd_set for select and pselect. */
+typedef struct
+ {
+ /* XPG4.2 requires this member name. */
+ __fd_mask fds_bits[__FD_SETSIZE / __NFDBITS];
+ } __fd_set;
+
+
+typedef int __key_t;
+
+#endif /* bits/types.h */
diff --git a/sysdeps/unix/sysv/linux/sparc64/brk.S b/sysdeps/unix/sysv/linux/sparc64/brk.S
new file mode 100644
index 0000000000..87412e095a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/brk.S
@@ -0,0 +1,97 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Richard Henderson <richard@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. */
+
+/* __brk is a special syscall under Linux since it never returns an
+ error. Instead, the error condition is indicated by returning the old
+ break value (instead of the new, requested one). */
+
+#include <sysdep.h>
+#define _ERRNO_H
+#include <bits/errno.h>
+
+#ifdef PIC
+.section .bss
+ .align 8
+ .globl __curbrk
+__curbrk: .skip 8
+ .type __curbrk,@object
+ .size __curbrk,8
+#else
+.common __curbrk, 8, 8
+#endif
+
+ .text
+ENTRY(__brk)
+ save %sp, -160, %sp
+#ifdef PIC
+1: rd %pc, %g1
+ sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7
+ or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7
+ add %l7, %g1, %l7
+#endif
+
+ LOADSYSCALL(brk)
+ mov %i0, %o0
+
+ ta 0x11
+
+ /* All the ways we can fail... */
+ bcs,pn %xcc, .Lerr1
+ nop
+ brz %i0, .Lok
+ subcc %i0, %o0, %g0
+ bne,pn %xcc, .Lerr0
+
+ /* Update __curbrk and return cleanly. */
+.Lok: sethi %hi(__curbrk), %g1
+ or %g1, %lo(__curbrk), %g1
+#ifdef PIC
+ ldx [%l7+%g1], %g1
+ stx %o0, [%g1]
+#else
+ stx %o0, [%g4+%g1]
+#endif
+ mov %g0, %i0
+
+ /* Don't use "ret" cause the preprocessor will eat it. */
+ jmpl %i7+8, %g0
+ restore
+
+ /* What a horrible way to die. */
+.Lerr0: set ENOMEM, %o0
+.Lerr1: sethi %hi(errno), %g1
+ or %g1, %lo(errno), %g1
+#ifdef PIC
+ ldx [%l7+%g1], %g1
+ st %o0, [%g1]
+#else
+ st %o0, [%g4+%g1]
+#endif
+#ifdef _LIBC_REENTRANT
+ call __errno_location
+ mov %o0,%l1
+ st %l1, [%o0]
+#endif
+ sub %g0, 1, %i0
+ jmpl %i7+8, %g0
+ restore
+
+ .size __brk, .-__brk
+
+weak_alias (__brk, brk)
diff --git a/sysdeps/unix/sysv/linux/sparc64/clone.S b/sysdeps/unix/sysv/linux/sparc64/clone.S
new file mode 100644
index 0000000000..fe38bf4ab7
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/clone.S
@@ -0,0 +1,89 @@
+/* Copyright (C) 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,-160,%sp
+
+ /* sanity check arguments */
+ brz,pn %i0, 99f
+ mov %i0, %l0 /* save fn */
+ brz,pn %i1, 99f
+ mov %i3, %l3 /* save arg */
+
+ /* Do the system call */
+ mov %i1, %o1
+ mov %i2, %o0
+ set __NR_clone, %g1
+ ta 0x11
+ bcs,pn %xcc, 99f
+ nop
+ brnz %o0, __thread_start
+ mov %o0, %i0
+ ret
+ restore
+99:
+#ifdef PIC
+ rd %pc, %g1
+ sethi %hi(_GLOBAL_OFFSET_TABLE_-(99b-.)), %l7
+ or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(99b-.)), %l7
+ add %l7, %g1, %l7
+ set EINVAL, %i0
+ sethi %hi(errno), %g2
+ or %g2, %lo(errno), %g2
+ st %i0, [%l7+%g2]
+#else
+ sethi %hi(errno), %g2
+ add %g2, %g4, %g2
+ set EINVAL, %i0
+ st %i0, [%g2+%lo(errno)]
+#endif
+#ifdef _LIBC_REENTRANT
+ call __errno_location
+ nop
+ st %i0, [%o0]
+#endif
+ mov -1,%i0
+ ret
+ restore
+ .size __libc_clone,.-__libc_clone
+
+ .type __thread_start,@function
+__thread_start:
+ mov %g0, %fp /* terminate backtrace */
+ sub %sp, 6*8, %sp /* provide arg storage */
+ call %l0
+ mov %l3,%o0
+ call _exit,0
+ nop
+ .size __thread_start,.-__thread_start
diff --git a/sysdeps/unix/sysv/linux/sparc64/fork.S b/sysdeps/unix/sysv/linux/sparc64/fork.S
new file mode 100644
index 0000000000..d57736b733
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/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., 675 Mass Ave,
+ Cambridge, MA 02139, USA. */
+
+#include <sysdep.h>
+
+PSEUDO (__libc_fork, fork, 0)
+ tst %o1
+ be %xcc, 1f
+ nop
+ /* child: return 0 */
+ clr %o0
+1: ret
+
+PSEUDO_END (__libc_fork)
+
+weak_alias (__libc_fork, __fork)
+weak_alias (__libc_fork, fork)
diff --git a/sysdeps/unix/sysv/linux/sparc64/getcontext.S b/sysdeps/unix/sysv/linux/sparc64/getcontext.S
new file mode 100644
index 0000000000..05b06269e4
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/getcontext.S
@@ -0,0 +1,30 @@
+/* Copyright (C) 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. */
+
+#include <sysdep.h>
+
+/* void getcontext(ucontext_t *); */
+
+ENTRY(__getcontext)
+
+ ta 0x6e
+ ret
+
+END(__getcontext)
+
+weak_alias(__getcontext, getcontext)
diff --git a/sysdeps/unix/sysv/linux/sparc64/init-first.h b/sysdeps/unix/sysv/linux/sparc64/init-first.h
new file mode 100644
index 0000000000..f7fad7f87f
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/init-first.h
@@ -0,0 +1,92 @@
+/* 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. */
+
+#include <sysdep.h>
+
+#define __S1(x) #x
+#define __S(x) __S1(x)
+
+#ifdef PIC
+
+#define SYSDEP_CALL_INIT(NAME, INIT) asm("\
+ .weak _dl_starting_up
+ .global " #NAME "
+ .type " #NAME ",@function
+" #NAME ":
+ save %sp, -64, %sp
+1: rd %pc, %g1
+ sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7
+ or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7
+ add %l7, %o7, %l7
+ /* Are we a dynamic libc being loaded into a static program? */
+ sethi %hi(_dl_starting_up), %g2
+ or %g2, %lo(_dl_starting_up), %g2
+ ld [%l7+%g2], %g2
+ brz,pn %g2, 3f
+ sethi %hi(__libc_multiple_libcs), %g3
+ ld [%g2], %g2
+ subcc %g0, %g2, %g0
+ subc %g0, -1, %g2
+3: or %g3, %lo(__libc_multiple_libcs), %g3
+ ld [%l7+%g3], %g3
+ st %g2, [%g3]
+ /* If so, argc et al are in %o0-%o2 already. Otherwise, load them. */
+ brnz,pn %g2, " #INIT "
+ restore
+ ld [%sp+" __S(STACK_BIAS) "+22*8], %o0
+ add %sp, " __S(STACK_BIAS) "+23*8, %o1
+ sll %o0, 3, %o2
+ add %o2, %o1, %o2
+ add %o2, 8, %o2
+ ba,a " #INIT "
+ .size "#NAME " .-" #NAME);
+
+#else
+
+#define SYSDEP_CALL_INIT(NAME, INIT) asm("\
+ .weak _dl_starting_up
+ .global " #NAME "
+ .type " #NAME ",@function
+" #NAME ":
+ /* Are we a dynamic libc being loaded into a static program? */
+ sethi %hi(_dl_starting_up), %g2
+ or %g2, %lo(_dl_starting_up), %g2
+ brz,pt %g2, 3f
+ sethi %hi(__libc_multiple_libcs), %g3
+ ld [%g4+%g2], %g2
+ subcc %g0, %g2, %g0
+ subc %g0, -1, %g2
+3: add %g3, %g4, %g3
+ st %g2, [%g3+%lo(__libc_multiple_libcs)]
+ /* If so, argc et al are in %o0-%o2 already. Otherwise, load them. */
+ brnz,pn %g2, " #INIT "
+ nop
+ ld [%sp+" __S(STACK_BIAS) "+22*8], %o0
+ add %sp, " __S(STACK_BIAS) "+23*8, %o1
+ sll %o0, 3, %o2
+ add %o2, %o1, %o2
+ add %o2, 8, %o2
+ ba,a " #INIT "
+ .size "#NAME ", .-" #NAME);
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/sparc64/kernel_stat.h b/sysdeps/unix/sysv/linux/sparc64/kernel_stat.h
new file mode 100644
index 0000000000..fcb752e3ec
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/kernel_stat.h
@@ -0,0 +1,22 @@
+/* Definition of `struct stat' used in the kernel */
+struct kernel_stat
+ {
+ unsigned int st_dev;
+ unsigned int st_ino;
+ unsigned int st_mode;
+ short int st_nlink;
+ unsigned int st_uid;
+ unsigned int st_gid;
+ unsigned int st_rdev;
+ long int st_size;
+ long int st_atime;
+ long int st_mtime;
+ long int st_ctime;
+ long int st_blksize;
+ long int st_blocks;
+ unsigned long int __unused1;
+ unsigned long int __unused2;
+ };
+
+#define _HAVE___UNUSED1
+#define _HAVE___UNUSED2
diff --git a/sysdeps/unix/sysv/linux/sparc64/longjmp.S b/sysdeps/unix/sysv/linux/sparc64/longjmp.S
new file mode 100644
index 0000000000..c81b10495e
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/longjmp.S
@@ -0,0 +1,44 @@
+/* Copyright (C) 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. */
+
+/* longjmp is implemented in terms of the setcontext trap on Linux/Sparc64. */
+
+#include <sysdep.h>
+
+/* Offsets into the jmp_buf structure. */
+
+#define O_mask_was_saved 512
+#define O_gregs 32
+#define O_g1 (O_gregs + 4*8)
+
+
+/* void longjmp (sigjmp_buf env, int val) */
+
+ENTRY(longjmp)
+
+ /* Modify the context with the value we want to return. */
+ movre %o1, 1, %o1
+ stx %o1, [%o0 + O_g1]
+
+ /* Let setcontext know if we want to modify the current sigmask. */
+ ld [%o0 + O_mask_was_saved], %o1
+
+ /* And bamf back to where we belong! */
+ ta 0x6f
+
+END(longjmp)
diff --git a/sysdeps/unix/sysv/linux/sparc64/pipe.S b/sysdeps/unix/sysv/linux/sparc64/pipe.S
new file mode 100644
index 0000000000..82ff4eae3c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/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>
+
+ENTRY (__libc_pipe)
+ mov %o0, %o2 /* Save PIPEDES. */
+ LOADSYSCALL(pipe)
+ ta 0x11
+ bcc,pn %xcc, 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/sparc64/profil-counter.h b/sysdeps/unix/sysv/linux/sparc64/profil-counter.h
new file mode 100644
index 0000000000..6a3f0a291a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/profil-counter.h
@@ -0,0 +1,26 @@
+/* Low-level statistical profiling support function. Linux/Sparc64 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.tpc);
+}
diff --git a/sysdeps/unix/sysv/linux/sparc64/setcontext.S b/sysdeps/unix/sysv/linux/sparc64/setcontext.S
new file mode 100644
index 0000000000..2968b65633
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/setcontext.S
@@ -0,0 +1,33 @@
+/* Copyright (C) 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. */
+
+#include <sysdep.h>
+
+
+/* void setcontext(ucontext_t *ctx); */
+.weak setcontext
+ENTRY(setcontext)
+
+ mov 1, %o1
+
+/* void __setcontext(ucontext_t *ctx, int restoremask); */
+ENTRY(__setcontext)
+
+ ta 0x6f
+
+END(__setcontext)
diff --git a/sysdeps/unix/sysv/linux/sparc64/setjmp.S b/sysdeps/unix/sysv/linux/sparc64/setjmp.S
new file mode 100644
index 0000000000..8b88b49ac4
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/setjmp.S
@@ -0,0 +1,48 @@
+/* Copyright (C) 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. */
+
+/* __sigsetjmp is implemented in terms of the getcontext trap on
+ Linux/Sparc64. */
+
+#include <sysdep.h>
+
+/* Offsets into the jmp_buf structure. */
+
+#define O_mask_was_saved 512
+#define O_gregs 32
+#define O_g1 (O_gregs + 4*8)
+
+
+/* int __sigsetjmp(jmp_buf, savemask) */
+
+ENTRY(__sigsetjmp)
+
+ /* Record whether the user is intending to save the sigmask. */
+ st %o1, [%o0 + O_mask_was_saved]
+
+ /* Load up our return value, as longjmp is going to override
+ the jmp_buf on its way back. */
+ mov %g0, %g1
+
+ /* And call getcontext! */
+ ta 0x6e
+
+ retl
+ mov %g1, %o0
+
+END(__sigsetjmp)
diff --git a/sysdeps/unix/sysv/linux/sparc64/sigjmp.S b/sysdeps/unix/sysv/linux/sparc64/sigjmp.S
new file mode 100644
index 0000000000..940ccbcf68
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/sigjmp.S
@@ -0,0 +1 @@
+/* There is no need for __sigjmp_save what with getcontext. */
diff --git a/sysdeps/unix/sysv/linux/sparc64/syscalls.list b/sysdeps/unix/sysv/linux/sparc64/syscalls.list
new file mode 100644
index 0000000000..66ba470994
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/syscalls.list
@@ -0,0 +1,26 @@
+# File name Caller Syscall name # args Strong name Weak names
+
+# Whee! 64-bit systems naturally implement llseek.
+llseek EXTRA lseek 3 llseek
+
+# Override select.S in parent directory:
+select - select 5 __select select
+accept - accept 3 __accept accept
+bind - bind 3 __bind bind
+connect - connect 3 __connect connect
+getpeername - getpeername 3 __getpeername getpeername
+getsockname - getsockname 3 __getsockname getsockname
+getsockopt - getsockopt 5 __getsockopt getsockopt
+listen - listen 2 __listen listen
+recv - recv 4 __recv recv
+recvfrom - recvfrom 6 __recvfrom recvfrom
+recvmsg - recvmsg 3 __recvmsg recvmsg
+send - send 4 __send send
+sendmsg - sendmsg 3 __sendmsg sendmsg
+sendto - sendto 6 __sendto sendto
+setsockopt - setsockopt 5 __setsockopt setsockopt
+shutdown - shutdown 2 __shutdown shutdown
+socketpair - socketpair 4 __socketpair socketpair
+
+# Another broken Linux/i386 idea layed to rest
+ptrace - ptrace 4 __ptrace ptrace
diff --git a/sysdeps/unix/sysv/linux/sparc64/sysdep.S b/sysdeps/unix/sysv/linux/sparc64/sysdep.S
new file mode 100644
index 0000000000..736578083c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/sysdep.S
@@ -0,0 +1,31 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Richard Henderson <richard@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. */
+
+
+/* Define errno */
+
+ .section .bss
+ .globl errno
+ .align 2
+errno: .space 4
+ .type errno, @object
+ .size errno, 4
+
+ .globl __errno
+__errno = errno
diff --git a/sysdeps/unix/sysv/linux/sparc64/sysdep.h b/sysdeps/unix/sysv/linux/sparc64/sysdep.h
new file mode 100644
index 0000000000..f01c1f43cd
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/sysdep.h
@@ -0,0 +1,116 @@
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Richard Henderson <richard@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. */
+
+#ifndef _LINUX_SPARC64_SYSDEP_H
+#define _LINUX_SPARC64_SYSDEP_H 1
+
+#include <sysdeps/unix/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_HANDLER1(R) \
+ .global C_SYMBOL_NAME(errno); \
+ .type C_SYMBOL_NAME(errno),@object; \
+0: rd %pc,%g1; \
+ sethi %hi(_GLOBAL_OFFSET_TABLE_-(0b-.)),%g2; \
+ add %g2,%lo(_GLOBAL_OFFSET_TABLE_-(0b-.)),%g2; \
+ add %g2,%g1,%g1; \
+ sethi %hi(errno),%g2; \
+ add %g2,%lo(errno),%g2; \
+ ldx [%g1+%g2],%g2; \
+ st R,[%g2]
+#else
+#define SYSCALL_ERROR_HANDLER1(R) \
+ .global C_SYMBOL_NAME(errno); \
+ .type C_SYMBOL_NAME(errno),@object; \
+ sethi %hi(errno),%g1; \
+ add %g1,%g4,%g1; \
+ st R,[%g1+%lo(errno)]
+#endif
+
+#ifdef _LIBC_REENTRANT
+#define SYSCALL_ERROR_HANDLER \
+ .global C_SYMBOL_NAME(__errno_location); \
+ .type C_SYMBOL_NAME(__errno_location),@function; \
+ save %sp,-128,%sp; \
+ SYSCALL_ERROR_HANDLER1(%i0); \
+ call __errno_location; \
+ nop; \
+ st %i0,[%o0]; \
+ sub %g0,1,%i0; \
+ jmpl %i7+8, %g0; \
+ restore
+#else
+#define SYSCALL_ERROR_HANDLER \
+ SYSCALL_ERROR_HANDLER1(%o0); \
+ retl; \
+ sub %g0,1,%i0
+#endif
+
+#define PSEUDO(name, syscall_name, args) \
+ .text; \
+ ENTRY(name); \
+ LOADSYSCALL(syscall_name); \
+ ta 0x11; \
+ bcc,pt %xcc,1f; \
+ nop; \
+ SYSCALL_ERROR_HANDLER; \
+1:
+
+#undef PSEUDO_END
+#define PSEUDO_END(name) \
+ .size name,.-name
+
+#undef END
+#define END(name) \
+ .size name,.-name
+
+/* Careful here! This "ret" define can interfere; use jmpl if unsure. */
+#define ret retl; nop
+#define r0 %o0
+#define r1 %o1
+#define MOVE(x,y) mov x, y
+
+#endif /* ASSEMBLER */
+
+/* This is the offset from the %sp to the backing store above the
+ register windows. So if you poke stack memory directly you add this. */
+#define STACK_BIAS 2047
+
+#endif /* linux/sparc64/sysdep.h */
diff --git a/sysdeps/unix/sysv/linux/sparc64/ucontext.h b/sysdeps/unix/sysv/linux/sparc64/ucontext.h
new file mode 100644
index 0000000000..160e2fc43a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc64/ucontext.h
@@ -0,0 +1,67 @@
+#ifndef _UCONTEXT_H
+#define _UCONTEXT_H
+
+#include <signal.h>
+
+#define MC_TSTATE 0
+#define MC_PC 1
+#define MC_NPC 2
+#define MC_Y 3
+#define MC_G1 4
+#define MC_G2 5
+#define MC_G3 6
+#define MC_G4 7
+#define MC_G5 8
+#define MC_G6 9
+#define MC_G7 10
+#define MC_O0 11
+#define MC_O1 12
+#define MC_O2 13
+#define MC_O3 14
+#define MC_O4 15
+#define MC_O5 16
+#define MC_O6 17
+#define MC_O7 18
+#define MC_NGREG 19
+
+typedef unsigned long mc_greg_t;
+typedef mc_greg_t mc_gregset_t[MC_NGREG];
+
+#define MC_MAXFPQ 16
+struct mc_fq {
+ unsigned long *mcfq_addr;
+ unsigned int mcfq_insn;
+};
+
+struct mc_fpu {
+ union {
+ unsigned int sregs[32];
+ unsigned long dregs[32];
+ long double qregs[16];
+ } mcfpu_fregs;
+ unsigned long mcfpu_fsr;
+ unsigned long mcfpu_fprs;
+ unsigned long mcfpu_gsr;
+ struct mc_fq *mcfpu_fq;
+ unsigned char mcfpu_qcnt;
+ unsigned char mcfpu_qentsz;
+ unsigned char mcfpu_enab;
+};
+typedef struct mc_fpu mc_fpu_t;
+
+typedef struct {
+ mc_gregset_t mc_gregs;
+ mc_greg_t mc_fp;
+ mc_greg_t mc_i7;
+ mc_fpu_t mc_fpregs;
+} mcontext_t;
+
+struct ucontext {
+ struct ucontext *uc_link;
+ unsigned long uc_flags;
+ unsigned long uc_sigmask;
+ mcontext_t uc_mcontext;
+};
+typedef struct ucontext ucontext_t;
+
+#endif /* ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/syscalls.list b/sysdeps/unix/sysv/linux/syscalls.list
index 5d91a2edfe..f11370d6cb 100644
--- a/sysdeps/unix/sysv/linux/syscalls.list
+++ b/sysdeps/unix/sysv/linux/syscalls.list
@@ -13,6 +13,7 @@ geteuid - geteuid 0 __geteuid geteuid
getpgid - getpgid 1 __getpgid getpgid
getpgrp - getpgrp 0 getpgrp
getppid - getppid 0 __getppid getppid
+getresgid EXTRA getresgid 3 getresgid
getresuid EXTRA getresuid 3 getresuid
getsid - getsid 1 getsid
init_module EXTRA init_module 5 init_module
@@ -54,6 +55,7 @@ select - _newselect 5 __select select
setfsgid EXTRA setfsgid 1 setfsgid
setfsuid EXTRA setfsuid 1 setfsuid
setpgid - setpgid 2 __setpgid setpgid
+setresgid EXTRA setresgid 3 setresgid
setresuid EXTRA setresuid 3 setresuid
sigpending - sigpending 1 sigpending
sigprocmask - sigprocmask 3 __sigprocmask sigprocmask