Index: i386-nto-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/i386-nto-tdep.c,v retrieving revision 1.16 diff -c -r1.16 i386-nto-tdep.c *** i386-nto-tdep.c 10 Dec 2004 13:38:23 -0000 1.16 --- i386-nto-tdep.c 23 Dec 2004 17:15:14 -0000 *************** *** 21,37 **** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - #include "gdb_string.h" - #include "gdb_assert.h" #include "defs.h" #include "frame.h" ! #include "target.h" #include "regcache.h" ! #include "solib-svr4.h" #include "i386-tdep.h" - #include "nto-tdep.h" - #include "osabi.h" #include "i387-tdep.h" #ifndef X86_CPU_FXSR #define X86_CPU_FXSR (1L << 12) --- 21,42 ---- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "defs.h" #include "frame.h" ! #include "osabi.h" #include "regcache.h" ! #include "target.h" ! ! #include "gdb_string.h" ! #include "gdb_assert.h" ! #include "i386-tdep.h" #include "i387-tdep.h" + #include "nto-tdep.h" + #include "solib-svr4.h" + + /* Target vector for i386nto target. */ + static struct nto_target_ops i386_nto_target; #ifndef X86_CPU_FXSR #define X86_CPU_FXSR (1L << 12) *************** *** 42,88 **** that is just filler. Don't ask me, ask the kernel guys. */ #define NUM_GPREGS 13 ! /* Map a GDB register number to an offset in the reg structure. */ ! static int regmap[] = { ! (7 * 4), /* eax */ ! (6 * 4), /* ecx */ ! (5 * 4), /* edx */ ! (4 * 4), /* ebx */ ! (11 * 4), /* esp */ ! (2 * 4), /* epb */ ! (1 * 4), /* esi */ ! (0 * 4), /* edi */ ! (8 * 4), /* eip */ ! (10 * 4), /* eflags */ ! (9 * 4), /* cs */ ! (12 * 4), /* ss */ ! (-1 * 4) /* filler */ }; ! static struct nto_target_ops i386_nto_target; - /* Given a gdb regno, return the offset into Neutrino's register structure - or -1 if register is unknown. */ static int ! nto_reg_offset (int regno) { ! return (regno >= 0 && regno < NUM_GPREGS) ? regmap[regno] : -1; } static void i386nto_supply_gregset (char *gpregs) { ! unsigned regno; ! int empty = 0; ! for (regno = 0; regno < I386_NUM_GREGS; regno++) ! { ! int offset = nto_reg_offset (regno); ! if (offset == -1) ! regcache_raw_supply (current_regcache, regno, (char *) &empty); ! else ! regcache_raw_supply (current_regcache, regno, gpregs + offset); ! } } static void --- 47,95 ---- that is just filler. Don't ask me, ask the kernel guys. */ #define NUM_GPREGS 13 ! /* Mapping between the general-purpose registers in `struct xxx' ! format and GDB's register cache layout. */ ! ! /* From . */ ! static int i386nto_gregset_reg_offset[] = ! { ! 7 * 4, /* %eax */ ! 6 * 4, /* %ecx */ ! 5 * 4, /* %edx */ ! 4 * 4, /* %ebx */ ! 11 * 4, /* %esp */ ! 2 * 4, /* %epb */ ! 1 * 4, /* %esi */ ! 0 * 4, /* %edi */ ! 8 * 4, /* %eip */ ! 10 * 4, /* %eflags */ ! 9 * 4, /* %cs */ ! 12 * 4, /* %ss */ ! -1 /* filler */ }; ! /* Given a GDB register number REGNUM, return the offset into ! Neutrino's register structure or -1 if the register is unknown. */ static int ! nto_reg_offset (int regnum) { ! if (regnum >= 0 && regnum < ARRAY_SIZE (i386nto_gregset_reg_offset)) ! return i386nto_gregset_reg_offset[regnum]; ! ! return -1; } static void i386nto_supply_gregset (char *gpregs) { ! struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); ! if(tdep->gregset == NULL) ! tdep->gregset = regset_alloc (current_gdbarch, i386_supply_gregset, NULL); ! ! gdb_assert (tdep->gregset_reg_offset == i386nto_gregset_reg_offset); ! i386_supply_gregset (tdep->gregset, current_regcache, -1, gpregs, NUM_GPREGS * 4); } static void *************** *** 99,105 **** { switch (regset) { ! case NTO_REG_GENERAL: /* QNX has different ordering of GP regs than GDB. */ i386nto_supply_gregset (data); break; case NTO_REG_FLOAT: --- 106,112 ---- { switch (regset) { ! case NTO_REG_GENERAL: i386nto_supply_gregset (data); break; case NTO_REG_FLOAT: *************** *** 194,232 **** return 0; } - static struct link_map_offsets * - i386nto_svr4_fetch_link_map_offsets (void) - { - static struct link_map_offsets lmo; - static struct link_map_offsets *lmp = NULL; - - if (lmp == NULL) - { - lmp = &lmo; - - lmo.r_debug_size = 8; /* The actual size is 20 bytes, but - only 8 bytes are used. */ - lmo.r_map_offset = 4; - lmo.r_map_size = 4; - - lmo.link_map_size = 20; /* The actual size is 552 bytes, but - only 20 bytes are used. */ - lmo.l_addr_offset = 0; - lmo.l_addr_size = 4; - - lmo.l_name_offset = 4; - lmo.l_name_size = 4; - - lmo.l_next_offset = 12; - lmo.l_next_size = 4; - - lmo.l_prev_offset = 16; - lmo.l_prev_size = 4; - } - - return lmp; - } - /* Return whether the frame preceding NEXT_FRAME corresponds to a QNX Neutrino sigtramp routine. */ --- 201,206 ---- *************** *** 268,274 **** i386_nto_target.register_area = i386nto_register_area; i386_nto_target.regset_fill = i386nto_regset_fill; i386_nto_target.fetch_link_map_offsets = ! i386nto_svr4_fetch_link_map_offsets; } static void --- 242,248 ---- i386_nto_target.register_area = i386nto_register_area; i386_nto_target.regset_fill = i386nto_regset_fill; i386_nto_target.fetch_link_map_offsets = ! svr4_ilp32_fetch_link_map_offsets; } static void *************** *** 276,281 **** --- 250,259 ---- { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + /* Register core file support. */ + set_gdbarch_regset_from_core_section + (gdbarch, i386_regset_from_core_section); + /* Deal with our strange signals. */ nto_initialize_signals (); *************** *** 289,294 **** --- 267,276 ---- /* NTO has shared libraries. */ set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); + tdep->gregset_reg_offset = i386nto_gregset_reg_offset; + tdep->gregset_num_regs = ARRAY_SIZE (i386nto_gregset_reg_offset); + tdep->sizeof_gregset = NUM_GPREGS * 4; + tdep->sigtramp_p = i386nto_sigtramp_p; tdep->sigcontext_addr = i386nto_sigcontext_addr; tdep->sc_pc_offset = 56; *************** *** 297,304 **** /* Setjmp()'s return PC saved in EDX (5). */ tdep->jb_pc_offset = 20; /* 5x32 bit ints in. */ ! set_solib_svr4_fetch_link_map_offsets (gdbarch, ! i386nto_svr4_fetch_link_map_offsets); /* Our loader handles solib relocations slightly differently than svr4. */ TARGET_SO_RELOCATE_SECTION_ADDRESSES = nto_relocate_section_addresses; --- 279,286 ---- /* Setjmp()'s return PC saved in EDX (5). */ tdep->jb_pc_offset = 20; /* 5x32 bit ints in. */ ! set_solib_svr4_fetch_link_map_offsets ! (gdbarch, svr4_ilp32_fetch_link_map_offsets); /* Our loader handles solib relocations slightly differently than svr4. */ TARGET_SO_RELOCATE_SECTION_ADDRESSES = nto_relocate_section_addresses; Index: nto-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/nto-tdep.c,v retrieving revision 1.10 diff -c -r1.10 nto-tdep.c *** nto-tdep.c 10 Dec 2004 13:38:23 -0000 1.10 --- nto-tdep.c 23 Dec 2004 17:15:14 -0000 *************** *** 66,72 **** } void ! nto_set_target(struct nto_target_ops *targ) { nto_regset_id = targ->regset_id; nto_supply_gregset = targ->supply_gregset; --- 66,72 ---- } void ! nto_set_target (struct nto_target_ops *targ) { nto_regset_id = targ->regset_id; nto_supply_gregset = targ->supply_gregset; *************** *** 345,385 **** nto_elf_osabi_sniffer (bfd *abfd) { if (nto_is_nto_target) ! return nto_is_nto_target (abfd); return GDB_OSABI_UNKNOWN; } - static void - fetch_core_registers (char *core_reg_sect, unsigned core_reg_size, - int which, CORE_ADDR reg_addr) - { - nto_regset_t regset; - - /* See corelow.c:get_core_registers for values of WHICH. */ - if (which == 0) - { - memcpy ((char *) ®set, core_reg_sect, - min (core_reg_size, sizeof (regset))); - nto_supply_gregset ((char *) ®set); - } - else if (which == 2) - { - memcpy ((char *) ®set, core_reg_sect, - min (core_reg_size, sizeof (regset))); - nto_supply_fpregset ((char *) ®set); - } - } - - /* Register that we are able to handle ELF file formats using standard - procfs "regset" structures. */ - static struct core_fns regset_core_fns = { - bfd_target_elf_flavour, /* core_flavour */ - default_check_format, /* check_format */ - default_core_sniffer, /* core_sniffer */ - fetch_core_registers, /* core_read_registers */ - NULL /* next */ - }; - void nto_initialize_signals (void) { --- 345,354 ---- nto_elf_osabi_sniffer (bfd *abfd) { if (nto_is_nto_target) ! return nto_is_nto_target (abfd); return GDB_OSABI_UNKNOWN; } void nto_initialize_signals (void) { *************** *** 414,419 **** displayed. Different information is displayed\n\ for different positive values.", "\ QNX NTO internal debugging is %s.", NULL, NULL, &setdebuglist, &showdebuglist); - /* Register core file support. */ - deprecated_add_core_fns (®set_core_fns); } --- 383,386 ----