This is the mail archive of the libc-hacker@sourceware.cygnus.com mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[PATCH] SPARC headers (take 2)


> This cannot be correct, you define PTRACE_WRITEDATA twice.
> What is the correct one ?

17. Actually, PTRACE_READDATA is 16, but as it is the same as PT_ATTACH,
it won't get through and PTRACE_READTEXT is the same, just flushes I-cache
on sparc64.
Here is a fixed patch (including things Mark pointed out):

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/procfs.h: Don't include asm/elf.h.
	(elf_gregset_t, elf_greg_t, elf_fpregset_t, ELF_NGREG): Define.
	(prgregset_t, prfpregset_t): Define to elf_* types.
	* 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/procfs.h.jj	Mon Jan 17 05:05:36 2000
+++ libc/sysdeps/unix/sysv/linux/sparc/sys/procfs.h	Tue Mar 21 18:20:58 2000
@@ -29,11 +29,46 @@
 #include <sys/types.h>
 #include <sys/ucontext.h>
 #include <sys/user.h>
-#include <asm/elf.h>
 #include <bits/wordsize.h>
 
 __BEGIN_DECLS
 
+#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 unsigned long elf_greg_t;
+typedef elf_greg_t elf_gregset_t[ELF_NGREG];
+
 struct elf_siginfo
   {
     int si_signo;			/* Signal number.  */
@@ -93,11 +128,11 @@ struct elf_prpsinfo
 typedef void *psaddr_t;
 
 /* Register sets.  Linux has different names.  */
-typedef gregset_t prgregset_t;
-typedef fpregset_t prfpregset_t;
+typedef elf_gregset_t prgregset_t;
+typedef elf_fpregset_t prfpregset_t;
 
 /* We don't have any differences between processes and threads,
-   therefore habe only ine PID type.  */
+   therefore have only one PID type.  */
 typedef __pid_t lwpid_t;
 
 
--- 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 18:18:43 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,18 @@ 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
 
 #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)
___________________________________________________________________

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]