diff options
author | Ulrich Drepper <drepper@redhat.com> | 1999-08-02 20:04:56 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1999-08-02 20:04:56 +0000 |
commit | 7b19af689144b165a6c9ddc8445e2762c979c04b (patch) | |
tree | 98b052fbb76d367d23270527536e769ae7ff43de /sysdeps/unix/sysv/linux/sparc/sparc64 | |
parent | 249fd241a225b3b3723e55f7051ed4c7bf726e78 (diff) | |
download | glibc-7b19af689144b165a6c9ddc8445e2762c979c04b.tar glibc-7b19af689144b165a6c9ddc8445e2762c979c04b.tar.gz glibc-7b19af689144b165a6c9ddc8445e2762c979c04b.tar.bz2 glibc-7b19af689144b165a6c9ddc8445e2762c979c04b.zip |
Update.
1999-08-02 Jakub Jelinek <jj@ultra.linux.cz>
* sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c (__sigaction):
Only allow rt signal frames. No SA_SIGINFO signals will have the
siginfo_t just not filled out with SI_NOINFO code.
* sysdeps/unix/sysv/linux/sparc/sparc64/register-dump.h
(register_dump): Take the above change into account.
* sysdeps/unix/sysv/linux/sparc/sparc64/sigcontextinfo.h
(rt_signal_frame): Likewise.
* sysdeps/unix/sysv/linux/sparc/getsysstats.c: New file.
Diffstat (limited to 'sysdeps/unix/sysv/linux/sparc/sparc64')
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/sparc64/register-dump.h | 20 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c | 17 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/sparc64/sigcontextinfo.h | 18 |
3 files changed, 26 insertions, 29 deletions
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/register-dump.h b/sysdeps/unix/sysv/linux/sparc/sparc64/register-dump.h index 809f7c1d13..ccfb881d98 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/register-dump.h +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/register-dump.h @@ -39,7 +39,7 @@ i3: XXXXXXXXXXXXXXXX i4: XXXXXXXXXXXXXXXX i5: XXXXXXXXXXXXXXXX fp: XXXXXXXXXXXXXXXX i7: XXXXXXXXXXXXXXXX - Old mask: XXXXXXXX XFSR: XXXXXXXXXXXXXXXX GSR: XX FPRS: X + Mask: XXXXXXXXXXXXXXXX XFSR: XXXXXXXXXXXXXXXX GSR: XX FPRS: X f0: XXXXXXXXXXXXXXXX f2: XXXXXXXXXXXXXXXX f4: XXXXXXXXXXXXXXXX f6: XXXXXXXXXXXXXXXX f8: XXXXXXXXXXXXXXXX f10: XXXXXXXXXXXXXXXX f12: XXXXXXXXXXXXXXXX f14: XXXXXXXXXXXXXXXX f16: XXXXXXXXXXXXXXXX @@ -79,7 +79,7 @@ register_dump (int fd, SIGCONTEXT ctx) size_t nr = 0; int i; struct reg_window *r = (struct reg_window *) - ctx->si_regs.u_regs[14]; + ctx->sf_regs.u_regs[14]; struct __siginfo_sparc64_fpu *f; #define ADD_STRING(str) \ @@ -92,15 +92,15 @@ register_dump (int fd, SIGCONTEXT ctx) ++nr /* Generate strings of register contents. */ - hexvalue (ctx->si_regs.tstate, regs[0], 16); - hexvalue (ctx->si_regs.tpc, regs[1], 16); - hexvalue (ctx->si_regs.tnpc, regs[2], 16); - hexvalue (ctx->si_regs.y, regs[3], 8); + hexvalue (ctx->sf_regs.tstate, regs[0], 16); + hexvalue (ctx->sf_regs.tpc, regs[1], 16); + hexvalue (ctx->sf_regs.tnpc, regs[2], 16); + hexvalue (ctx->sf_regs.y, regs[3], 8); for (i = 1; i <= 15; i++) - hexvalue (ctx->si_regs.u_regs[i], regs[3+i], 16); + hexvalue (ctx->sf_regs.u_regs[i], regs[3+i], 16); for (i = 0; i <= 15; i++) hexvalue (r->locals[i], regs[19+i], 16); - hexvalue (ctx->si_mask, regs[35], 8); + hexvalue (ctx->sf_mask, regs[35], 16); /* Generate the output. */ ADD_STRING ("Register dump:\n\n TSTATE: "); @@ -173,8 +173,8 @@ register_dump (int fd, SIGCONTEXT ctx) ADD_MEM (regs[33], 16); ADD_STRING (" i7: "); ADD_MEM (regs[34], 16); - ADD_STRING ("\n\n Old mask: "); - ADD_MEM (regs[35], 8); + ADD_STRING ("\n\n Mask: "); + ADD_MEM (regs[35], 16); f = *(struct __siginfo_sparc64_fpu **)(ctx + 1); if (f != NULL) diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c b/sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c index cd86f48602..cbfc248c8e 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c @@ -32,24 +32,18 @@ extern int __syscall_rt_sigaction (int, const struct kernel_sigaction *, size_t); static void __rt_sigreturn_stub (void); -static void __sigreturn_stub (void); int __sigaction (int sig, __const struct sigaction *act, struct sigaction *oact) { int ret; struct kernel_sigaction kact, koact; - unsigned long stub = 0; + unsigned long stub = ((unsigned long) &__rt_sigreturn_stub) - 8; 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; } @@ -79,12 +73,3 @@ __rt_sigreturn_stub (void) : /* no outputs */ : "i" (__NR_rt_sigreturn)); } - -static void -__sigreturn_stub (void) -{ - __asm__ ("mov %0, %%g1\n\t" - "ta 0x6d\n\t" - : /* no outputs */ - : "i" (__NR_sigreturn)); -} diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/sigcontextinfo.h b/sysdeps/unix/sysv/linux/sparc/sparc64/sigcontextinfo.h index d174c9e779..8430dbcbe1 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/sigcontextinfo.h +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/sigcontextinfo.h @@ -17,13 +17,25 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +struct __rt_signal_frame { + siginfo_t sf_info; + struct pt_regs sf_regs; + __siginfo_fpu_t *fpu_save; + struct { + void *ss_sp; + int ss_flags; + size_t ss_size; + } sf_stack; + unsigned long sf_mask; +}; + #ifndef STACK_BIAS #define STACK_BIAS 2047 #endif -#define SIGCONTEXT __siginfo_t * -#define GET_PC(__ctx) ((void *) ((__ctx)->si_regs.tpc)) +#define SIGCONTEXT struct __rt_signal_frame * +#define GET_PC(__ctx) ((void *) ((__ctx)->sf_regs.tpc)) #define ADVANCE_STACK_FRAME(__next) \ ((void *) &((struct reg_window *) (((unsigned long int) (__next)) \ + STACK_BIAS))->ins[6]) -#define GET_STACK(__ctx) ((void *) ((__ctx)->si_regs.u_regs[14])) +#define GET_STACK(__ctx) ((void *) ((__ctx)->sf_regs.u_regs[14])) #define GET_FRAME(__ctx) ADVANCE_STACK_FRAME (GET_STACK (__ctx)) |