Changeset View
Changeset View
Standalone View
Standalone View
head/devel/gdb/files/kgdb/mipsfbsd-kern.c
Show All 24 Lines | |||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
* | * | ||||
* from: src/gnu/usr.bin/gdb/kgdb/trgt_alpha.c,v 1.2.2.1 2005/09/15 05:32:10 marcel | * from: src/gnu/usr.bin/gdb/kgdb/trgt_alpha.c,v 1.2.2.1 2005/09/15 05:32:10 marcel | ||||
*/ | */ | ||||
#include <sys/cdefs.h> | #include <sys/cdefs.h> | ||||
__FBSDID("$FreeBSD: head/gnu/usr.bin/gdb/kgdb/trgt_mips.c 249878 2013-04-25 04:53:01Z imp $"); | __FBSDID("$FreeBSD: head/gnu/usr.bin/gdb/kgdb/trgt_mips.c 249878 2013-04-25 04:53:01Z imp $"); | ||||
#include <sys/types.h> | #include "defs.h" | ||||
#include "frame-unwind.h" | |||||
#include "osabi.h" | |||||
#include "regcache.h" | |||||
#include "solib.h" | |||||
#include "trad-frame.h" | |||||
#include "mips-tdep.h" | |||||
#ifdef __mips__ | #ifdef __mips__ | ||||
#include <machine/asm.h> | #include <machine/asm.h> | ||||
#include <machine/pcb.h> | #include <machine/pcb.h> | ||||
#include <machine/frame.h> | #include <machine/frame.h> | ||||
#endif | #endif | ||||
#include <string.h> | |||||
#include <defs.h> | |||||
#include <frame-unwind.h> | |||||
//#include <target.h> | |||||
//#include <gdbthread.h> | |||||
//#include <inferior.h> | |||||
#include "osabi.h" | |||||
#include <regcache.h> | |||||
#include "solib.h" | |||||
#include "trad-frame.h" | |||||
#include <mips-tdep.h> | |||||
#include "kgdb.h" | #include "kgdb.h" | ||||
/* Size of struct trapframe in registers. */ | /* Size of struct trapframe in registers. */ | ||||
#define TRAPFRAME_WORDS 74 | #define TRAPFRAME_WORDS 74 | ||||
/* From sys/mips/include/pcb.h. Offsets in the pcb_context[] array. */ | /* From sys/mips/include/pcb.h. Offsets in the pcb_context[] array. */ | ||||
#define FBSD_PCB_REG_S0 0 | #define FBSD_PCB_REG_S0 0 | ||||
#define FBSD_PCB_REG_S1 1 | #define FBSD_PCB_REG_S1 1 | ||||
Show All 27 Lines | |||||
_Static_assert(FBSD_PCB_REG_SR == PCB_REG_SR, "PCB_REG_SR mismatch"); | _Static_assert(FBSD_PCB_REG_SR == PCB_REG_SR, "PCB_REG_SR mismatch"); | ||||
_Static_assert(FBSD_PCB_REG_GP == PCB_REG_GP, "PCB_REG_GP mismatch"); | _Static_assert(FBSD_PCB_REG_GP == PCB_REG_GP, "PCB_REG_GP mismatch"); | ||||
_Static_assert(FBSD_PCB_REG_PC == PCB_REG_PC, "PCB_REG_PC mismatch"); | _Static_assert(FBSD_PCB_REG_PC == PCB_REG_PC, "PCB_REG_PC mismatch"); | ||||
#endif | #endif | ||||
static void | static void | ||||
mipsfbsd_supply_pcb(struct regcache *regcache, CORE_ADDR pcb_addr) | mipsfbsd_supply_pcb(struct regcache *regcache, CORE_ADDR pcb_addr) | ||||
{ | { | ||||
struct gdbarch *gdbarch = get_regcache_arch (regcache); | struct gdbarch *gdbarch = regcache->arch (); | ||||
size_t regsize = mips_isa_regsize (gdbarch); | size_t regsize = mips_isa_regsize (gdbarch); | ||||
gdb_byte buf[regsize * (FBSD_PCB_REG_PC + 1)]; | gdb_byte buf[regsize * (FBSD_PCB_REG_PC + 1)]; | ||||
/* Read the entire pcb_context[] array in one go. The pcb_context[] | /* Read the entire pcb_context[] array in one go. The pcb_context[] | ||||
array is after the pcb_regs member which is a trapframe. */ | array is after the pcb_regs member which is a trapframe. */ | ||||
if (target_read_memory (pcb_addr + TRAPFRAME_WORDS * regsize, buf, | if (target_read_memory (pcb_addr + TRAPFRAME_WORDS * regsize, buf, | ||||
sizeof(buf)) != 0) | sizeof(buf)) != 0) | ||||
return; | return; | ||||
regcache_raw_supply_unsigned (regcache, MIPS_ZERO_REGNUM, 0); | regcache->raw_supply_unsigned (MIPS_ZERO_REGNUM, 0); | ||||
regcache_raw_supply (regcache, MIPS_S2_REGNUM - 2, | regcache->raw_supply (MIPS_S2_REGNUM - 2, | ||||
buf + (regsize * FBSD_PCB_REG_S0)); | buf + (regsize * FBSD_PCB_REG_S0)); | ||||
regcache_raw_supply (regcache, MIPS_S2_REGNUM - 1, | regcache->raw_supply (MIPS_S2_REGNUM - 1, | ||||
buf + (regsize * FBSD_PCB_REG_S1)); | buf + (regsize * FBSD_PCB_REG_S1)); | ||||
regcache_raw_supply (regcache, MIPS_S2_REGNUM, | regcache->raw_supply (MIPS_S2_REGNUM, | ||||
buf + (regsize * FBSD_PCB_REG_S2)); | buf + (regsize * FBSD_PCB_REG_S2)); | ||||
regcache_raw_supply (regcache, MIPS_S2_REGNUM + 1, | regcache->raw_supply (MIPS_S2_REGNUM + 1, | ||||
buf + (regsize * FBSD_PCB_REG_S3)); | buf + (regsize * FBSD_PCB_REG_S3)); | ||||
regcache_raw_supply (regcache, MIPS_S2_REGNUM + 2, | regcache->raw_supply (MIPS_S2_REGNUM + 2, | ||||
buf + (regsize * FBSD_PCB_REG_S4)); | buf + (regsize * FBSD_PCB_REG_S4)); | ||||
regcache_raw_supply (regcache, MIPS_S2_REGNUM + 3, | regcache->raw_supply (MIPS_S2_REGNUM + 3, | ||||
buf + (regsize * FBSD_PCB_REG_S5)); | buf + (regsize * FBSD_PCB_REG_S5)); | ||||
regcache_raw_supply (regcache, MIPS_S2_REGNUM + 4, | regcache->raw_supply (MIPS_S2_REGNUM + 4, | ||||
buf + (regsize * FBSD_PCB_REG_S6)); | buf + (regsize * FBSD_PCB_REG_S6)); | ||||
regcache_raw_supply (regcache, MIPS_S2_REGNUM + 5, | regcache->raw_supply (MIPS_S2_REGNUM + 5, | ||||
buf + (regsize * FBSD_PCB_REG_S7)); | buf + (regsize * FBSD_PCB_REG_S7)); | ||||
regcache_raw_supply (regcache, MIPS_SP_REGNUM, | regcache->raw_supply (MIPS_SP_REGNUM, | ||||
buf + (regsize * FBSD_PCB_REG_SP)); | buf + (regsize * FBSD_PCB_REG_SP)); | ||||
regcache_raw_supply (regcache, MIPS_S2_REGNUM + 6, | regcache->raw_supply (MIPS_S2_REGNUM + 6, | ||||
buf + (regsize * FBSD_PCB_REG_S8)); | buf + (regsize * FBSD_PCB_REG_S8)); | ||||
regcache_raw_supply (regcache, MIPS_RA_REGNUM, | regcache->raw_supply (MIPS_RA_REGNUM, | ||||
buf + (regsize * FBSD_PCB_REG_RA)); | buf + (regsize * FBSD_PCB_REG_RA)); | ||||
regcache_raw_supply (regcache, MIPS_PS_REGNUM, | regcache->raw_supply (MIPS_PS_REGNUM, | ||||
buf + (regsize * FBSD_PCB_REG_SR)); | buf + (regsize * FBSD_PCB_REG_SR)); | ||||
regcache_raw_supply (regcache, MIPS_GP_REGNUM, | regcache->raw_supply (MIPS_GP_REGNUM, | ||||
buf + (regsize * FBSD_PCB_REG_GP)); | buf + (regsize * FBSD_PCB_REG_GP)); | ||||
regcache_raw_supply (regcache, MIPS_EMBED_PC_REGNUM, | regcache->raw_supply (MIPS_EMBED_PC_REGNUM, | ||||
buf + (regsize * FBSD_PCB_REG_PC)); | buf + (regsize * FBSD_PCB_REG_PC)); | ||||
} | } | ||||
static struct trad_frame_cache * | static struct trad_frame_cache * | ||||
mipsfbsd_trapframe_cache (struct frame_info *this_frame, void **this_cache) | mipsfbsd_trapframe_cache (struct frame_info *this_frame, void **this_cache) | ||||
{ | { | ||||
struct gdbarch *gdbarch = get_frame_arch (this_frame); | struct gdbarch *gdbarch = get_frame_arch (this_frame); | ||||
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); | enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); | ||||
size_t regsize = mips_isa_regsize (gdbarch); | size_t regsize = mips_isa_regsize (gdbarch); | ||||
▲ Show 20 Lines • Show All 144 Lines • ▼ Show 20 Lines | mipsfbsd_kernel_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) | ||||
frame_unwind_prepend_unwinder (gdbarch, &mipsfbsd_trapframe_unwind); | frame_unwind_prepend_unwinder (gdbarch, &mipsfbsd_trapframe_unwind); | ||||
set_solib_ops (gdbarch, &kld_so_ops); | set_solib_ops (gdbarch, &kld_so_ops); | ||||
fbsd_vmcore_set_supply_pcb (gdbarch, mipsfbsd_supply_pcb); | fbsd_vmcore_set_supply_pcb (gdbarch, mipsfbsd_supply_pcb); | ||||
fbsd_vmcore_set_cpu_pcb_addr (gdbarch, kgdb_trgt_stop_pcb); | fbsd_vmcore_set_cpu_pcb_addr (gdbarch, kgdb_trgt_stop_pcb); | ||||
} | } | ||||
void _initialize_mips_kgdb_tdep (void); | |||||
void | void | ||||
_initialize_mips_kgdb_tdep (void) | _initialize_mips_kgdb_tdep (void) | ||||
{ | { | ||||
gdbarch_register_osabi_sniffer(bfd_arch_mips, | gdbarch_register_osabi_sniffer(bfd_arch_mips, | ||||
bfd_target_elf_flavour, | bfd_target_elf_flavour, | ||||
fbsd_kernel_osabi_sniffer); | fbsd_kernel_osabi_sniffer); | ||||
gdbarch_register_osabi (bfd_arch_mips, 0, GDB_OSABI_FREEBSD_KERNEL, | gdbarch_register_osabi (bfd_arch_mips, 0, GDB_OSABI_FREEBSD_KERNEL, | ||||
mipsfbsd_kernel_init_abi); | mipsfbsd_kernel_init_abi); | ||||
} | } |