From 9c4c002459bd2665ac1ad544e56952ec7797e8dd Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Wed, 16 Sep 1998 17:54:34 +0000 Subject: Update. 1998-09-14 Andreas Jaeger * sysdeps/mach/hurd/dl-cache.c (_dl_unload_cache): New dummy function. Reported by okuji@kuicr.kyoto-u.ac.jp [PR libc/789]. 1998-09-15 David S. Miller * sysdeps/sparc/sparc32/dl-machine.h (elf_machine_runtime_setup): Add profiling support. (TRAMPOLINE_TEMPLATE): New macro. (ELF_MACHINE_RUNTIME_TRAMPOLINE): Define in terms of that. (RTLD_START): Prettify, and set __libc_stack_end properly. (elf_machine_rela) [R_SPARC_COPY]: Remove RTLD_BOOTSTRAP ifndef and check for sym being NULL instead. * sysdeps/sparc/sparc64/addmul_1.S: Adjust to allocate 192 bytes of stack space. * sysdeps/sparc/sparc64/lshift.S: Likewise. * sysdeps/sparc/sparc64/mul_1.S: Likewise. * sysdeps/sparc/sparc64/rshift.S: Likewise. * sysdeps/sparc/sparc64/submul_1.S: Likewise. * sysdeps/sparc/sparc64/elf/crtbegin.S: Likewise and remove old MEDANY code model %g4 usage. * sysdeps/sparc/sparc64/elf/crtend.S: Likewise and remove old MEDANY code model %g4 usage. * sysdeps/sparc/sparc64/elf/start.S: Rework to not use old FULLANY code model address formation. * sysdeps/sparc/sparc64/dl-machine.h: Don't include link.h, do include elf/ldsodefs.h (DT_SPARC): Remove. (elf_machine_matches_host): It is now EM_SPARCV9. (elf_machine_dynamic): Clean up to remove ugly cast. (elf_machine_fixup_plt): Rework for new V9 ABI, add support for new PLT formats. (elf_machine_rela): Don't do anything at all for R_SPARC_NONE. Prettify rest of function. [R_SPARC_COPY]: Check for sym being NULL. [R_SPARC_32]: Handle it. [R_SPARC_H44, R_SPARC_M44, R_SPARC_L44]: Handle them for the MEDMID code model. [R_SPARC_HH22, R_SPARC_HM10, R_SPARC_LM22]: Handle them for the MEDANY code model. [R_SPARC_NONE]: Remove this case, as it is now checked earlier. (elf_machine_runtime_setup): Rewrite for new V9 ABI plt formats. Add profiling support. (TRAMPOLINE_TEMPLATE): New macro. (ELF_MACHINE_RUNTIME_TRAMPOLINE): Define in terms of that. (RTLD_START): Prettify and set __libc_stack_end. * sysdeps/unix/sysv/linux/sparc/bits/sigaction.h (SA_SIGINFO): Define. * sysdeps/unix/sysv/linux/sparc/bits/signum.h (_NSIG): Set to 64. (SIGRTMIN, SIGRTMAX, __SIGRTMIN, __SIGRTMAX): Define. * sysdeps/unix/sysv/linux/sparc/sparc32/brk.c (__brk): Remove unused variable scratch. * sysdeps/unix/sysv/linux/sparc/sparc32/sigaction.c (__syscall_rt_sigaction, __rt_sigreturn_stub, __sigreturn_stub): Declare. (__sigaction): Rewrite rt_sigaction case to pass correct sigreturn stub to rt_sigaction syscalls. Rewrite non-rt case to use correct old format kernel sigaction structures. * sysdeps/unix/sysv/linux/sparc/sparc64/ucontext.h: Move... * sysdeps/unix/sysv/linux/sparc/sparc64/sys/ucontext.h: to here. * sysdeps/unix/sysv/linux/sparc/sparc64/Dist: Remove ucontext.h * sysdeps/unix/sysv/linux/sparc/sparc64/bits/setjmp.h: Fix ucontext include. (_JMPBUF_UNWINDS): Define. * sysdeps/unix/sysv/linux/sparc/sparc64/bits/statfs.h: Declare statfs64 structure, which is exactly the same as the normal one. * sysdeps/unix/sysv/linux/sparc/sparc64/brk.S: Allocate 192 bytes of stack. Use correct syscall trap number. Add branch prediction settings to branch instructions. Remove old MEDANY code model %g4 referneces for non-PIC. * sysdeps/unix/sysv/linux/sparc/sparc64/clone.S: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/init-first.h: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/pipe.S: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/longjmp.S: Add __libc_longjmp and __libc_siglongjmp strong aliases. * sysdeps/unix/sysv/linux/sparc/sparc64/readdir.c (__readdir64): Also define to __no__readdir64_decl around readdir.c inclusion. (__readdir64): Add strong alias. * sysdeps/unix/sysv/linux/sparc/sparc64/socket.S: New file. * sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list (getrlimit): Set strong and weak names properly. 1998-09-16 11:25 Andreas Schwab * manual/Makefile (AWK): Default to gawk if standalone. 1998-09-15 Andreas Schwab * Makefile (distribute): Undo last change. * Make-dist (+tsrc) [not subdir]: Also include indirection headers for sysdep headers. (+subdir-headers): Removed, unused. 1998-09-15 Andreas Schwab * stdio-common/Makefile ($(inst_includedir)/bits/stdio_lim.h): Use $(do-install). 1998-09-15 Andreas Schwab * Makerules ($(+sysdir_pfx)sysd-Makefile): Don't check for absolute name in $(config-sysdirs), can never happen. ($(+sysdir_pfx)sysd-rules): Likewise. * Makeconfig (full-config-sysdirs): Likewise. (all-Subdirs-files): Prepend $(..). * configure.in: Don't check for absolute name in $add_ons_pfx, can not happen. Let --enable-add-ons=yes work if no add-ons actually exist. 1998-09-15 Andreas Schwab * Rules ($(common-objpfx)bits/stdio_%.h): Remove extra continuations in command. 1998-09-15 Andreas Schwab * libio/oldstdfiles.c (_IO_stdin_used): Update declaration. --- sysdeps/unix/sysv/linux/sparc/bits/sigaction.h | 2 + sysdeps/unix/sysv/linux/sparc/bits/signum.h | 13 ++- sysdeps/unix/sysv/linux/sparc/sparc32/brk.c | 2 +- sysdeps/unix/sysv/linux/sparc/sparc32/sigaction.c | 92 ++++++++++++++++++---- sysdeps/unix/sysv/linux/sparc/sparc64/Dist | 1 - .../unix/sysv/linux/sparc/sparc64/bits/setjmp.h | 7 +- .../unix/sysv/linux/sparc/sparc64/bits/statfs.h | 16 ++++ sysdeps/unix/sysv/linux/sparc/sparc64/brk.S | 15 ++-- sysdeps/unix/sysv/linux/sparc/sparc64/clone.S | 7 +- sysdeps/unix/sysv/linux/sparc/sparc64/init-first.h | 7 +- sysdeps/unix/sysv/linux/sparc/sparc64/longjmp.S | 2 + sysdeps/unix/sysv/linux/sparc/sparc64/pipe.S | 2 +- sysdeps/unix/sysv/linux/sparc/sparc64/readdir.c | 3 + .../unix/sysv/linux/sparc/sparc64/sys/ucontext.h | 67 ++++++++++++++++ sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S | 2 +- .../unix/sysv/linux/sparc/sparc64/syscalls.list | 2 +- sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h | 53 ++++++------- sysdeps/unix/sysv/linux/sparc/sparc64/ucontext.h | 67 ---------------- 18 files changed, 227 insertions(+), 133 deletions(-) create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/sys/ucontext.h delete mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/ucontext.h (limited to 'sysdeps/unix/sysv') diff --git a/sysdeps/unix/sysv/linux/sparc/bits/sigaction.h b/sysdeps/unix/sysv/linux/sparc/bits/sigaction.h index 1858ef4857..3e4e855915 100644 --- a/sysdeps/unix/sysv/linux/sparc/bits/sigaction.h +++ b/sysdeps/unix/sysv/linux/sparc/bits/sigaction.h @@ -40,6 +40,8 @@ struct sigaction /* Bits in `sa_flags'. */ #define SA_NOCLDSTOP 0x00000008 /* Don't send SIGCHLD when children stop. */ +#define SA_SIGINFO 0x00000200 /* Invoke signal-catching function with + three arguments instead of one. */ #ifdef __USE_MISC # define SA_STACK 0x00000001 /* Use signal stack by using `sa_restorer'. */ # define SA_RESTART 0x00000002 /* Restart syscall on signal return. */ diff --git a/sysdeps/unix/sysv/linux/sparc/bits/signum.h b/sysdeps/unix/sysv/linux/sparc/bits/signum.h index fae3826023..976eef2758 100644 --- a/sysdeps/unix/sysv/linux/sparc/bits/signum.h +++ b/sysdeps/unix/sysv/linux/sparc/bits/signum.h @@ -32,8 +32,6 @@ * Linux/SPARC has different signal numbers that Linux/i386: I'm trying * to make it OSF/1 binary compatible, at least for normal binaries. */ -#define _NSIG 32 /* Biggest signal number + 1. */ - #define SIGHUP 1 #define SIGINT 2 #define SIGQUIT 3 @@ -70,4 +68,15 @@ #define SIGUSR1 30 #define SIGUSR2 31 +#define _NSIG 64 /* Biggest signal number + 1 + (including real-time signals). */ + +#define SIGRTMIN (__libc_current_sigrtmin ()) +#define SIGRTMAX (__libc_current_sigrtmax ()) + +/* These are the hard limits of the kernel. These values should not be + used directly at user level. */ +#define __SIGRTMIN 32 +#define __SIGRTMAX (_NSIG - 1) + #endif /* included. */ diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/brk.c b/sysdeps/unix/sysv/linux/sparc/sparc32/brk.c index 7e784cab8f..4d38631a19 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/brk.c +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/brk.c @@ -33,7 +33,7 @@ weak_alias (__curbrk, ___brk_addr) int __brk (void *addr) { - void *newbrk, *scratch; + void *newbrk; { register void *o0 __asm__("%o0") = addr; diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/sigaction.c b/sysdeps/unix/sysv/linux/sparc/sparc32/sigaction.c index 742ac5583c..ae44328fad 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/sigaction.c +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/sigaction.c @@ -23,6 +23,13 @@ #include #include +extern int __syscall_rt_sigaction (int, const struct kernel_sigaction *, + struct kernel_sigaction *, unsigned long, + size_t); + +static void __rt_sigreturn_stub (void); +static void __sigreturn_stub (void); + /* The variable is shared between all wrappers around signal handling functions which have RT equivalents. */ int __libc_missing_rt_sigs; @@ -30,8 +37,49 @@ int __libc_missing_rt_sigs; int __sigaction (int sig, __const struct sigaction *act, struct sigaction *oact) { + struct old_kernel_sigaction k_sigact, k_osigact; int ret; - struct kernel_sigaction k_sigact, k_osigact; + + /* First try the RT signals. */ + if (!__libc_missing_rt_sigs) + { + struct kernel_sigaction kact, koact; + unsigned long stub = 0; + int saved_errno = errno; + + if (act) + { + kact.k_sa_handler = act->sa_handler; + memcpy (&kact.sa_mask, &act->sa_mask, sizeof (sigset_t)); + if (((kact.sa_flags = act->sa_flags) & SA_SIGINFO) != 0) + stub = (unsigned long) &__rt_sigreturn_stub; + else + stub = (unsigned long) &__sigreturn_stub; + stub -= 8; + kact.sa_restorer = NULL; + } + + /* XXX The size argument hopefully will have to be changed to the + real size of the user-level sigset_t. */ + ret = __syscall_rt_sigaction (sig, act ? &kact : 0, + oact ? &koact : 0, + stub, _NSIG / 8); + + if (ret >= 0 || errno != ENOSYS) + { + if (oact && ret >= 0) + { + oact->sa_handler = koact.k_sa_handler; + memcpy (&oact->sa_mask, &koact.sa_mask, sizeof (sigset_t)); + oact->sa_flags = koact.sa_flags; + oact->sa_restorer = koact.sa_restorer; + } + return ret; + } + + __set_errno (saved_errno); + __libc_missing_rt_sigs = 1; + } /* Magic to tell the kernel we are using "new-style" signals, in that the signal table is not kept in userspace. Not the same as the @@ -41,15 +89,16 @@ __sigaction (int sig, __const struct sigaction *act, struct sigaction *oact) if (act) { k_sigact.k_sa_handler = act->sa_handler; - memcpy (&k_sigact.sa_mask, &act->sa_mask, sizeof (sigset_t)); + k_sigact.sa_mask = act->sa_mask.__val[0]; k_sigact.sa_flags = act->sa_flags; + k_sigact.sa_restorer = NULL; } { register int r_syscallnr __asm__("%g1") = __NR_sigaction; register int r_sig __asm__("%o0") = sig; - register struct kernel_sigaction *r_act __asm__("%o1"); - register struct kernel_sigaction *r_oact __asm__("%o2"); + register struct old_kernel_sigaction *r_act __asm__("%o1"); + register struct old_kernel_sigaction *r_oact __asm__("%o2"); r_act = act ? &k_sigact : NULL; r_oact = oact ? &k_osigact : NULL; @@ -57,7 +106,7 @@ __sigaction (int sig, __const struct sigaction *act, struct sigaction *oact) __asm__ __volatile__("t 0x10\n\t" "bcc 1f\n\t" " nop\n\t" - " sub %%g0,%%o0,%%o0\n" + "sub %%g0,%%o0,%%o0\n" "1:" : "=r"(r_sig) : "r"(r_syscallnr), "r"(r_act), "r"(r_oact), @@ -66,16 +115,13 @@ __sigaction (int sig, __const struct sigaction *act, struct sigaction *oact) ret = r_sig; } - if (ret >= 0) + if (oact && ret >= 0) { - if (oact) - { - oact->sa_handler = k_osigact.k_sa_handler; - memcpy (&oact->sa_mask, &k_osigact.sa_mask, sizeof (sigset_t)); - oact->sa_flags = k_osigact.sa_flags; - oact->sa_restorer = NULL; - } - return 0; + oact->sa_handler = k_osigact.k_sa_handler; + oact->sa_mask.__val[0] = k_osigact.sa_mask; + oact->sa_flags = k_osigact.sa_flags; + oact->sa_restorer = NULL; + return ret; } __set_errno (-ret); @@ -83,3 +129,21 @@ __sigaction (int sig, __const struct sigaction *act, struct sigaction *oact) } weak_alias (__sigaction, sigaction); + +static void +__rt_sigreturn_stub (void) +{ + __asm__ ("mov %0, %%g1\n\t" + "ta 0x10\n\t" + : /* no outputs */ + : "i" (__NR_rt_sigreturn)); +} + +static void +__sigreturn_stub (void) +{ + __asm__ ("mov %0, %%g1\n\t" + "ta 0x10\n\t" + : /* no outputs */ + : "i" (__NR_sigreturn)); +} diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/Dist b/sysdeps/unix/sysv/linux/sparc/sparc64/Dist index 50f83311cd..c22b73ebd2 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/Dist +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/Dist @@ -4,5 +4,4 @@ kernel_stat.h getcontext.S setcontext.S sizes.h -ucontext.h init-first.h diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/bits/setjmp.h b/sysdeps/unix/sysv/linux/sparc/sparc64/bits/setjmp.h index b200b718d2..e51f81a5a0 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/bits/setjmp.h +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/bits/setjmp.h @@ -21,6 +21,11 @@ # error "Never include directly; use instead." #endif -#include +#include typedef ucontext_t __jmp_buf[1]; + +/* Test if longjmp to JMPBUF would unwind the frame + containing a local variable at ADDRESS. */ +#define _JMPBUF_UNWINDS(jmpbuf, address) \ + ((unsigned long int) (address) < (jmpbuf)->uc_mcontext.mc_fp) diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/bits/statfs.h b/sysdeps/unix/sysv/linux/sparc/sparc64/bits/statfs.h index 9027eca2ac..b6178f5a8e 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/bits/statfs.h +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/bits/statfs.h @@ -39,4 +39,20 @@ struct statfs long int f_spare[6]; }; +/* We already use 64-bit types in the normal structure, + so this is the same as the above. */ +struct statfs64 + { + long int f_type; + long int f_bsize; + long int f_blocks; + long int f_bfree; + long int f_bavail; + long int f_files; + long int f_ffree; + __fsid_t f_fsid; + long int f_namelen; + long int f_spare[6]; + }; + #endif /* bits/statfs.h */ diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/brk.S b/sysdeps/unix/sysv/linux/sparc/sparc64/brk.S index 333f9916f8..e21b60d637 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/brk.S +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/brk.S @@ -38,7 +38,7 @@ __curbrk: .skip 8 .text ENTRY(__brk) - save %sp, -160, %sp + save %sp, -192, %sp #ifdef PIC 1: call 2f sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 @@ -49,24 +49,23 @@ ENTRY(__brk) LOADSYSCALL(brk) mov %i0, %o0 - ta 0x11 + ta 0x6d /* All the ways we can fail... */ bcs,pn %xcc, .Lerr1 nop - brz %i0, .Lok + brz,pt %i0, .Lok subcc %i0, %o0, %g0 bne,pn %xcc, .Lerr0 + nop /* 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 + stx %o0, [%g1] mov %g0, %i0 /* Don't use "ret" cause the preprocessor will eat it. */ @@ -81,10 +80,8 @@ ENTRY(__brk) or %g1, %lo(errno), %g1 #ifdef PIC ldx [%l7+%g1], %g1 - st %o0, [%g1] -#else - st %o0, [%g4+%g1] #endif + st %o0, [%g1] #else call __errno_location mov %o0,%l1 diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/clone.S b/sysdeps/unix/sysv/linux/sparc/sparc64/clone.S index 6c619fcdc3..d7506b7c72 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/clone.S +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/clone.S @@ -30,7 +30,7 @@ .type __clone,@function __clone: - save %sp,-160,%sp + save %sp, -192, %sp /* sanity check arguments */ brz,pn %i0, 99f @@ -42,10 +42,10 @@ __clone: mov %i1, %o1 mov %i2, %o0 set __NR_clone, %g1 - ta 0x11 + ta 0x6d bcs,pn %xcc, 99f nop - brnz %o0, __thread_start + brnz,pn %o0, __thread_start mov %o0, %i0 ret restore @@ -62,7 +62,6 @@ __clone: st %i0, [%l7+%g2] #else sethi %hi(errno), %g2 - add %g2, %g4, %g2 set EINVAL, %i0 st %i0, [%g2+%lo(errno)] #endif diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/init-first.h b/sysdeps/unix/sysv/linux/sparc/sparc64/init-first.h index 955714dc4f..ece284ab44 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/init-first.h +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/init-first.h @@ -33,7 +33,7 @@ .global " #NAME " .type " #NAME ",@function " #NAME ": - save %sp, -128, %sp + save %sp, -192, %sp 1: call 11f sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 11: or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 @@ -73,11 +73,10 @@ or %g2, %lo(_dl_starting_up), %g2 brz,pt %g2, 3f sethi %hi(__libc_multiple_libcs), %g3 - ld [%g4+%g2], %g1 + ld [%g2], %g1 mov %g0, %g2 movrz %g1, 1, %g2 -3: or %g3, %lo(__libc_multiple_libcs), %g3 - st %g2, [%g3+%g4] +3: 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 diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/longjmp.S b/sysdeps/unix/sysv/linux/sparc/sparc64/longjmp.S index d63762cb15..963aa6d89d 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/longjmp.S +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/longjmp.S @@ -44,5 +44,7 @@ ENTRY(longjmp) END(longjmp) strong_alias(longjmp, __longjmp) +strong_alias(longjmp, __libc_longjmp) +strong_alias(longjmp, __libc_siglongjmp) weak_alias(longjmp, _longjmp) weak_alias(longjmp, siglongjmp) diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/pipe.S b/sysdeps/unix/sysv/linux/sparc/sparc64/pipe.S index 82ff4eae3c..38a6f8f8b8 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/pipe.S +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/pipe.S @@ -22,7 +22,7 @@ ENTRY (__libc_pipe) mov %o0, %o2 /* Save PIPEDES. */ LOADSYSCALL(pipe) - ta 0x11 + ta 0x6d bcc,pn %xcc, 2f nop SYSCALL_ERROR_HANDLER diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/readdir.c b/sysdeps/unix/sysv/linux/sparc/sparc64/readdir.c index 96a6a76945..300ebb2629 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/readdir.c +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/readdir.c @@ -1,4 +1,7 @@ #define readdir64 __no_readdir64_decl +#define __readdir64 __no___readdir64_decl #include +#undef __readdir64 +strong_alias (__readdir, __readdir64) #undef readdir64 weak_alias (__readdir, readdir64) diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/sys/ucontext.h b/sysdeps/unix/sysv/linux/sparc/sparc64/sys/ucontext.h new file mode 100644 index 0000000000..f62b542b2f --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/sys/ucontext.h @@ -0,0 +1,67 @@ +#ifndef _SYS_UCONTEXT_H +#define _SYS_UCONTEXT_H + +#include + +#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 /* sys/ucontext.h */ diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S b/sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S index 30dace5903..5864bfcbc3 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S @@ -28,7 +28,7 @@ ENTRY (syscall) mov %o4,%o3 mov %o5,%o4 - ta 0x11 + ta 0x6d bcc,pt %xcc,1f nop diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list b/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list index fcf556b818..1ec42fa42e 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list @@ -6,7 +6,7 @@ pread - pread 4 __pread pread __pread64 pread64 pwrite - pwrite 4 __pwrite pwrite __pwrite64 pwrite64 fstatfs - fstatfs 2 __fstatfs fstatfs fstatfs64 statfs - statfs 2 __statfs statfs statfs64 -getrlimit - getrlimit 2 getrlimit getrlimit64 +getrlimit - getrlimit 2 __getrlimit getrlimit getrlimit64 setrlimit - setrlimit 2 setrlimit setrlimit64 ftruncate - ftruncate 2 __ftruncate ftruncate ftruncate64 truncate - truncate 2 truncate truncate64 diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h index 2cc8547c1a..5a9a4e249b 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h @@ -46,49 +46,48 @@ #ifdef PIC # ifdef _LIBC_REENTRANT # define SYSCALL_ERROR_HANDLER \ - save %sp,-160,%sp; \ - call __errno_location; \ + save %sp, -192, %sp; \ + call __errno_location; \ nop; \ - st %i0,[%o0]; \ - sub %g0,1,%i0; \ - jmpl %i7+8, %g0; \ + 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]; \ + 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]; \ retl; \ - sub %g0,1,%i0 + sub %g0, 1, %i0 # endif #else # ifdef _LIBC_REENTRANT # define SYSCALL_ERROR_HANDLER \ - save %sp,-160,%sp; \ - call __errno_location; \ + save %sp, -192, %sp; \ + call __errno_location; \ nop; \ - st %i0,[%o0]; \ - sub %g0,1,%i0; \ - jmpl %i7+8, %g0; \ + 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]; \ + sethi %hi(errno), %g1; \ + st %i0, [%g1 + %lo(errno)]; \ retl; \ - sub %g0,1,%i0 + sub %g0, 1, %i0 # endif #endif @@ -96,8 +95,8 @@ .text; \ ENTRY(name); \ LOADSYSCALL(syscall_name); \ - ta 0x11; \ - bcc,pt %xcc,1f; \ + ta 0x6d; \ + bcc,pt %xcc, 1f; \ nop; \ SYSCALL_ERROR_HANDLER; \ 1: diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/ucontext.h b/sysdeps/unix/sysv/linux/sparc/sparc64/ucontext.h deleted file mode 100644 index 160e2fc43a..0000000000 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/ucontext.h +++ /dev/null @@ -1,67 +0,0 @@ -#ifndef _UCONTEXT_H -#define _UCONTEXT_H - -#include - -#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 */ -- cgit v1.2.3