/* Darwin support for GDB, the GNU debugger.
- Copyright (C) 1997-2013 Free Software Foundation, Inc.
+ Copyright (C) 1997-2016 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"
(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++;
}
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);
/* Support for debug registers, boosted mostly from i386-linux-nat.c. */
static void
-i386_darwin_dr_set (int regnum, uint32_t value)
+i386_darwin_dr_set (int regnum, CORE_ADDR value)
{
int current_pid;
thread_t current_thread;
dr_count = x86_DEBUG_STATE_COUNT;
ret = thread_get_state (current_thread, x86_DEBUG_STATE,
(thread_state_t) &dr_regs, &dr_count);
-
- if (ret != KERN_SUCCESS)
- {
- printf_unfiltered (_("Error reading debug registers "
- "thread 0x%x via thread_get_state\n"),
- (int) current_thread);
- MACH_CHECK_ERROR (ret);
- }
+ MACH_CHECK_ERROR (ret);
switch (dr_regs.dsh.flavor)
{
#endif
}
- ret = thread_set_state (current_thread, x86_DEBUG_STATE,
- (thread_state_t) &dr_regs, dr_count);
+ ret = thread_set_state (current_thread, dr_regs.dsh.flavor,
+ (thread_state_t) &dr_regs.uds, dr_count);
- if (ret != KERN_SUCCESS)
- {
- printf_unfiltered (_("Error writing debug registers "
- "thread 0x%x via thread_get_state\n"),
- (int) current_thread);
- MACH_CHECK_ERROR (ret);
- }
+ MACH_CHECK_ERROR (ret);
}
-static uint32_t
+static CORE_ADDR
i386_darwin_dr_get (int regnum)
{
thread_t current_thread;
dr_count = x86_DEBUG_STATE_COUNT;
ret = thread_get_state (current_thread, x86_DEBUG_STATE,
(thread_state_t) &dr_regs, &dr_count);
-
- if (ret != KERN_SUCCESS)
- {
- printf_unfiltered (_("Error reading debug registers "
- "thread 0x%x via thread_get_state\n"),
- (int) current_thread);
- MACH_CHECK_ERROR (ret);
- }
+ MACH_CHECK_ERROR (ret);
switch (dr_regs.dsh.flavor)
{
case x86_THREAD_STATE32:
{
__uint32_t bit = enable ? X86_EFLAGS_T : 0;
-
+
if (enable && i386_darwin_sstep_at_sigreturn (®s))
return;
if ((regs.uts.ts32.__eflags & X86_EFLAGS_T) == bit)
return;
regs.uts.ts32.__eflags
= (regs.uts.ts32.__eflags & ~X86_EFLAGS_T) | bit;
- kret = thread_set_state (thread, x86_THREAD_STATE,
+ kret = thread_set_state (thread, x86_THREAD_STATE,
(thread_state_t) ®s, count);
MACH_CHECK_ERROR (kret);
}
return;
regs.uts.ts64.__rflags
= (regs.uts.ts64.__rflags & ~X86_EFLAGS_T) | bit;
- kret = thread_set_state (thread, x86_THREAD_STATE,
+ kret = thread_set_state (thread, x86_THREAD_STATE,
(thread_state_t) ®s, count);
MACH_CHECK_ERROR (kret);
}
amd64_native_gregset32_num_regs = i386_darwin_thread_state_num_regs;
#endif
- i386_use_watchpoints (target);
+ x86_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;