aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv/linux/sparc
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1999-08-02 20:04:56 +0000
committerUlrich Drepper <drepper@redhat.com>1999-08-02 20:04:56 +0000
commit7b19af689144b165a6c9ddc8445e2762c979c04b (patch)
tree98b052fbb76d367d23270527536e769ae7ff43de /sysdeps/unix/sysv/linux/sparc
parent249fd241a225b3b3723e55f7051ed4c7bf726e78 (diff)
downloadglibc-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')
-rw-r--r--sysdeps/unix/sysv/linux/sparc/getsysstats.c55
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/register-dump.h20
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c17
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/sigcontextinfo.h18
4 files changed, 81 insertions, 29 deletions
diff --git a/sysdeps/unix/sysv/linux/sparc/getsysstats.c b/sysdeps/unix/sysv/linux/sparc/getsysstats.c
new file mode 100644
index 0000000000..7d8a56d843
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/getsysstats.c
@@ -0,0 +1,55 @@
+/* Determine various system internal values, Linux/Sparc version.
+ Copyright (C) 1999 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Andreas Schwab <schwab@suse.de> and
+ Jakub Jelinek <jj@ultra.linux.cz>
+
+ 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. */
+
+
+/* We need to define a special parser for /proc/cpuinfo. */
+#define GET_NPROCS_PARSER(FP, BUFFER, RESULT) \
+ do \
+ { \
+ (RESULT) = 0; \
+ /* Find the line that contains the information about the number of \
+ active cpus. We don't have to fear extremely long lines since \
+ the kernel will not generate them. 8192 bytes are really \
+ enough. */ \
+ while (fgets_unlocked (BUFFER, sizeof (BUFFER), FP) != NULL) \
+ if (sscanf (BUFFER, "ncpus active : %d", &(RESULT)) == 1) \
+ break; \
+ } \
+ while (0)
+
+
+/* On the Sparc we can distinguish between the number of configured and
+ active cpus. */
+#define GET_NPROCS_CONF_PARSER(FP, BUFFER, RESULT) \
+ do \
+ { \
+ (RESULT) = 0; \
+ /* Find the line that contains the information about the number of \
+ probed cpus. We don't have to fear extremely long lines since \
+ the kernel will not generate them. 8192 bytes are really \
+ enough. */ \
+ while (fgets_unlocked ((BUFFER), sizeof (BUFFER), (FP)) != NULL) \
+ if (sscanf (buffer, "ncpus probed : %d", &(RESULT)) == 1) \
+ break; \
+ } \
+ while (0)
+
+#include <sysdeps/unix/sysv/linux/getsysstats.c>
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))