X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fi386-nto-tdep.c;h=91f99da0c1eb8693b066aca319ff82251e9ece2f;hb=517e9505fa563c83b4d5cb192e423a0d6baac752;hp=248597f710567c42aaf35aca47243abd07d093cf;hpb=dbfb31a45ca49473f5e49687c0845d4b6c2310d9;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/i386-nto-tdep.c b/gdb/i386-nto-tdep.c index 248597f710..91f99da0c1 100644 --- a/gdb/i386-nto-tdep.c +++ b/gdb/i386-nto-tdep.c @@ -1,6 +1,6 @@ /* Target-dependent code for QNX Neutrino x86. - Copyright (C) 2003, 2004, 2007, 2008, 2009 Free Software Foundation, Inc. + Copyright (C) 2003-2019 Free Software Foundation, Inc. Contributed by QNX Software Systems Ltd. @@ -25,18 +25,12 @@ #include "regcache.h" #include "target.h" -#include "gdb_assert.h" -#include "gdb_string.h" - #include "i386-tdep.h" #include "i387-tdep.h" #include "nto-tdep.h" #include "solib.h" #include "solib-svr4.h" -/* Target vector for QNX NTO x86. */ -static struct nto_target_ops i386_nto_target; - #ifndef X86_CPU_FXSR #define X86_CPU_FXSR (1L << 12) #endif @@ -82,16 +76,12 @@ nto_reg_offset (int regnum) static void i386nto_supply_gregset (struct regcache *regcache, char *gpregs) { - struct gdbarch *gdbarch = get_regcache_arch (regcache); + struct gdbarch *gdbarch = regcache->arch (); struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); - if(tdep->gregset == NULL) - tdep->gregset = regset_alloc (gdbarch, i386_supply_gregset, - i386_collect_gregset); - gdb_assert (tdep->gregset_reg_offset == i386nto_gregset_reg_offset); - tdep->gregset->supply_regset (tdep->gregset, regcache, -1, - gpregs, NUM_GPREGS * 4); + i386_gregset.supply_regset (&i386_gregset, regcache, -1, + gpregs, NUM_GPREGS * 4); } static void @@ -124,7 +114,7 @@ i386nto_regset_id (int regno) return NTO_REG_END; else if (regno < I386_NUM_GREGS) return NTO_REG_GENERAL; - else if (regno < I386_NUM_GREGS + I386_NUM_FREGS) + else if (regno < I386_NUM_GREGS + I387_NUM_REGS) return NTO_REG_FLOAT; else if (regno < I386_SSE_NUM_REGS) return NTO_REG_FLOAT; /* We store xmm registers in fxsave_area. */ @@ -137,7 +127,6 @@ i386nto_register_area (struct gdbarch *gdbarch, int regno, int regset, unsigned *off) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); - int len; *off = 0; if (regset == NTO_REG_GENERAL) @@ -261,7 +250,7 @@ i386nto_regset_fill (const struct regcache *regcache, int regset, char *data) { int offset = nto_reg_offset (regno); if (offset != -1) - regcache_raw_collect (regcache, regno, data + offset); + regcache->raw_collect (regno, data + offset); } } else if (regset == NTO_REG_FLOAT) @@ -284,40 +273,42 @@ static int i386nto_sigtramp_p (struct frame_info *this_frame) { CORE_ADDR pc = get_frame_pc (this_frame); - char *name; + const char *name; find_pc_partial_function (pc, &name, NULL, NULL); return name && strcmp ("__signalstub", name) == 0; } -#define I386_NTO_SIGCONTEXT_OFFSET 136 - /* Assuming THIS_FRAME is a QNX Neutrino sigtramp routine, return the address of the associated sigcontext structure. */ static CORE_ADDR i386nto_sigcontext_addr (struct frame_info *this_frame) { - char buf[4]; - CORE_ADDR sp; + struct gdbarch *gdbarch = get_frame_arch (this_frame); + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); + gdb_byte buf[4]; + CORE_ADDR ptrctx; - get_frame_register (this_frame, I386_ESP_REGNUM, buf); - sp = extract_unsigned_integer (buf, 4); + /* We store __ucontext_t addr in EDI register. */ + get_frame_register (this_frame, I386_EDI_REGNUM, buf); + ptrctx = extract_unsigned_integer (buf, 4, byte_order); + ptrctx += 24 /* Context pointer is at this offset. */; - return sp + I386_NTO_SIGCONTEXT_OFFSET; + return ptrctx; } static void init_i386nto_ops (void) { - i386_nto_target.regset_id = i386nto_regset_id; - i386_nto_target.supply_gregset = i386nto_supply_gregset; - i386_nto_target.supply_fpregset = i386nto_supply_fpregset; - i386_nto_target.supply_altregset = nto_dummy_supply_regset; - i386_nto_target.supply_regset = i386nto_supply_regset; - i386_nto_target.register_area = i386nto_register_area; - i386_nto_target.regset_fill = i386nto_regset_fill; - i386_nto_target.fetch_link_map_offsets = + nto_regset_id = i386nto_regset_id; + nto_supply_gregset = i386nto_supply_gregset; + nto_supply_fpregset = i386nto_supply_fpregset; + nto_supply_altregset = nto_dummy_supply_regset; + nto_supply_regset = i386nto_supply_regset; + nto_register_area = i386nto_register_area; + nto_regset_fill = i386nto_regset_fill; + nto_fetch_link_map_offsets = svr4_ilp32_fetch_link_map_offsets; } @@ -343,8 +334,8 @@ i386nto_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) tdep->sigtramp_p = i386nto_sigtramp_p; tdep->sigcontext_addr = i386nto_sigcontext_addr; - tdep->sc_pc_offset = 56; - tdep->sc_sp_offset = 68; + tdep->sc_reg_offset = i386nto_gregset_reg_offset; + tdep->sc_num_regs = ARRAY_SIZE (i386nto_gregset_reg_offset); /* Setjmp()'s return PC saved in EDX (5). */ tdep->jb_pc_offset = 20; /* 5x32 bit ints in. */ @@ -372,12 +363,10 @@ i386nto_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) } set_solib_ops (gdbarch, &nto_svr4_so_ops); - nto_set_target (&i386_nto_target); + set_gdbarch_wchar_bit (gdbarch, 32); + set_gdbarch_wchar_signed (gdbarch, 0); } -/* Provide a prototype to silence -Wmissing-prototypes. */ -extern initialize_file_ftype _initialize_i386nto_tdep; - void _initialize_i386nto_tdep (void) {