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] |
> 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] |