diff options
author | Stu Grossman <grossman@cygnus> | 1992-10-20 05:47:47 +0000 |
---|---|---|
committer | Stu Grossman <grossman@cygnus> | 1992-10-20 05:47:47 +0000 |
commit | 56fc16c70b1b54ce459dbd471b77f40385257356 (patch) | |
tree | a281e5cd3e458d8566ac6584fa22763075811683 /gdb/mips-nat.c | |
parent | 3ec5a74b0d9f21d271adc6ec9735892942c91c39 (diff) | |
download | gdb-56fc16c70b1b54ce459dbd471b77f40385257356.zip gdb-56fc16c70b1b54ce459dbd471b77f40385257356.tar.gz gdb-56fc16c70b1b54ce459dbd471b77f40385257356.tar.bz2 |
* mips-nat.c (fetch_core_registers, register_addr): Copy from
coredep.c, but zero out FP_REGNUM & ZERO_REGNUM so that stack
backtraces from core files work.
* config/decstation.mh, config/irix3.mh: Remove coredep.o.
Functions are now defined in mips-nat.c.
Diffstat (limited to 'gdb/mips-nat.c')
-rw-r--r-- | gdb/mips-nat.c | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/gdb/mips-nat.c b/gdb/mips-nat.c index b47f756..7beb582 100644 --- a/gdb/mips-nat.c +++ b/gdb/mips-nat.c @@ -25,6 +25,17 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include <sys/ptrace.h> #include <setjmp.h> /* For JB_XXX. */ +#include <sys/types.h> +#include <sys/param.h> +#include "gdbcore.h" + +/* These are needed on various systems to expand REGISTER_U_ADDR. */ +#include <sys/dir.h> +#include <sys/file.h> +#include <sys/stat.h> +#include <sys/user.h> +#include <sys/ptrace.h> + /* Size of elements in jmpbuf */ #define JB_ELEMENT_SIZE 4 @@ -144,3 +155,74 @@ get_longjmp_target(pc) return 1; } + +/* Extract the register values out of the core file and store + them where `read_register' will find them. + + CORE_REG_SECT points to the register values themselves, read into memory. + CORE_REG_SIZE is the size of that area. + WHICH says which set of registers we are handling (0 = int, 2 = float + on machines where they are discontiguous). + REG_ADDR is the offset from u.u_ar0 to the register values relative to + core_reg_sect. This is used with old-fashioned core files to + locate the registers in a large upage-plus-stack ".reg" section. + Original upage address X is at location core_reg_sect+x+reg_addr. + */ + +void +fetch_core_registers (core_reg_sect, core_reg_size, which, reg_addr) + char *core_reg_sect; + unsigned core_reg_size; + int which; + unsigned reg_addr; +{ + register int regno; + register unsigned int addr; + int bad_reg = -1; + register reg_ptr = -reg_addr; /* Original u.u_ar0 is -reg_addr. */ + + /* If u.u_ar0 was an absolute address in the core file, relativize it now, + so we can use it as an offset into core_reg_sect. When we're done, + "register 0" will be at core_reg_sect+reg_ptr, and we can use + register_addr to offset to the other registers. If this is a modern + core file without a upage, reg_ptr will be zero and this is all a big + NOP. */ + if (reg_ptr > core_reg_size) + reg_ptr -= KERNEL_U_ADDR; + + for (regno = 0; regno < NUM_REGS; regno++) + { + addr = register_addr (regno, reg_ptr); + if (addr >= core_reg_size) { + if (bad_reg < 0) + bad_reg = regno; + } else { + supply_register (regno, core_reg_sect + addr); + } + } + if (bad_reg >= 0) + { + error ("Register %s not found in core file.", reg_names[bad_reg]); + } + supply_register (ZERO_REGNUM, zerobuf); + /* Frame ptr reg must appear to be 0; it is faked by stack handling code. */ + supply_register (FP_REGNUM, zerobuf); +} + +/* Return the address in the core dump or inferior of register REGNO. + BLOCKEND is the address of the end of the user structure. */ + +unsigned int +register_addr (regno, blockend) + int regno; + int blockend; +{ + int addr; + + if (regno < 0 || regno >= NUM_REGS) + error ("Invalid register number %d.", regno); + + REGISTER_U_ADDR (addr, blockend, regno); + + return addr; +} |