[PATCH] SPARC headers
Jakub Jelinek
jakub@redhat.com
Tue Mar 21 03:34:00 GMT 2000
Hi!
This patch should clean up SPARC headers a little bit, set struct sigcontext
to the structure which is really passed to signal handlers and avoid
including asm/elf.h which in turn usually includes asm/ptrace.h and messes
many things up.
2000-03-21 Jakub Jelinek <jakub@redhat.com>
* sysdeps/unix/sysv/linux/sparc/bits/sigcontext.h: Clean up namespace.
Lay out struct sigcontext according to what really gets passed on
the stack.
* sysdeps/unix/sysv/linux/sparc/sys/elf.h: New file.
* sysdeps/unix/sysv/linux/sparc/sys/procfs.h: Include sys/elf.h
instead of asm/elf.h.
* sysdeps/unix/sysv/linux/sparc/sys/ptrace.h (PTRACE_WRITEDATA):
Define to correct value.
* sysdeps/unix/sysv/linux/sparc/sparc32/profil-counter.h: Use struct
sigcontext.
* sysdeps/unix/sysv/linux/sparc/sparc32/sigcontextinfo.h: Likewise.
--- libc/sysdeps/unix/sysv/linux/sparc/bits/sigcontext.h.jj Mon Mar 20 23:55:52 2000
+++ libc/sysdeps/unix/sysv/linux/sparc/bits/sigcontext.h Tue Mar 21 11:57:10 2000
@@ -22,104 +22,57 @@
#include <bits/wordsize.h>
-#define SUNOS_MAXWIN 31
+#if __WORDSIZE == 32
-/* A register window */
-struct reg_window {
- unsigned long locals[8];
- unsigned long ins[8];
+/* It is quite hard to choose what to put here, because
+ Linux/sparc32 had at least 3 totally incompatible
+ signal stack layouts.
+ This one is for the "new" style signals, which are
+ now delivered unless SA_SIGINFO is requested. */
+
+typedef struct sigcontext
+ {
+ struct
+ {
+ unsigned int psr;
+ unsigned int pc;
+ unsigned int npc;
+ unsigned int y;
+ unsigned int u_regs[16]; /* globals and ins */
+ } si_regs;
+ int si_mask;
+ };
+
+#else /* sparc64 */
+
+typedef struct
+ {
+ unsigned int si_float_regs [64];
+ unsigned long si_fsr;
+ unsigned long si_gsr;
+ unsigned long si_fprs;
+ } __siginfo_fpu_t;
+
+struct sigcontext
+ {
+ char sigc_info[128];
+ struct
+ {
+ unsigned long u_regs[16]; /* globals and ins */
+ unsigned long tstate;
+ unsigned long tpc;
+ unsigned long tnpc;
+ unsigned int y;
+ unsigned int fprs;
+ } sigc_regs;
+ __siginfo_fpu_t * sigc_fpu_save;
+ struct
+ {
+ void * ss_sp;
+ int ss_flags;
+ unsigned long ss_size;
+ } sigc_stack;
+ unsigned long sigc_mask;
};
-#if __WORDSIZE == 64
-
-/* This is what SunOS doesn't, so we have to write this alone. */
-struct sigcontext {
- int sigc_onstack; /* state to restore */
- int sigc_mask; /* sigmask to restore */
- unsigned long sigc_sp; /* stack pointer */
- unsigned long sigc_pc; /* program counter */
- unsigned long sigc_npc; /* next program counter */
- unsigned long sigc_psr; /* for condition codes etc */
- unsigned long sigc_g1; /* User uses these two registers */
- unsigned long sigc_o0; /* within the trampoline code. */
-
- /* Now comes information regarding the users window set
- at the time of the signal. */
- int sigc_oswins; /* outstanding windows */
-
- /* stack ptrs for each regwin buf */
- char *sigc_spbuf[SUNOS_MAXWIN];
-
- /* Windows to restore after signal */
- struct reg_window sigc_wbuf[SUNOS_MAXWIN];
-};
-
-struct pt_regs {
- unsigned long u_regs[16]; /* globals and ins */
- unsigned long tstate;
- unsigned long tpc;
- unsigned long tnpc;
- unsigned int y;
- unsigned int fprs;
-};
-
-typedef struct {
- struct pt_regs si_regs;
- long si_mask;
-} __siginfo_t;
-
-typedef struct {
- unsigned int si_float_regs [64];
- unsigned long si_fsr;
- unsigned long si_gsr;
- unsigned long si_fprs;
-} __siginfo_fpu_t;
-
-#else
-
-/* This is what SunOS does, so shall I. */
-struct sigcontext {
- int sigc_onstack; /* state to restore */
- int sigc_mask; /* sigmask to restore */
- int sigc_sp; /* stack pointer */
- int sigc_pc; /* program counter */
- int sigc_npc; /* next program counter */
- int sigc_psr; /* for condition codes etc */
- int sigc_g1; /* User uses these two registers */
- int sigc_o0; /* within the trampoline code. */
-
- /* Now comes information regarding the users window set
- at the time of the signal. */
- int sigc_oswins; /* outstanding windows */
-
- /* stack ptrs for each regwin buf */
- char *sigc_spbuf[SUNOS_MAXWIN];
-
- /* Windows to restore after signal */
- struct reg_window sigc_wbuf[SUNOS_MAXWIN];
-};
-
-struct pt_regs {
- unsigned long psr;
- unsigned long pc;
- unsigned long npc;
- unsigned long y;
- unsigned long u_regs[16]; /* globals and ins */
-};
-
-typedef struct {
- struct pt_regs si_regs;
- int si_mask;
-} __siginfo_t;
-
-typedef struct {
- unsigned long si_float_regs [32];
- unsigned long si_fsr;
- unsigned long si_fpqdepth;
- struct {
- unsigned long *insn_addr;
- unsigned long insn;
- } si_fpqueue [16];
-} __siginfo_fpu_t;
-
-#endif
+#endif /* sparc64 */
--- libc/sysdeps/unix/sysv/linux/sparc/sys/elf.h.jj Fri Mar 17 12:11:32 2000
+++ libc/sysdeps/unix/sysv/linux/sparc/sys/elf.h Tue Mar 21 11:57:10 2000
@@ -0,0 +1,61 @@
+/* Copyright (C) 2000 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_ELF_H
+#define _SYS_ELF_H 1
+
+#include <bits/wordsize.h>
+
+typedef unsigned long elf_greg_t;
+
+#if __WORDSIZE == 64
+
+#define ELF_NGREG 20
+
+typedef struct
+ {
+ unsigned long pr_regs[32];
+ unsigned long pr_fsr;
+ unsigned long pr_gsr;
+ unsigned long pr_fprs;
+ } elf_fpregset_t;
+
+#else /* sparc32 */
+
+#define ELF_NGREG 38
+
+typedef struct
+ {
+ union
+ {
+ unsigned long pr_regs[32];
+ double pr_dregs[16];
+ } pr_fr;
+ unsigned long __unused;
+ unsigned long pr_fsr;
+ unsigned char pr_qcnt;
+ unsigned char pr_q_entrysize;
+ unsigned char pr_en;
+ unsigned int pr_q[64];
+ } elf_fpregset_t;
+
+#endif /* sparc32 */
+
+typedef elf_greg_t elf_gregset_t[ELF_NGREG];
+
+#endif /* _SYS_ELF_H */
--- libc/sysdeps/unix/sysv/linux/sparc/sys/procfs.h.jj Mon Jan 17 05:05:36 2000
+++ libc/sysdeps/unix/sysv/linux/sparc/sys/procfs.h Tue Mar 21 11:57:10 2000
@@ -29,7 +29,7 @@
#include <sys/types.h>
#include <sys/ucontext.h>
#include <sys/user.h>
-#include <asm/elf.h>
+#include <sys/elf.h>
#include <bits/wordsize.h>
__BEGIN_DECLS
--- libc/sysdeps/unix/sysv/linux/sparc/sys/ptrace.h.jj Fri Dec 10 15:15:34 1999
+++ libc/sysdeps/unix/sysv/linux/sparc/sys/ptrace.h Tue Mar 21 11:57:10 2000
@@ -1,5 +1,5 @@
/* `ptrace' debugger support interface. Linux/SPARC version.
- Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997, 1998, 1999, 2000 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
@@ -120,15 +120,19 @@ enum __ptrace_request
PTRACE_ATTACH = 16,
#define PT_ATTACH PTRACE_ATTACH
+ /* Write several bytes at a time. */
+ PTRACE_WRITEDATA = 17,
+#define PTRACE_WRITEDATA PTRACE_WRITEDATA
+
/* Read several bytes at a time. */
PTRACE_READTEXT = 18,
- #define PTRACE_READTEXT PTRACE_READTEXT
- #define PTRACE_READDATA PTRACE_READTEXT
+#define PTRACE_READTEXT PTRACE_READTEXT
+#define PTRACE_READDATA PTRACE_READTEXT
/* Write several bytes at a time. */
PTRACE_WRITETEXT = 19,
- #define PTRACE_WRITETEXT PTRACE_WRITETEXT
- #define PTRACE_WRITEDATA PTRACE_WRITETEXT
+#define PTRACE_WRITETEXT PTRACE_WRITETEXT
+#define PTRACE_WRITEDATA PTRACE_WRITETEXT
#if __WORDSIZE == 64
--- libc/sysdeps/unix/sysv/linux/sparc/sparc32/sigcontextinfo.h.jj Mon Jan 17 07:58:55 2000
+++ libc/sysdeps/unix/sysv/linux/sparc/sparc32/sigcontextinfo.h Tue Mar 21 11:57:11 2000
@@ -17,7 +17,7 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
-#define SIGCONTEXT __siginfo_t *
+#define SIGCONTEXT struct sigcontext *
#define SIGCONTEXT_EXTRA_ARGS
#define GET_PC(__ctx) ((void *) ((__ctx)->si_regs.pc))
#define ADVANCE_STACK_FRAME(__next) \
--- libc/sysdeps/unix/sysv/linux/sparc/sparc32/profil-counter.h.jj Wed Feb 3 10:30:19 1999
+++ libc/sysdeps/unix/sysv/linux/sparc/sparc32/profil-counter.h Tue Mar 21 11:57:10 2000
@@ -20,7 +20,7 @@
#include <signal.h>
void
-profil_counter (int signo, __siginfo_t *si)
+profil_counter (int signo, struct sigcontext *si)
{
profil_count ((void *) si->si_regs.pc);
}
Cheers,
Jakub
___________________________________________________________________
Jakub Jelinek | jakub@redhat.com | http://sunsite.mff.cuni.cz/~jj
Linux version 2.3.99-pre2 on a sparc64 machine (1343.49 BogoMips)
___________________________________________________________________
More information about the Libc-hacker
mailing list