X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fi386-linux-nat.c;h=dd8f141f23b118018a31aad4ca3889d0ecae436a;hb=cdc46a9ff452788a97537114936fad1b142bc747;hp=dd86c2f35376daeb11eb084c6bb0afa0461be2b5;hpb=481695ed5f6e0a8a9c9c50bfac1cdd2b3151e6c9;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/i386-linux-nat.c b/gdb/i386-linux-nat.c index dd86c2f353..dd8f141f23 100644 --- a/gdb/i386-linux-nat.c +++ b/gdb/i386-linux-nat.c @@ -1,6 +1,6 @@ /* Native-dependent code for GNU/Linux i386. - Copyright (C) 1999-2017 Free Software Foundation, Inc. + Copyright (C) 1999-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -31,13 +31,24 @@ #include "i387-tdep.h" #include "i386-tdep.h" #include "i386-linux-tdep.h" -#include "x86-xstate.h" +#include "gdbsupport/x86-xstate.h" -#include "linux-nat.h" #include "x86-linux-nat.h" #include "nat/linux-ptrace.h" #include "inf-ptrace.h" +struct i386_linux_nat_target final : public x86_linux_nat_target +{ + /* Add our register access methods. */ + void fetch_registers (struct regcache *, int) override; + void store_registers (struct regcache *, int) override; + + /* Override the default ptrace resume method. */ + void low_resume (ptid_t ptid, int step, enum gdb_signal sig) override; +}; + +static i386_linux_nat_target the_i386_linux_nat_target; + /* The register sets used in GNU/Linux ELF core-dumps are identical to the register sets in `struct user' that is used for a.out core-dumps, and is also used by `ptrace'. The corresponding types @@ -101,21 +112,21 @@ fetch_register (struct regcache *regcache, int regno) gdb_assert (!have_ptrace_getregs); if (i386_linux_gregset_reg_offset[regno] == -1) { - regcache_raw_supply (regcache, regno, NULL); + regcache->raw_supply (regno, NULL); return; } - tid = get_ptrace_pid (regcache_get_ptid (regcache)); + tid = get_ptrace_pid (regcache->ptid ()); errno = 0; val = ptrace (PTRACE_PEEKUSER, tid, i386_linux_gregset_reg_offset[regno], 0); if (errno != 0) error (_("Couldn't read register %s (#%d): %s."), - gdbarch_register_name (get_regcache_arch (regcache), regno), + gdbarch_register_name (regcache->arch (), regno), regno, safe_strerror (errno)); - regcache_raw_supply (regcache, regno, &val); + regcache->raw_supply (regno, &val); } /* Store one register. */ @@ -130,15 +141,15 @@ store_register (const struct regcache *regcache, int regno) if (i386_linux_gregset_reg_offset[regno] == -1) return; - tid = get_ptrace_pid (regcache_get_ptid (regcache)); + tid = get_ptrace_pid (regcache->ptid ()); errno = 0; - regcache_raw_collect (regcache, regno, &val); + regcache->raw_collect (regno, &val); ptrace (PTRACE_POKEUSER, tid, i386_linux_gregset_reg_offset[regno], val); if (errno != 0) error (_("Couldn't write register %s (#%d): %s."), - gdbarch_register_name (get_regcache_arch (regcache), regno), + gdbarch_register_name (regcache->arch (), regno), regno, safe_strerror (errno)); } @@ -156,13 +167,13 @@ supply_gregset (struct regcache *regcache, const elf_gregset_t *gregsetp) int i; for (i = 0; i < I386_NUM_GREGS; i++) - regcache_raw_supply (regcache, i, - regp + i386_linux_gregset_reg_offset[i]); + regcache->raw_supply (i, regp + i386_linux_gregset_reg_offset[i]); if (I386_LINUX_ORIG_EAX_REGNUM - < gdbarch_num_regs (get_regcache_arch (regcache))) - regcache_raw_supply (regcache, I386_LINUX_ORIG_EAX_REGNUM, regp - + i386_linux_gregset_reg_offset[I386_LINUX_ORIG_EAX_REGNUM]); + < gdbarch_num_regs (regcache->arch ())) + regcache->raw_supply + (I386_LINUX_ORIG_EAX_REGNUM, + regp + i386_linux_gregset_reg_offset[I386_LINUX_ORIG_EAX_REGNUM]); } /* Fill register REGNO (if it is a general-purpose register) in @@ -178,14 +189,14 @@ fill_gregset (const struct regcache *regcache, for (i = 0; i < I386_NUM_GREGS; i++) if (regno == -1 || regno == i) - regcache_raw_collect (regcache, i, - regp + i386_linux_gregset_reg_offset[i]); + regcache->raw_collect (i, regp + i386_linux_gregset_reg_offset[i]); if ((regno == -1 || regno == I386_LINUX_ORIG_EAX_REGNUM) && I386_LINUX_ORIG_EAX_REGNUM - < gdbarch_num_regs (get_regcache_arch (regcache))) - regcache_raw_collect (regcache, I386_LINUX_ORIG_EAX_REGNUM, regp - + i386_linux_gregset_reg_offset[I386_LINUX_ORIG_EAX_REGNUM]); + < gdbarch_num_regs (regcache->arch ())) + regcache->raw_collect + (I386_LINUX_ORIG_EAX_REGNUM, + regp + i386_linux_gregset_reg_offset[I386_LINUX_ORIG_EAX_REGNUM]); } #ifdef HAVE_PTRACE_GETREGS @@ -446,9 +457,8 @@ store_fpxregs (const struct regcache *regcache, int tid, int regno) this for all registers (including the floating point and SSE registers). */ -static void -i386_linux_fetch_inferior_registers (struct target_ops *ops, - struct regcache *regcache, int regno) +void +i386_linux_nat_target::fetch_registers (struct regcache *regcache, int regno) { pid_t tid; @@ -458,14 +468,14 @@ i386_linux_fetch_inferior_registers (struct target_ops *ops, { int i; - for (i = 0; i < gdbarch_num_regs (get_regcache_arch (regcache)); i++) + for (i = 0; i < gdbarch_num_regs (regcache->arch ()); i++) if (regno == -1 || regno == i) fetch_register (regcache, i); return; } - tid = get_ptrace_pid (regcache_get_ptid (regcache)); + tid = get_ptrace_pid (regcache->ptid ()); /* Use the PTRACE_GETFPXREGS request whenever possible, since it transfers more registers in one system call, and we'll cache the @@ -478,7 +488,7 @@ i386_linux_fetch_inferior_registers (struct target_ops *ops, /* The call above might reset `have_ptrace_getregs'. */ if (!have_ptrace_getregs) { - i386_linux_fetch_inferior_registers (ops, regcache, regno); + fetch_registers (regcache, regno); return; } @@ -524,9 +534,8 @@ i386_linux_fetch_inferior_registers (struct target_ops *ops, /* Store register REGNO back into the child process. If REGNO is -1, do this for all registers (including the floating point and SSE registers). */ -static void -i386_linux_store_inferior_registers (struct target_ops *ops, - struct regcache *regcache, int regno) +void +i386_linux_nat_target::store_registers (struct regcache *regcache, int regno) { pid_t tid; @@ -536,14 +545,14 @@ i386_linux_store_inferior_registers (struct target_ops *ops, { int i; - for (i = 0; i < gdbarch_num_regs (get_regcache_arch (regcache)); i++) + for (i = 0; i < gdbarch_num_regs (regcache->arch ()); i++) if (regno == -1 || regno == i) store_register (regcache, i); return; } - tid = get_ptrace_pid (regcache_get_ptid (regcache)); + tid = get_ptrace_pid (regcache->ptid ()); /* Use the PTRACE_SETFPXREGS requests whenever possible, since it transfers more registers in one system call. But remember that @@ -635,11 +644,10 @@ static const unsigned char linux_syscall[] = { 0xcd, 0x80 }; If STEP is nonzero, single-step it. If SIGNAL is nonzero, give it that signal. */ -static void -i386_linux_resume (struct target_ops *ops, - ptid_t ptid, int step, enum gdb_signal signal) +void +i386_linux_nat_target::low_resume (ptid_t ptid, int step, enum gdb_signal signal) { - int pid = ptid_get_lwp (ptid); + int pid = ptid.lwp (); int request; if (catch_syscall_enabled () > 0) @@ -650,7 +658,7 @@ i386_linux_resume (struct target_ops *ops, if (step) { struct regcache *regcache = get_thread_regcache (ptid); - struct gdbarch *gdbarch = get_regcache_arch (regcache); + struct gdbarch *gdbarch = regcache->arch (); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); ULONGEST pc; gdb_byte buf[LINUX_SYSCALL_LEN]; @@ -706,16 +714,8 @@ i386_linux_resume (struct target_ops *ops, void _initialize_i386_linux_nat (void) { - /* Create a generic x86 GNU/Linux target. */ - struct target_ops *t = x86_linux_create_target (); - - /* Override the default ptrace resume method. */ - t->to_resume = i386_linux_resume; - - /* Add our register access methods. */ - t->to_fetch_registers = i386_linux_fetch_inferior_registers; - t->to_store_registers = i386_linux_store_inferior_registers; + linux_target = &the_i386_linux_nat_target; /* Add the target. */ - x86_linux_add_target (t); + add_inf_child_target (linux_target); }