From mboxrd@z Thu Jan 1 00:00:00 1970 From: Michael Snyder To: gdb-patches@sources.redhat.com Cc: Mark Kettenis Subject: [RFA] Off-by-one error in linux thread-db.c? Date: Tue, 27 Mar 2001 17:20:00 -0000 Message-id: <3AC13C62.6AE49717@cygnus.com> X-SW-Source: 2001-03/msg00515.html Mark, what do you think? There's no signal zero... 2001-03-27 Michael Snyder * thread-db.c (check_thread_signals): Off by one error in loop. Index: thread-db.c =================================================================== RCS file: /cvs/cvsfiles/devo/gdb/thread-db.c,v retrieving revision 2.5 diff -c -3 -p -r2.5 thread-db.c *** thread-db.c 2001/03/26 19:54:42 2.5 --- thread-db.c 2001/03/28 00:57:02 *************** check_thread_signals (void) *** 469,475 **** sigemptyset (&thread_stop_set); sigemptyset (&thread_print_set); ! for (i = 0; i < NSIG; i++) { if (sigismember (&mask, i)) { --- 469,475 ---- sigemptyset (&thread_stop_set); sigemptyset (&thread_print_set); ! for (i = 1; i < NSIG; i++) { if (sigismember (&mask, i)) { >From kettenis@wins.uva.nl Wed Mar 28 01:15:00 2001 From: Mark Kettenis To: gdb-patches@sources.redhat.com Subject: [PATCH] Fix gdbserver for Linux/x86 Date: Wed, 28 Mar 2001 01:15:00 -0000 Message-id: <200103280915.f2S9FPc00875@delius.kettenis.local> X-SW-Source: 2001-03/msg00516.html Content-length: 3357 The attached patch makes gdbserver work again on Linux/x86. Checked in. Mark Index: ChangeLog from Mark Kettenis * gdbserver/low-linux.c [I386_GNULINUX_TARGET]: Cleanup code and make it work again. (NUM_FREGS): Redefine to 0. (NUM_REGS): Redefine as NUM_GREGS. (i386_register_byte, i386_register_raw_size): Update from i386-tdep.c. Add comment about their origin. (regmap, register_u_addr): Take these from i386-linux-nat.c. (i386_register_u_addr): Removed. Index: gdbserver/low-linux.c =================================================================== RCS file: /cvs/src/src/gdb/gdbserver/low-linux.c,v retrieving revision 1.8 diff -u -p -r1.8 low-linux.c --- gdbserver/low-linux.c 2001/03/13 23:31:14 1.8 +++ gdbserver/low-linux.c 2001/03/28 09:12:37 @@ -155,8 +155,26 @@ myresume (int step, int signal) #endif #ifdef I386_GNULINUX_TARGET -/* i386_register_raw_size[i] is the number of bytes of storage in the - actual machine representation for register i. */ +/* This module only supports access to the general purpose registers. + Adjust the relevant constants accordingly. + + FIXME: kettenis/2001-03-28: We should really use PTRACE_GETREGS to + get at the registers. Better yet, we should try to share code with + i386-linux-nat.c. */ +#undef NUM_FREGS +#define NUM_FREGS 0 +#undef NUM_REGS +#define NUM_REGS NUM_GREGS + +/* This stuff comes from i386-tdep.c. */ + +/* i386_register_byte[i] is the offset into the register file of the + start of register number i. We initialize this from + i386_register_raw_size. */ +int i386_register_byte[MAX_NUM_REGS]; + +/* i386_register_raw_size[i] is the number of bytes of storage in + GDB's register array occupied by register i. */ int i386_register_raw_size[MAX_NUM_REGS] = { 4, 4, 4, 4, 4, 4, 4, 4, @@ -171,8 +189,6 @@ int i386_register_raw_size[MAX_NUM_REGS] 4 }; -int i386_register_byte[MAX_NUM_REGS]; - static void initialize_arch (void) { @@ -189,37 +205,26 @@ initialize_arch (void) } } } + +/* This stuff comes from i386-linux-nat.c. */ -/* this table must line up with REGISTER_NAMES in tm-i386v.h */ -/* symbols like 'EAX' come from */ -static int regmap[] = +/* Mapping between the general-purpose registers in `struct user' + format and GDB's register array layout. */ +static int regmap[] = { EAX, ECX, EDX, EBX, UESP, EBP, ESI, EDI, EIP, EFL, CS, SS, - DS, ES, FS, GS, + DS, ES, FS, GS }; -int -i386_register_u_addr (int blockend, int regnum) -{ -#if 0 - /* this will be needed if fp registers are reinstated */ - /* for now, you can look at them with 'info float' - * sys5 wont let you change them with ptrace anyway - */ - if (regnum >= FP0_REGNUM && regnum <= FP7_REGNUM) - { - int ubase, fpstate; - struct user u; - ubase = blockend + 4 * (SS + 1) - KSTKSZ; - fpstate = ubase + ((char *) &u.u_fpstate - (char *) &u); - return (fpstate + 0x1c + 10 * (regnum - FP0_REGNUM)); - } - else -#endif - return (blockend + 4 * regmap[regnum]); +/* Return the address of register REGNUM. BLOCKEND is the value of + u.u_ar0, which should point to the registers. */ +CORE_ADDR +register_u_addr (CORE_ADDR blockend, int regnum) +{ + return (blockend + 4 * regmap[regnum]); } #elif defined(TARGET_M68K) static void