diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux/sparc')
43 files changed, 1102 insertions, 13 deletions
diff --git a/sysdeps/unix/sysv/linux/sparc/bits/sigaction.h b/sysdeps/unix/sysv/linux/sparc/bits/sigaction.h index 19aa7e39cb..13471995b9 100644 --- a/sysdeps/unix/sysv/linux/sparc/bits/sigaction.h +++ b/sysdeps/unix/sysv/linux/sparc/bits/sigaction.h @@ -27,26 +27,29 @@ struct sigaction __sigset_t sa_mask; /* Special flags. */ - unsigned int sa_flags; + unsigned long sa_flags; + + /* Not used by Linux/Sparc yet. */ + void (*sa_restorer)(void); }; /* Bits in `sa_flags'. */ -#define SA_NOCLDSTOP 0x00000008 /* Don't send SIGCHLD when children stop. */ +#define SA_NOCLDSTOP 0x00000008 /* Don't send SIGCHLD when children stop. */ #ifdef __USE_MISC -#define SA_STACK 0x00000001 /* Use signal stack by using `sa_restorer'. */ -#define SA_RESTART 0x00000002 /* Don't restart syscall on signal return. */ -#define SA_INTERRUPT 0x00000010 /* Historical no-op. */ -#define SA_NOMASK 0x00000020 /* Don't automatically block the signal when - its handler is being executed. */ -#define SA_ONESHOT 0x00000004 /* Reset to SIG_DFL on entry to handler. */ +# define SA_STACK 0x00000001 /* Use signal stack by using `sa_restorer'. */ +# define SA_RESTART 0x00000002 /* Restart syscall on signal return. */ +# define SA_INTERRUPT 0x00000010 /* Historical no-op. */ +# define SA_NOMASK 0x00000020 /* Don't automatically block the signal when + its handler is being executed. */ +# define SA_ONESHOT 0x00000004 /* Reset to SIG_DFL on entry to handler. */ /* Some aliases for the SA_ constants. */ -#define SA_NODEFER SA_NOMASK -#define SA_RESETHAND SA_ONESHOT +# define SA_NODEFER SA_NOMASK +# define SA_RESETHAND SA_ONESHOT #endif /* Values for the HOW argument to `sigprocmask'. */ -#define SIG_BLOCK 1 /* Block signals. */ -#define SIG_UNBLOCK 2 /* Unblock signals. */ -#define SIG_SETMASK 4 /* Set the set of blocked signals. */ +#define SIG_BLOCK 1 /* Block signals. */ +#define SIG_UNBLOCK 2 /* Unblock signals. */ +#define SIG_SETMASK 4 /* Set the set of blocked signals. */ diff --git a/sysdeps/unix/sysv/linux/sparc/Dist b/sysdeps/unix/sysv/linux/sparc/sparc32/Dist index 9729f0709b..9729f0709b 100644 --- a/sysdeps/unix/sysv/linux/sparc/Dist +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/Dist diff --git a/sysdeps/unix/sysv/linux/sparc/Makefile b/sysdeps/unix/sysv/linux/sparc/sparc32/Makefile index 4cbd3bd004..4cbd3bd004 100644 --- a/sysdeps/unix/sysv/linux/sparc/Makefile +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/Makefile diff --git a/sysdeps/unix/sysv/linux/sparc/__sigtrampoline.S b/sysdeps/unix/sysv/linux/sparc/sparc32/__sigtrampoline.S index a639511f3e..a639511f3e 100644 --- a/sysdeps/unix/sysv/linux/sparc/__sigtrampoline.S +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/__sigtrampoline.S diff --git a/sysdeps/unix/sysv/linux/sparc/bits/mman.h b/sysdeps/unix/sysv/linux/sparc/sparc32/bits/mman.h index 3e7f2900fa..3e7f2900fa 100644 --- a/sysdeps/unix/sysv/linux/sparc/bits/mman.h +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/bits/mman.h diff --git a/sysdeps/unix/sysv/linux/sparc/brk.c b/sysdeps/unix/sysv/linux/sparc/sparc32/brk.c index 8f079bf444..8f079bf444 100644 --- a/sysdeps/unix/sysv/linux/sparc/brk.c +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/brk.c diff --git a/sysdeps/unix/sysv/linux/sparc/clone.S b/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S index 64735e9dbc..64735e9dbc 100644 --- a/sysdeps/unix/sysv/linux/sparc/clone.S +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S diff --git a/sysdeps/unix/sysv/linux/sparc/fork.S b/sysdeps/unix/sysv/linux/sparc/sparc32/fork.S index 951ab4981b..951ab4981b 100644 --- a/sysdeps/unix/sysv/linux/sparc/fork.S +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/fork.S diff --git a/sysdeps/unix/sysv/linux/sparc/init-first.h b/sysdeps/unix/sysv/linux/sparc/sparc32/init-first.h index 39822fc595..39822fc595 100644 --- a/sysdeps/unix/sysv/linux/sparc/init-first.h +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/init-first.h diff --git a/sysdeps/unix/sysv/linux/sparc/kernel_stat.h b/sysdeps/unix/sysv/linux/sparc/sparc32/kernel_stat.h index 91f02f4e20..91f02f4e20 100644 --- a/sysdeps/unix/sysv/linux/sparc/kernel_stat.h +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/kernel_stat.h diff --git a/sysdeps/unix/sysv/linux/sparc/pipe.S b/sysdeps/unix/sysv/linux/sparc/sparc32/pipe.S index 4c50656d6c..4c50656d6c 100644 --- a/sysdeps/unix/sysv/linux/sparc/pipe.S +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/pipe.S diff --git a/sysdeps/unix/sysv/linux/sparc/profil-counter.h b/sysdeps/unix/sysv/linux/sparc/sparc32/profil-counter.h index 1bd06482c9..1bd06482c9 100644 --- a/sysdeps/unix/sysv/linux/sparc/profil-counter.h +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/profil-counter.h diff --git a/sysdeps/unix/sysv/linux/sparc/sigaction.c b/sysdeps/unix/sysv/linux/sparc/sparc32/sigaction.c index d39eb7cc76..d39eb7cc76 100644 --- a/sysdeps/unix/sysv/linux/sparc/sigaction.c +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/sigaction.c diff --git a/sysdeps/unix/sysv/linux/sparc/socket.S b/sysdeps/unix/sysv/linux/sparc/sparc32/socket.S index bdfc2fcc6d..bdfc2fcc6d 100644 --- a/sysdeps/unix/sysv/linux/sparc/socket.S +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/socket.S diff --git a/sysdeps/unix/sysv/linux/sparc/syscall.S b/sysdeps/unix/sysv/linux/sparc/sparc32/syscall.S index 3921ca52dc..3921ca52dc 100644 --- a/sysdeps/unix/sysv/linux/sparc/syscall.S +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/syscall.S diff --git a/sysdeps/unix/sysv/linux/sparc/syscalls.list b/sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list index 7883d70719..7883d70719 100644 --- a/sysdeps/unix/sysv/linux/sparc/syscalls.list +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list diff --git a/sysdeps/unix/sysv/linux/sparc/sysdep.S b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.S index 7e9023901b..7e9023901b 100644 --- a/sysdeps/unix/sysv/linux/sparc/sysdep.S +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.S diff --git a/sysdeps/unix/sysv/linux/sparc/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h index 0e5a8cd218..0e5a8cd218 100644 --- a/sysdeps/unix/sysv/linux/sparc/sysdep.h +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/Dist b/sysdeps/unix/sysv/linux/sparc/sparc64/Dist new file mode 100644 index 0000000000..e770e20eb9 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/Dist @@ -0,0 +1,7 @@ +bits/mman.h +clone.S +kernel_stat.h +getcontext.S +setcontext.S +ucontext.h +init-first.h diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile b/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile new file mode 100644 index 0000000000..c4d83226a2 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/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/sparc/sparc64/__longjmp.S b/sysdeps/unix/sysv/linux/sparc/sparc64/__longjmp.S new file mode 100644 index 0000000000..3107179fdc --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/__longjmp.S @@ -0,0 +1 @@ +/* There is no need for __longjmp what with setcontext. */ diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/bits/mman.h b/sysdeps/unix/sysv/linux/sparc/sparc64/bits/mman.h new file mode 100644 index 0000000000..3e7f2900fa --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/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/sparc64/bits/setjmp.h b/sysdeps/unix/sysv/linux/sparc/sparc64/bits/setjmp.h new file mode 100644 index 0000000000..ab850e5301 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/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/sparc/sparc64/bits/types.h b/sysdeps/unix/sysv/linux/sparc/sparc64/bits/types.h new file mode 100644 index 0000000000..222967881f --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/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/sparc/sparc64/brk.S b/sysdeps/unix/sysv/linux/sparc/sparc64/brk.S new file mode 100644 index 0000000000..abdd7e6604 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/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: call 2f + sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 +2: or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 + add %l7, %o7, %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/sparc/sparc64/bsd-_setjmp.S b/sysdeps/unix/sysv/linux/sparc/sparc64/bsd-_setjmp.S new file mode 100644 index 0000000000..4e6a2da560 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/bsd-_setjmp.S @@ -0,0 +1 @@ +/* _setjmp is in setjmp.S */ diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/bsd-setjmp.S b/sysdeps/unix/sysv/linux/sparc/sparc64/bsd-setjmp.S new file mode 100644 index 0000000000..1da848d2f1 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/bsd-setjmp.S @@ -0,0 +1 @@ +/* setjmp is in setjmp.S */ diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/clone.S b/sysdeps/unix/sysv/linux/sparc/sparc64/clone.S new file mode 100644 index 0000000000..a5cb1a4c4a --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/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 + call 1f + sethi %hi(_GLOBAL_OFFSET_TABLE_-(99b-.)), %l7 +1: or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(99b-.)), %l7 + add %l7, %o7, %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/sparc/sparc64/fork.S b/sysdeps/unix/sysv/linux/sparc/sparc64/fork.S new file mode 100644 index 0000000000..c735da5a44 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/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., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, 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/sparc/sparc64/getcontext.S b/sysdeps/unix/sysv/linux/sparc/sparc64/getcontext.S new file mode 100644 index 0000000000..05b06269e4 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/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/sparc/sparc64/init-first.h b/sysdeps/unix/sysv/linux/sparc/sparc64/init-first.h new file mode 100644 index 0000000000..3e27c6dcf7 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/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, -128, %sp +1: call 11f + sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 +11: 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), %l2 + or %l2, %lo(_dl_starting_up), %l2 + ldx [%l7+%l2], %l2 + brz,pn %l2, 3f + sethi %hi(__libc_multiple_libcs), %l3 + ld [%l2], %l4 + mov %g0, %l2 + movrz %l4, 1, %l2 +3: or %l3, %lo(__libc_multiple_libcs), %l3 + ldx [%l7+%l3], %l3 + st %l2, [%l3] + /* If so, argc et al are in %o0-%o2 already. Otherwise, load them. */ + brnz,pn %l2, " #INIT " + restore + ldx [%sp+" __S(STACK_BIAS) "+22*8], %o0 + add %sp, " __S(STACK_BIAS) "+23*8, %o1 + sll %o0, 3, %o2 + add %o2, %o1, %o2 + ba " #INIT " + add %o2, 8, %o2 + .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], %g1 + mov %g0, %g2 + movrz %g1, 1, %g2 +3: or %g3, %lo(__libc_multiple_libcs), %g3 + st %g2, [%g3+%g4] + /* If so, argc et al are in %o0-%o2 already. Otherwise, load them. */ + brnz,pn %g2, " #INIT " + nop + ldx [%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/sparc/sparc64/kernel_stat.h b/sysdeps/unix/sysv/linux/sparc/sparc64/kernel_stat.h new file mode 100644 index 0000000000..fcb752e3ec --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/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/sparc/sparc64/longjmp.S b/sysdeps/unix/sysv/linux/sparc/sparc64/longjmp.S new file mode 100644 index 0000000000..c4563776b6 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/longjmp.S @@ -0,0 +1,46 @@ +/* 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) + +strong_alias(longjmp, __longjmp) diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/pipe.S b/sysdeps/unix/sysv/linux/sparc/sparc64/pipe.S new file mode 100644 index 0000000000..82ff4eae3c --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/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/sparc/sparc64/profil-counter.h b/sysdeps/unix/sysv/linux/sparc/sparc64/profil-counter.h new file mode 100644 index 0000000000..6a3f0a291a --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/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/sparc/sparc64/setcontext.S b/sysdeps/unix/sysv/linux/sparc/sparc64/setcontext.S new file mode 100644 index 0000000000..2968b65633 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/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/sparc/sparc64/setjmp.S b/sysdeps/unix/sysv/linux/sparc/sparc64/setjmp.S new file mode 100644 index 0000000000..fcc5cb5a48 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/setjmp.S @@ -0,0 +1,67 @@ +/* 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 _setjmp(jmp_buf) */ + +.weak _setjmp +ENTRY(_setjmp) + + ba __sigsetjmp_local + set 0, %o1 + +END(setjmp) + +/* int setjmp(jmp_buf) */ + +.weak setjmp +ENTRY(setjmp) + + set 1, %o1 + +END(setjmp) + +/* int __sigsetjmp(jmp_buf, savemask) */ + +ENTRY(__sigsetjmp) +__sigsetjmp_local: + + /* 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/sparc/sparc64/sigjmp.S b/sysdeps/unix/sysv/linux/sparc/sparc64/sigjmp.S new file mode 100644 index 0000000000..940ccbcf68 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/sigjmp.S @@ -0,0 +1 @@ +/* There is no need for __sigjmp_save what with getcontext. */ diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S b/sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S new file mode 100644 index 0000000000..30dace5903 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S @@ -0,0 +1,39 @@ +/* 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 <sysdep.h> + .text + +ENTRY (syscall) + + mov %o0,%g1 + mov %o1,%o0 + mov %o2,%o1 + mov %o3,%o2 + mov %o4,%o3 + mov %o5,%o4 + + ta 0x11 + + bcc,pt %xcc,1f + nop + SYSCALL_ERROR_HANDLER + +1: retl + +PSEUDO_END (syscall) diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list b/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list new file mode 100644 index 0000000000..66ba470994 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/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/sparc/sparc64/sysdep.S b/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.S new file mode 100644 index 0000000000..736578083c --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/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/sparc/sparc64/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h new file mode 100644 index 0000000000..c880e4a2dc --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h @@ -0,0 +1,138 @@ +/* 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 +# ifdef _LIBC_REENTRANT +# define SYSCALL_ERROR_HANDLER \ + .global C_SYMBOL_NAME(errno); \ + .type C_SYMBOL_NAME(errno),@object; \ + save %sp,-160,%sp; \ + 101: call 102f; \ + sethi %hi(_GLOBAL_OFFSET_TABLE_-(101b-.)),%g2; \ + 102: or %g2,%lo(_GLOBAL_OFFSET_TABLE_-(101b-.)),%g2; \ + sethi %hi(errno),%i1; \ + add %g2,%o7,%l7; \ + or %i1,%lo(errno),%i1; \ + ldx [%l7+%i1],%g2; \ + st %i0,[%g2]; \ + call __errno_location; \ + nop; \ + st %i0,[%o0]; \ + sub %g0,1,%i0; \ + jmpl %i7+8, %g0; \ + restore +# else +# define SYSCALL_ERROR_HANDLER \ + .global C_SYMBOL_NAME(errno); \ + .type C_SYMBOL_NAME(errno),@object; \ + mov %o7,%g3; \ + 101: call 102f; \ + sethi %hi(_GLOBAL_OFFSET_TABLE_-(101b-.)),%g2; \ + 102: or %g2,%lo(_GLOBAL_OFFSET_TABLE_-(101b-.)),%g2; \ + sethi %hi(errno),%o1; \ + add %g2,%o7,%l7; \ + or %o1,%lo(errno),%o1; \ + mov %g3,%o7; \ + ldx [%l7+%o1],%g2; \ + st %o0,[%g2] +# endif +#else +# ifdef _LIBC_REENTRANT +# define SYSCALL_ERROR_HANDLER \ + .global C_SYMBOL_NAME(errno); \ + .type C_SYMBOL_NAME(errno),@object; \ + save %sp,-160,%sp; \ + sethi %hi(errno),%g1; \ + or %g1,%lo(errno),%g1; \ + st %i0,[%g1+%g4]; \ + call __errno_location; \ + nop; \ + st %i0,[%o0]; \ + sub %g0,1,%i0; \ + jmpl %i7+8, %g0; \ + restore +# else +# define SYSCALL_ERROR_HANDLER \ + .global C_SYMBOL_NAME(errno); \ + .type C_SYMBOL_NAME(errno),@object; \ + sethi %hi(errno),%g1; \ + or %g1,%lo(errno),%g1; \ + st %i0,[%g1+%g4]; \ + retl; \ + sub %g0,1,%i0 +# endif +#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/sparc/sparc64/ucontext.h b/sysdeps/unix/sysv/linux/sparc/sparc64/ucontext.h new file mode 100644 index 0000000000..160e2fc43a --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/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 */ |