diff options
author | Fred Fish <fnf@specifix.com> | 1992-10-17 08:07:14 +0000 |
---|---|---|
committer | Fred Fish <fnf@specifix.com> | 1992-10-17 08:07:14 +0000 |
commit | 4d0eabff256968b7dea2bf8ec139d2d5ad9128cf (patch) | |
tree | e9950c8baed062fc14393a3c4cdbd797b341cc53 /gdb/i386v4-nat.c | |
parent | c36989aa959fa725199289d43b6978414fdcaad5 (diff) | |
download | gdb-4d0eabff256968b7dea2bf8ec139d2d5ad9128cf.zip gdb-4d0eabff256968b7dea2bf8ec139d2d5ad9128cf.tar.gz gdb-4d0eabff256968b7dea2bf8ec139d2d5ad9128cf.tar.bz2 |
Native support cleanup and corefile fixes for i386 SVR4 systems.
* i386-tdep.c (supply_gregset, fill_gregset, supply_fpregset,
fill_fpregset): Moved to i386v4-nat.c
* i386v4-nat.c, nm-i386v4.h, : New files.
* i386sol2.mh, i386v4.mh, ncr3000.mh (NAT_FILE): Use nm-i386v4.h.
* i386sol2.mh, i386v4.mh, ncr3000.mh (NATDEPFILES): Add corelow.o,
change i386v-nat.o to i386v4-nat.o.
Diffstat (limited to 'gdb/i386v4-nat.c')
-rw-r--r-- | gdb/i386v4-nat.c | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/gdb/i386v4-nat.c b/gdb/i386v4-nat.c new file mode 100644 index 0000000..ac96ea3 --- /dev/null +++ b/gdb/i386v4-nat.c @@ -0,0 +1,148 @@ +/* Native-dependent code for SVR4 Unix running on i386's, for GDB. + Copyright 1988, 1989, 1991, 1992 Free Software Foundation, Inc. + +This file is part of GDB. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#include "defs.h" +#include <sys/procfs.h> + +/* The /proc interface divides the target machine's register set up into + two different sets, the general register set (gregset) and the floating + point register set (fpregset). For each set, there is an ioctl to get + the current register set and another ioctl to set the current values. + + The actual structure passed through the ioctl interface is, of course, + naturally machine dependent, and is different for each set of registers. + For the i386 for example, the general register set is typically defined + by: + + typedef int gregset_t[19]; (in <sys/regset.h>) + + #define GS 0 (in <sys/reg.h>) + #define FS 1 + ... + #define UESP 17 + #define SS 18 + + and the floating point set by: + + typedef struct fpregset + { + union + { + struct fpchip_state // fp extension state // + { + int state[27]; // 287/387 saved state // + int status; // status word saved at exception // + } fpchip_state; + struct fp_emul_space // for emulators // + { + char fp_emul[246]; + char fp_epad[2]; + } fp_emul_space; + int f_fpregs[62]; // union of the above // + } fp_reg_set; + long f_wregs[33]; // saved weitek state // + } fpregset_t; + + These routines provide the packing and unpacking of gregset_t and + fpregset_t formatted data. + + */ + +/* This is a duplicate of the table in i386-xdep.c. */ + +static int regmap[] = +{ + EAX, ECX, EDX, EBX, + UESP, EBP, ESI, EDI, + EIP, EFL, CS, SS, + DS, ES, FS, GS, +}; + + +/* Given a pointer to a general register set in /proc format (gregset_t *), + unpack the register contents and supply them as gdb's idea of the current + register values. */ + +void +supply_gregset (gregsetp) + gregset_t *gregsetp; +{ + register int regi; + register greg_t *regp = (greg_t *) gregsetp; + extern int regmap[]; + + for (regi = 0 ; regi < NUM_REGS ; regi++) + { + supply_register (regi, (char *) (regp + regmap[regi])); + } +} + +void +fill_gregset (gregsetp, regno) + gregset_t *gregsetp; + int regno; +{ + int regi; + register greg_t *regp = (greg_t *) gregsetp; + extern char registers[]; + extern int regmap[]; + + for (regi = 0 ; regi < NUM_REGS ; regi++) + { + if ((regno == -1) || (regno == regi)) + { + *(regp + regmap[regi]) = *(int *) ®isters[REGISTER_BYTE (regi)]; + } + } +} + +#if defined (FP0_REGNUM) + +/* Given a pointer to a floating point register set in /proc format + (fpregset_t *), unpack the register contents and supply them as gdb's + idea of the current floating point register values. */ + +void +supply_fpregset (fpregsetp) + fpregset_t *fpregsetp; +{ + register int regi; + + /* FIXME: see m68k-tdep.c for an example, for the m68k. */ +} + +/* Given a pointer to a floating point register set in /proc format + (fpregset_t *), update the register specified by REGNO from gdb's idea + of the current floating point register set. If REGNO is -1, update + them all. */ + +void +fill_fpregset (fpregsetp, regno) + fpregset_t *fpregsetp; + int regno; +{ + int regi; + char *to; + char *from; + extern char registers[]; + + /* FIXME: see m68k-tdep.c for an example, for the m68k. */ +} + +#endif /* defined (FP0_REGNUM) */ |