From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Jacobowitz To: "H . J . Lu" Cc: gdb@sources.redhat.com Subject: Re: prgregset_t vs gdb_gregset_t on Linux: not the same! Date: Sat, 09 Jun 2001 15:23:00 -0000 Message-id: <20010609152347.B25090@nevyn.them.org> References: <20010608132730.A4056@nevyn.them.org> <20010608155907.A21698@nevyn.them.org> <20010608221452.B3344@lucon.org> X-SW-Source: 2001-06/msg00066.html On Fri, Jun 08, 2001 at 10:14:52PM -0700, H . J . Lu wrote: > On Fri, Jun 08, 2001 at 03:59:07PM -0700, Daniel Jacobowitz wrote: > > On Fri, Jun 08, 2001 at 01:27:30PM -0700, Daniel Jacobowitz wrote: > > > In proc-service.c, we call fill_gregset and supply_gregset with a > > > prgregset_t cast to a gdb_gregset_t *. The problem is, they really are > > > different. We can mostly get away with this, because in almost all cases > > > glibc won't do anything with the gregset except pass it back to gdb again > > > (if the process has terminated, it will memset something the size of a > > > prgregset_t, though...). > > > > The matching question here is that core-regset.c's fetch_core_registers > > calls supply_gregset with a gregset_t, but supply_gregset is prototyped > > with a gdb_gregset_t. That doesn't work very well either. > > I believe your Linux/MIPS patch is wrong. Please follow the examples in > linux/alpha, linux/i386 and linux/ppc. Basically, you have to include > config/tm-linux.h and config/nm-linux.h from the linux/mips header > files. But in order to do that, please make sure you do Huh? Did you even read what I wrote? gdb_gregset_t and gregset_t/prgregset_t are NOT THE SAME SIZE. config/nm-linux.h has: /* Use elf_gregset_t and elf_fpregset_t, rather than gregset_t and fpregset_t. */ #define GDB_GREGSET_T elf_gregset_t #define GDB_FPREGSET_T elf_fpregset_t So gdb_gregset_t is elg_gregset_t. which, the kernel defines as an array of 45 elf_greg_t's in . But prgregset_t is gregset_t (from : /* Register sets. Linux has different names. */ typedef gregset_t prgregset_t; typedef fpregset_t prfpregset_t; ) And gregset_t is (): #define NGREG 37 #define NFPREG 33 /* Container for all general registers. */ /* gregset_t must be an array. The below declared array corresponds to: typedef struct gregset { greg_t g_regs[32]; greg_t g_hi; greg_t g_lo; greg_t g_pad[3]; } gregset_t; */ typedef greg_t gregset_t[NGREG]; > > #include > #include > > not > > #include "nm-linux.h" > #include "tm-linux.h" > > Otherwise, you may not get the header files you want since mips has > both liltle and big endians. Once you have done that, your problem > should go away. The little endian config files are not named xm-linux.h and tm-linux.h in a separate directory. They're named xm-littlelinux.h and tm-littlelinux.h. -- Daniel Jacobowitz Debian GNU/Linux Developer Monta Vista Software Debian Security Team