/* Darwin support for GDB, the GNU debugger.
- Copyright (C) 1997-2014 Free Software Foundation, Inc.
+ Copyright (C) 1997-2018 Free Software Foundation, Inc.
Contributed by Apple Computer, Inc.
#include "objfiles.h"
#include "gdbcmd.h"
#include "regcache.h"
-#include "gdb_assert.h"
#include "i386-tdep.h"
#include "i387-tdep.h"
#include "gdbarch.h"
#include "arch-utils.h"
#include "gdbcore.h"
-#include "i386-nat.h"
+#include "x86-nat.h"
#include "darwin-nat.h"
#include "i386-darwin-tdep.h"
#include "amd64-darwin-tdep.h"
#endif
+struct i386_darwin_nat_target final : public x86_nat_target<darwin_nat_target>
+{
+ /* Add our register access methods. */
+ void fetch_registers (struct regcache *, int) override;
+ void store_registers (struct regcache *, int) override;
+};
+
+static struct i386_darwin_nat_target darwin_target;
+
/* Read register values from the inferior process.
If REGNO is -1, do this for all registers.
Otherwise, REGNO specifies which register (so we can save time). */
-static void
-i386_darwin_fetch_inferior_registers (struct target_ops *ops,
- struct regcache *regcache, int regno)
+
+void
+i386_darwin_nat_target::fetch_registers (struct regcache *regcache, int regno)
{
- thread_t current_thread = ptid_get_tid (inferior_ptid);
+ thread_t current_thread = ptid_get_tid (regcache_get_ptid (regcache));
int fetched = 0;
- struct gdbarch *gdbarch = get_regcache_arch (regcache);
+ struct gdbarch *gdbarch = regcache->arch ();
#ifdef BFD64
if (gdbarch_ptr_bit (gdbarch) == 64)
(unsigned long) current_thread);
MACH_CHECK_ERROR (ret);
}
+
+ /* Some kernels don't sanitize the values. */
+ gp_regs.uts.ts64.__fs &= 0xffff;
+ gp_regs.uts.ts64.__gs &= 0xffff;
+
amd64_supply_native_gregset (regcache, &gp_regs.uts, -1);
fetched++;
}
If REGNO is -1, do this for all registers.
Otherwise, REGNO specifies which register (so we can save time). */
-static void
-i386_darwin_store_inferior_registers (struct target_ops *ops,
- struct regcache *regcache, int regno)
+void
+i386_darwin_nat_target::store_registers (struct regcache *regcache,
+ int regno)
{
- thread_t current_thread = ptid_get_tid (inferior_ptid);
- struct gdbarch *gdbarch = get_regcache_arch (regcache);
+ thread_t current_thread = ptid_get_tid (regcache_get_ptid (regcache));
+ struct gdbarch *gdbarch = regcache->arch ();
#ifdef BFD64
if (gdbarch_ptr_bit (gdbarch) == 64)
amd64_collect_native_gregset (regcache, &gp_regs.uts, regno);
+ /* Some kernels don't sanitize the values. */
+ gp_regs.uts.ts64.__fs &= 0xffff;
+ gp_regs.uts.ts64.__gs &= 0xffff;
+
ret = thread_set_state (current_thread, x86_THREAD_STATE,
(thread_state_t) &gp_regs,
x86_THREAD_STATE_COUNT);
}
void
-darwin_complete_target (struct target_ops *target)
+_initialize_i386_darwin_nat (void)
{
#ifdef BFD64
amd64_native_gregset64_reg_offset = amd64_darwin_thread_state_reg_offset;
amd64_native_gregset32_num_regs = i386_darwin_thread_state_num_regs;
#endif
- i386_use_watchpoints (target);
-
- i386_dr_low.set_control = i386_darwin_dr_set_control;
- i386_dr_low.set_addr = i386_darwin_dr_set_addr;
- i386_dr_low.get_addr = i386_darwin_dr_get_addr;
- i386_dr_low.get_status = i386_darwin_dr_get_status;
- i386_dr_low.get_control = i386_darwin_dr_get_control;
+ x86_dr_low.set_control = i386_darwin_dr_set_control;
+ x86_dr_low.set_addr = i386_darwin_dr_set_addr;
+ x86_dr_low.get_addr = i386_darwin_dr_get_addr;
+ x86_dr_low.get_status = i386_darwin_dr_get_status;
+ x86_dr_low.get_control = i386_darwin_dr_get_control;
/* Let's assume that the kernel is 64 bits iff the executable is. */
#ifdef __x86_64__
- i386_set_debug_register_length (8);
+ x86_set_debug_register_length (8);
#else
- i386_set_debug_register_length (4);
+ x86_set_debug_register_length (4);
#endif
- target->to_fetch_registers = i386_darwin_fetch_inferior_registers;
- target->to_store_registers = i386_darwin_store_inferior_registers;
+ add_inf_child_target (&darwin_target);
}