Set some better defaults for OSABI_UNKNOWN, and add NetBSD kcore support.

This commit is contained in:
fvdl 2003-10-14 22:58:38 +00:00
parent 14cdf7ae6d
commit 22cd769ea5
3 changed files with 54 additions and 15 deletions

View File

@ -902,6 +902,12 @@ x86_64_skip_prologue (CORE_ADDR pc)
return pc;
}
CORE_ADDR
x86_64_saved_pc_after_call (struct frame_info *frame)
{
return read_memory_integer (read_register (SP_REGNUM), 8);
}
/* Sequence of bytes for breakpoint instruction. */
static unsigned char *
x86_64_breakpoint_from_pc (CORE_ADDR * pc, int *lenptr)
@ -1122,6 +1128,11 @@ x86_64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
set_gdbarch_dwarf2_build_frame_info (gdbarch, dwarf2_build_frame_info);
set_gdbarch_dwarf2_reg_to_regnum (gdbarch, x86_64_dwarf2_reg_to_regnum);
set_gdbarch_frame_chain (gdbarch, cfi_frame_chain);
set_gdbarch_frame_chain_valid (gdbarch, func_frame_chain_valid);
set_gdbarch_frame_saved_pc (gdbarch, cfi_get_ra);
set_gdbarch_saved_pc_after_call (gdbarch, x86_64_saved_pc_after_call);
gdbarch_init_osabi (info, gdbarch, osabi);
return gdbarch;

View File

@ -34,5 +34,6 @@ const char *x86_64_register_name (int reg_nr);
gdbarch_frame_saved_pc_ftype x86_64_nbsd_frame_saved_pc;
gdbarch_saved_pc_after_call_ftype x86_64_nbsd_saved_pc_after_call;
gdbarch_saved_pc_after_call_ftype x86_64_saved_pc_after_call;
#endif

View File

@ -34,6 +34,7 @@
#include <sys/syscall.h>
#include <machine/reg.h>
#include <machine/frame.h>
#include <machine/pcb.h>
/* Mapping between the general-purpose registers in `struct user'
format and GDB's register array layout. */
@ -312,6 +313,47 @@ fetch_core_registers (char *core_reg_sect, unsigned core_reg_size,
}
}
void
fetch_kcore_registers (pcb)
struct pcb *pcb;
{
int regno;
uint64_t zero;
struct switchframe sf;
/*
* get the register values out of the sys pcb and
* store them where `read_register' will find them.
*/
if (target_read_memory(pcb->pcb_rsp, (char *)&sf, sizeof(sf)))
error("Cannot switch frame.");
zero = 0;
supply_register(0, (char *)&zero);
supply_register(1, (char *)&sf.sf_rbx);
supply_register(2, (char *)&zero);
supply_register(3, (char *)&zero);
supply_register(4, (char *)&zero);
supply_register(5, (char *)&zero);
supply_register(6, (char *)&sf.sf_rbp);
supply_register(7, (char *)&pcb->pcb_rsp);
supply_register(8, (char *)&zero);
supply_register(9, (char *)&zero);
supply_register(10, (char *)&zero);
supply_register(11, (char *)&zero);
supply_register(12, (char *)&sf.sf_r12);
supply_register(13, (char *)&sf.sf_r13);
supply_register(14, (char *)&sf.sf_r14);
supply_register(15, (char *)&sf.sf_r15);
supply_register(16, (char *)&sf.sf_rip);
supply_register(17, (char *)&zero);
supply_register(18, (char *)&zero);
supply_register(19, (char *)&zero);
supply_register(20, (char *)&zero);
supply_register(21, (char *)&zero);
}
void
nbsd_reg_to_internal(regs)
char *regs;
@ -348,22 +390,7 @@ static struct core_fns nbsd_elf_core_fns = {
fetch_core_registers, /* core_read_registers */
NULL /* next */
};
#if !defined (offsetof)
#define offsetof(TYPE, MEMBER) ((unsigned long) &((TYPE *)0)->MEMBER)
#endif
#if 0
/* Return the address of register REGNUM. BLOCKEND is the value of
u.u_ar0, which should point to the registers. */
CORE_ADDR
x86_64_register_u_addr (CORE_ADDR blockend, int regnum)
{
/* XXX implement */
return 0;
}
#endif
void
_initialize_x86_64nbsd_nat (void)