diff options
Diffstat (limited to 'sysdeps/unix')
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 |