X-Git-Url: http://drtracing.org/?a=blobdiff_plain;ds=sidebyside;f=gdb%2Fi386-darwin-nat.c;h=63f91ff6a0c22673961042db6d983a52d7582d00;hb=21002a635bf3da33367592e3a3ab3cce24fe5299;hp=66ea943cc9b5e37315dda8a0a13db3278815f71b;hpb=61d82a0d7855c00ec844163e3e137a97afd72ac9;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/i386-darwin-nat.c b/gdb/i386-darwin-nat.c index 66ea943cc9..63f91ff6a0 100644 --- a/gdb/i386-darwin-nat.c +++ b/gdb/i386-darwin-nat.c @@ -1,5 +1,5 @@ /* 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. @@ -27,14 +27,13 @@ #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" @@ -74,6 +73,11 @@ i386_darwin_fetch_inferior_registers (struct target_ops *ops, (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++; } @@ -184,6 +188,10 @@ i386_darwin_store_inferior_registers (struct target_ops *ops, 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); @@ -263,7 +271,7 @@ i386_darwin_store_inferior_registers (struct target_ops *ops, /* 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; @@ -280,14 +288,7 @@ i386_darwin_dr_set (int regnum, uint32_t value) 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) { @@ -353,19 +354,13 @@ i386_darwin_dr_set (int regnum, uint32_t value) #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; @@ -382,14 +377,7 @@ i386_darwin_dr_get (int regnum) 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) { @@ -605,14 +593,14 @@ darwin_set_sstep (thread_t thread, int enable) 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); } @@ -628,7 +616,7 @@ darwin_set_sstep (thread_t thread, int enable) 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); } @@ -649,19 +637,19 @@ darwin_complete_target (struct target_ops *target) 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;