X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fi386v-nat.c;h=678eabc346d9a56601f3ac4f346bd4f88ec16113;hb=1eec9e335dbd93eb4b9d9edd3b6360af58c30aac;hp=672ddfbf80809e70b7f4211ed556df4a7b0692da;hpb=ca557f44a0548248b83712ade658eefe9c976923;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/i386v-nat.c b/gdb/i386v-nat.c index 672ddfbf80..678eabc346 100644 --- a/gdb/i386v-nat.c +++ b/gdb/i386v-nat.c @@ -1,4 +1,4 @@ -/* Intel 386 native support for SYSV systems (pre-SVR4). +/* Intel 386 native support for System V systems (pre-SVR4). Copyright 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2002 Free Software Foundation, Inc. @@ -46,20 +46,9 @@ #include #include - -/* FIXME: 1998-10-21/jsm: The following used to be just "#include - ", but the the Linux kernel (version 2.1.x) and - glibc 2.0.x are not in sync; including will result - in an error. With luck, these losers will get their act together - and we can trash this hack in the near future. */ - #ifdef TARGET_HAS_HARDWARE_WATCHPOINTS -#ifdef HAVE_ASM_DEBUGREG_H -#include -#else #include #endif -#endif #include #include "gdb_stat.h" @@ -71,10 +60,12 @@ #include "floatformat.h" #include "target.h" + +#include "i386-tdep.h" -/* this table must line up with REGISTER_NAMES in tm-i386v.h */ -/* symbols like 'EAX' come from */ +/* Mapping between the general-purpose registers in `struct user' + format and GDB's register array layout. */ static int regmap[] = { EAX, ECX, EDX, EBX, @@ -83,37 +74,34 @@ static int regmap[] = DS, ES, FS, GS, }; -/* blockend is the value of u.u_ar0, and points to the - * place where GS is stored - */ +/* Support for the user struct. */ -int -i386_register_u_addr (int blockend, int regnum) +/* Return the address of register REGNUM. BLOCKEND is the value of + u.u_ar0, and points to the place where GS is stored. */ + +CORE_ADDR +register_u_addr (CORE_ADDR blockend, int regnum) { struct user u; - int fpstate; - int ubase; + CORE_ADDR fpstate; - ubase = blockend; - /* FIXME: Should have better way to test floating point range */ - if (regnum >= FP0_REGNUM && regnum <= (FP0_REGNUM + 7)) + if (i386_fp_regnum_p (regnum)) { -#ifdef KSTKSZ /* SCO, and others? */ - ubase += 4 * (SS + 1) - KSTKSZ; - fpstate = ubase + ((char *) &u.u_fps.u_fpstate - (char *) &u); +#ifdef KSTKSZ /* SCO, and others? */ + blockend += 4 * (SS + 1) - KSTKSZ; + fpstate = blockend + ((char *) &u.u_fps.u_fpstate - (char *) &u); return (fpstate + 0x1c + 10 * (regnum - FP0_REGNUM)); #else - fpstate = ubase + ((char *) &u.i387.st_space - (char *) &u); + fpstate = blockend + ((char *) &u.i387.st_space - (char *) &u); return (fpstate + 10 * (regnum - FP0_REGNUM)); #endif } - else - { - return (ubase + 4 * regmap[regnum]); - } + return (blockend + 4 * regmap[regnum]); } - + +/* Return the size of the user struct. */ + int kernel_u_size (void) { @@ -132,11 +120,11 @@ static int debug_control_mirror; /* Record which address associates with which register. */ static CORE_ADDR address_lookup[DR_LASTADDR - DR_FIRSTADDR + 1]; -static int -i386_insert_aligned_watchpoint (int, CORE_ADDR, CORE_ADDR, int, int); +static int i386_insert_aligned_watchpoint (int, CORE_ADDR, CORE_ADDR, int, + int); -static int -i386_insert_nonaligned_watchpoint (int, CORE_ADDR, CORE_ADDR, int, int); +static int i386_insert_nonaligned_watchpoint (int, CORE_ADDR, CORE_ADDR, int, + int); /* Insert a watchpoint. */