Home | History | Annotate | Line # | Download | only in gdb
i386-darwin-nat.c revision 1.1.1.1
      1  1.1  christos /* Darwin support for GDB, the GNU debugger.
      2  1.1  christos    Copyright (C) 1997-2014 Free Software Foundation, Inc.
      3  1.1  christos 
      4  1.1  christos    Contributed by Apple Computer, Inc.
      5  1.1  christos 
      6  1.1  christos    This file is part of GDB.
      7  1.1  christos 
      8  1.1  christos    This program is free software; you can redistribute it and/or modify
      9  1.1  christos    it under the terms of the GNU General Public License as published by
     10  1.1  christos    the Free Software Foundation; either version 3 of the License, or
     11  1.1  christos    (at your option) any later version.
     12  1.1  christos 
     13  1.1  christos    This program is distributed in the hope that it will be useful,
     14  1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     15  1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16  1.1  christos    GNU General Public License for more details.
     17  1.1  christos 
     18  1.1  christos    You should have received a copy of the GNU General Public License
     19  1.1  christos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     20  1.1  christos 
     21  1.1  christos #include "defs.h"
     22  1.1  christos #include "frame.h"
     23  1.1  christos #include "inferior.h"
     24  1.1  christos #include "target.h"
     25  1.1  christos #include "symfile.h"
     26  1.1  christos #include "symtab.h"
     27  1.1  christos #include "objfiles.h"
     28  1.1  christos #include "gdbcmd.h"
     29  1.1  christos #include "regcache.h"
     30  1.1  christos #include "gdb_assert.h"
     31  1.1  christos #include "i386-tdep.h"
     32  1.1  christos #include "i387-tdep.h"
     33  1.1  christos #include "gdbarch.h"
     34  1.1  christos #include "arch-utils.h"
     35  1.1  christos #include "gdbcore.h"
     36  1.1  christos 
     37  1.1  christos #include "i386-nat.h"
     38  1.1  christos #include "darwin-nat.h"
     39  1.1  christos #include "i386-darwin-tdep.h"
     40  1.1  christos 
     41  1.1  christos #ifdef BFD64
     42  1.1  christos #include "amd64-nat.h"
     43  1.1  christos #include "amd64-tdep.h"
     44  1.1  christos #include "amd64-darwin-tdep.h"
     45  1.1  christos #endif
     46  1.1  christos 
     47  1.1  christos /* Read register values from the inferior process.
     48  1.1  christos    If REGNO is -1, do this for all registers.
     49  1.1  christos    Otherwise, REGNO specifies which register (so we can save time).  */
     50  1.1  christos static void
     51  1.1  christos i386_darwin_fetch_inferior_registers (struct target_ops *ops,
     52  1.1  christos 				      struct regcache *regcache, int regno)
     53  1.1  christos {
     54  1.1  christos   thread_t current_thread = ptid_get_tid (inferior_ptid);
     55  1.1  christos   int fetched = 0;
     56  1.1  christos   struct gdbarch *gdbarch = get_regcache_arch (regcache);
     57  1.1  christos 
     58  1.1  christos #ifdef BFD64
     59  1.1  christos   if (gdbarch_ptr_bit (gdbarch) == 64)
     60  1.1  christos     {
     61  1.1  christos       if (regno == -1 || amd64_native_gregset_supplies_p (gdbarch, regno))
     62  1.1  christos         {
     63  1.1  christos           x86_thread_state_t gp_regs;
     64  1.1  christos           unsigned int gp_count = x86_THREAD_STATE_COUNT;
     65  1.1  christos           kern_return_t ret;
     66  1.1  christos 
     67  1.1  christos 	  ret = thread_get_state
     68  1.1  christos             (current_thread, x86_THREAD_STATE, (thread_state_t) & gp_regs,
     69  1.1  christos              &gp_count);
     70  1.1  christos 	  if (ret != KERN_SUCCESS)
     71  1.1  christos 	    {
     72  1.1  christos 	      printf_unfiltered (_("Error calling thread_get_state for "
     73  1.1  christos 				   "GP registers for thread 0x%lx\n"),
     74  1.1  christos 				 (unsigned long) current_thread);
     75  1.1  christos 	      MACH_CHECK_ERROR (ret);
     76  1.1  christos 	    }
     77  1.1  christos 	  amd64_supply_native_gregset (regcache, &gp_regs.uts, -1);
     78  1.1  christos           fetched++;
     79  1.1  christos         }
     80  1.1  christos 
     81  1.1  christos       if (regno == -1 || !amd64_native_gregset_supplies_p (gdbarch, regno))
     82  1.1  christos         {
     83  1.1  christos           x86_float_state_t fp_regs;
     84  1.1  christos           unsigned int fp_count = x86_FLOAT_STATE_COUNT;
     85  1.1  christos           kern_return_t ret;
     86  1.1  christos 
     87  1.1  christos 	  ret = thread_get_state
     88  1.1  christos             (current_thread, x86_FLOAT_STATE, (thread_state_t) & fp_regs,
     89  1.1  christos              &fp_count);
     90  1.1  christos 	  if (ret != KERN_SUCCESS)
     91  1.1  christos 	    {
     92  1.1  christos 	      printf_unfiltered (_("Error calling thread_get_state for "
     93  1.1  christos 				   "float registers for thread 0x%lx\n"),
     94  1.1  christos 				 (unsigned long) current_thread);
     95  1.1  christos 	      MACH_CHECK_ERROR (ret);
     96  1.1  christos 	    }
     97  1.1  christos           amd64_supply_fxsave (regcache, -1, &fp_regs.ufs.fs64.__fpu_fcw);
     98  1.1  christos           fetched++;
     99  1.1  christos         }
    100  1.1  christos     }
    101  1.1  christos   else
    102  1.1  christos #endif
    103  1.1  christos     {
    104  1.1  christos       if (regno == -1 || regno < I386_NUM_GREGS)
    105  1.1  christos         {
    106  1.1  christos           x86_thread_state32_t gp_regs;
    107  1.1  christos           unsigned int gp_count = x86_THREAD_STATE32_COUNT;
    108  1.1  christos           kern_return_t ret;
    109  1.1  christos 	  int i;
    110  1.1  christos 
    111  1.1  christos 	  ret = thread_get_state
    112  1.1  christos             (current_thread, x86_THREAD_STATE32, (thread_state_t) &gp_regs,
    113  1.1  christos              &gp_count);
    114  1.1  christos 	  if (ret != KERN_SUCCESS)
    115  1.1  christos 	    {
    116  1.1  christos 	      printf_unfiltered (_("Error calling thread_get_state for "
    117  1.1  christos 				   "GP registers for thread 0x%lx\n"),
    118  1.1  christos 				 (unsigned long) current_thread);
    119  1.1  christos 	      MACH_CHECK_ERROR (ret);
    120  1.1  christos 	    }
    121  1.1  christos 	  for (i = 0; i < I386_NUM_GREGS; i++)
    122  1.1  christos 	    regcache_raw_supply
    123  1.1  christos 	      (regcache, i,
    124  1.1  christos 	       (char *)&gp_regs + i386_darwin_thread_state_reg_offset[i]);
    125  1.1  christos 
    126  1.1  christos           fetched++;
    127  1.1  christos         }
    128  1.1  christos 
    129  1.1  christos       if (regno == -1
    130  1.1  christos 	  || (regno >= I386_ST0_REGNUM && regno < I386_SSE_NUM_REGS))
    131  1.1  christos         {
    132  1.1  christos           x86_float_state32_t fp_regs;
    133  1.1  christos           unsigned int fp_count = x86_FLOAT_STATE32_COUNT;
    134  1.1  christos           kern_return_t ret;
    135  1.1  christos 
    136  1.1  christos 	  ret = thread_get_state
    137  1.1  christos             (current_thread, x86_FLOAT_STATE32, (thread_state_t) &fp_regs,
    138  1.1  christos              &fp_count);
    139  1.1  christos 	  if (ret != KERN_SUCCESS)
    140  1.1  christos 	    {
    141  1.1  christos 	      printf_unfiltered (_("Error calling thread_get_state for "
    142  1.1  christos 				   "float registers for thread 0x%lx\n"),
    143  1.1  christos 				 (unsigned long) current_thread);
    144  1.1  christos 	      MACH_CHECK_ERROR (ret);
    145  1.1  christos 	    }
    146  1.1  christos           i387_supply_fxsave (regcache, -1, &fp_regs.__fpu_fcw);
    147  1.1  christos           fetched++;
    148  1.1  christos         }
    149  1.1  christos     }
    150  1.1  christos 
    151  1.1  christos   if (! fetched)
    152  1.1  christos     {
    153  1.1  christos       warning (_("unknown register %d"), regno);
    154  1.1  christos       regcache_raw_supply (regcache, regno, NULL);
    155  1.1  christos     }
    156  1.1  christos }
    157  1.1  christos 
    158  1.1  christos /* Store our register values back into the inferior.
    159  1.1  christos    If REGNO is -1, do this for all registers.
    160  1.1  christos    Otherwise, REGNO specifies which register (so we can save time).  */
    161  1.1  christos 
    162  1.1  christos static void
    163  1.1  christos i386_darwin_store_inferior_registers (struct target_ops *ops,
    164  1.1  christos 				      struct regcache *regcache, int regno)
    165  1.1  christos {
    166  1.1  christos   thread_t current_thread = ptid_get_tid (inferior_ptid);
    167  1.1  christos   struct gdbarch *gdbarch = get_regcache_arch (regcache);
    168  1.1  christos 
    169  1.1  christos #ifdef BFD64
    170  1.1  christos   if (gdbarch_ptr_bit (gdbarch) == 64)
    171  1.1  christos     {
    172  1.1  christos       if (regno == -1 || amd64_native_gregset_supplies_p (gdbarch, regno))
    173  1.1  christos         {
    174  1.1  christos           x86_thread_state_t gp_regs;
    175  1.1  christos           kern_return_t ret;
    176  1.1  christos 	  unsigned int gp_count = x86_THREAD_STATE_COUNT;
    177  1.1  christos 
    178  1.1  christos 	  ret = thread_get_state
    179  1.1  christos 	    (current_thread, x86_THREAD_STATE, (thread_state_t) &gp_regs,
    180  1.1  christos 	     &gp_count);
    181  1.1  christos           MACH_CHECK_ERROR (ret);
    182  1.1  christos 	  gdb_assert (gp_regs.tsh.flavor == x86_THREAD_STATE64);
    183  1.1  christos           gdb_assert (gp_regs.tsh.count == x86_THREAD_STATE64_COUNT);
    184  1.1  christos 
    185  1.1  christos 	  amd64_collect_native_gregset (regcache, &gp_regs.uts, regno);
    186  1.1  christos 
    187  1.1  christos           ret = thread_set_state (current_thread, x86_THREAD_STATE,
    188  1.1  christos                                   (thread_state_t) &gp_regs,
    189  1.1  christos                                   x86_THREAD_STATE_COUNT);
    190  1.1  christos           MACH_CHECK_ERROR (ret);
    191  1.1  christos         }
    192  1.1  christos 
    193  1.1  christos       if (regno == -1 || !amd64_native_gregset_supplies_p (gdbarch, regno))
    194  1.1  christos         {
    195  1.1  christos           x86_float_state_t fp_regs;
    196  1.1  christos           kern_return_t ret;
    197  1.1  christos 	  unsigned int fp_count = x86_FLOAT_STATE_COUNT;
    198  1.1  christos 
    199  1.1  christos 	  ret = thread_get_state
    200  1.1  christos 	    (current_thread, x86_FLOAT_STATE, (thread_state_t) & fp_regs,
    201  1.1  christos 	     &fp_count);
    202  1.1  christos           MACH_CHECK_ERROR (ret);
    203  1.1  christos           gdb_assert (fp_regs.fsh.flavor == x86_FLOAT_STATE64);
    204  1.1  christos           gdb_assert (fp_regs.fsh.count == x86_FLOAT_STATE64_COUNT);
    205  1.1  christos 
    206  1.1  christos 	  amd64_collect_fxsave (regcache, regno, &fp_regs.ufs.fs64.__fpu_fcw);
    207  1.1  christos 
    208  1.1  christos 	  ret = thread_set_state (current_thread, x86_FLOAT_STATE,
    209  1.1  christos 				  (thread_state_t) & fp_regs,
    210  1.1  christos 				  x86_FLOAT_STATE_COUNT);
    211  1.1  christos 	  MACH_CHECK_ERROR (ret);
    212  1.1  christos         }
    213  1.1  christos     }
    214  1.1  christos   else
    215  1.1  christos #endif
    216  1.1  christos     {
    217  1.1  christos       if (regno == -1 || regno < I386_NUM_GREGS)
    218  1.1  christos         {
    219  1.1  christos           x86_thread_state32_t gp_regs;
    220  1.1  christos           kern_return_t ret;
    221  1.1  christos           unsigned int gp_count = x86_THREAD_STATE32_COUNT;
    222  1.1  christos 	  int i;
    223  1.1  christos 
    224  1.1  christos           ret = thread_get_state
    225  1.1  christos             (current_thread, x86_THREAD_STATE32, (thread_state_t) &gp_regs,
    226  1.1  christos              &gp_count);
    227  1.1  christos 	  MACH_CHECK_ERROR (ret);
    228  1.1  christos 
    229  1.1  christos 	  for (i = 0; i < I386_NUM_GREGS; i++)
    230  1.1  christos 	    if (regno == -1 || regno == i)
    231  1.1  christos 	      regcache_raw_collect
    232  1.1  christos 		(regcache, i,
    233  1.1  christos 		 (char *)&gp_regs + i386_darwin_thread_state_reg_offset[i]);
    234  1.1  christos 
    235  1.1  christos           ret = thread_set_state (current_thread, x86_THREAD_STATE32,
    236  1.1  christos                                   (thread_state_t) &gp_regs,
    237  1.1  christos                                   x86_THREAD_STATE32_COUNT);
    238  1.1  christos           MACH_CHECK_ERROR (ret);
    239  1.1  christos         }
    240  1.1  christos 
    241  1.1  christos       if (regno == -1
    242  1.1  christos 	  || (regno >= I386_ST0_REGNUM && regno < I386_SSE_NUM_REGS))
    243  1.1  christos         {
    244  1.1  christos           x86_float_state32_t fp_regs;
    245  1.1  christos           unsigned int fp_count = x86_FLOAT_STATE32_COUNT;
    246  1.1  christos           kern_return_t ret;
    247  1.1  christos 
    248  1.1  christos 	  ret = thread_get_state
    249  1.1  christos             (current_thread, x86_FLOAT_STATE32, (thread_state_t) & fp_regs,
    250  1.1  christos              &fp_count);
    251  1.1  christos 	  MACH_CHECK_ERROR (ret);
    252  1.1  christos 
    253  1.1  christos 	  i387_collect_fxsave (regcache, regno, &fp_regs.__fpu_fcw);
    254  1.1  christos 
    255  1.1  christos 	  ret = thread_set_state (current_thread, x86_FLOAT_STATE32,
    256  1.1  christos 				  (thread_state_t) &fp_regs,
    257  1.1  christos 				  x86_FLOAT_STATE32_COUNT);
    258  1.1  christos 	  MACH_CHECK_ERROR (ret);
    259  1.1  christos         }
    260  1.1  christos     }
    261  1.1  christos }
    262  1.1  christos 
    263  1.1  christos /* Support for debug registers, boosted mostly from i386-linux-nat.c.  */
    264  1.1  christos 
    265  1.1  christos static void
    266  1.1  christos i386_darwin_dr_set (int regnum, CORE_ADDR value)
    267  1.1  christos {
    268  1.1  christos   int current_pid;
    269  1.1  christos   thread_t current_thread;
    270  1.1  christos   x86_debug_state_t dr_regs;
    271  1.1  christos   kern_return_t ret;
    272  1.1  christos   unsigned int dr_count;
    273  1.1  christos 
    274  1.1  christos   gdb_assert (regnum >= 0 && regnum <= DR_CONTROL);
    275  1.1  christos 
    276  1.1  christos   current_thread = ptid_get_tid (inferior_ptid);
    277  1.1  christos 
    278  1.1  christos   dr_regs.dsh.flavor = x86_DEBUG_STATE;
    279  1.1  christos   dr_regs.dsh.count = x86_DEBUG_STATE_COUNT;
    280  1.1  christos   dr_count = x86_DEBUG_STATE_COUNT;
    281  1.1  christos   ret = thread_get_state (current_thread, x86_DEBUG_STATE,
    282  1.1  christos                           (thread_state_t) &dr_regs, &dr_count);
    283  1.1  christos   MACH_CHECK_ERROR (ret);
    284  1.1  christos 
    285  1.1  christos   switch (dr_regs.dsh.flavor)
    286  1.1  christos     {
    287  1.1  christos     case x86_DEBUG_STATE32:
    288  1.1  christos       switch (regnum)
    289  1.1  christos 	{
    290  1.1  christos 	case 0:
    291  1.1  christos 	  dr_regs.uds.ds32.__dr0 = value;
    292  1.1  christos 	  break;
    293  1.1  christos 	case 1:
    294  1.1  christos 	  dr_regs.uds.ds32.__dr1 = value;
    295  1.1  christos 	  break;
    296  1.1  christos 	case 2:
    297  1.1  christos 	  dr_regs.uds.ds32.__dr2 = value;
    298  1.1  christos 	  break;
    299  1.1  christos 	case 3:
    300  1.1  christos 	  dr_regs.uds.ds32.__dr3 = value;
    301  1.1  christos 	  break;
    302  1.1  christos 	case 4:
    303  1.1  christos 	  dr_regs.uds.ds32.__dr4 = value;
    304  1.1  christos 	  break;
    305  1.1  christos 	case 5:
    306  1.1  christos 	  dr_regs.uds.ds32.__dr5 = value;
    307  1.1  christos 	  break;
    308  1.1  christos 	case 6:
    309  1.1  christos 	  dr_regs.uds.ds32.__dr6 = value;
    310  1.1  christos 	  break;
    311  1.1  christos 	case 7:
    312  1.1  christos 	  dr_regs.uds.ds32.__dr7 = value;
    313  1.1  christos 	  break;
    314  1.1  christos 	}
    315  1.1  christos       break;
    316  1.1  christos #ifdef BFD64
    317  1.1  christos     case x86_DEBUG_STATE64:
    318  1.1  christos       switch (regnum)
    319  1.1  christos 	{
    320  1.1  christos 	case 0:
    321  1.1  christos 	  dr_regs.uds.ds64.__dr0 = value;
    322  1.1  christos 	  break;
    323  1.1  christos 	case 1:
    324  1.1  christos 	  dr_regs.uds.ds64.__dr1 = value;
    325  1.1  christos 	  break;
    326  1.1  christos 	case 2:
    327  1.1  christos 	  dr_regs.uds.ds64.__dr2 = value;
    328  1.1  christos 	  break;
    329  1.1  christos 	case 3:
    330  1.1  christos 	  dr_regs.uds.ds64.__dr3 = value;
    331  1.1  christos 	  break;
    332  1.1  christos 	case 4:
    333  1.1  christos 	  dr_regs.uds.ds64.__dr4 = value;
    334  1.1  christos 	  break;
    335  1.1  christos 	case 5:
    336  1.1  christos 	  dr_regs.uds.ds64.__dr5 = value;
    337  1.1  christos 	  break;
    338  1.1  christos 	case 6:
    339  1.1  christos 	  dr_regs.uds.ds64.__dr6 = value;
    340  1.1  christos 	  break;
    341  1.1  christos 	case 7:
    342  1.1  christos 	  dr_regs.uds.ds64.__dr7 = value;
    343  1.1  christos 	  break;
    344  1.1  christos 	}
    345  1.1  christos       break;
    346  1.1  christos #endif
    347  1.1  christos     }
    348  1.1  christos 
    349  1.1  christos   ret = thread_set_state (current_thread, dr_regs.dsh.flavor,
    350  1.1  christos                           (thread_state_t) &dr_regs.uds, dr_count);
    351  1.1  christos 
    352  1.1  christos   MACH_CHECK_ERROR (ret);
    353  1.1  christos }
    354  1.1  christos 
    355  1.1  christos static CORE_ADDR
    356  1.1  christos i386_darwin_dr_get (int regnum)
    357  1.1  christos {
    358  1.1  christos   thread_t current_thread;
    359  1.1  christos   x86_debug_state_t dr_regs;
    360  1.1  christos   kern_return_t ret;
    361  1.1  christos   unsigned int dr_count;
    362  1.1  christos 
    363  1.1  christos   gdb_assert (regnum >= 0 && regnum <= DR_CONTROL);
    364  1.1  christos 
    365  1.1  christos   current_thread = ptid_get_tid (inferior_ptid);
    366  1.1  christos 
    367  1.1  christos   dr_regs.dsh.flavor = x86_DEBUG_STATE;
    368  1.1  christos   dr_regs.dsh.count = x86_DEBUG_STATE_COUNT;
    369  1.1  christos   dr_count = x86_DEBUG_STATE_COUNT;
    370  1.1  christos   ret = thread_get_state (current_thread, x86_DEBUG_STATE,
    371  1.1  christos                           (thread_state_t) &dr_regs, &dr_count);
    372  1.1  christos   MACH_CHECK_ERROR (ret);
    373  1.1  christos 
    374  1.1  christos   switch (dr_regs.dsh.flavor)
    375  1.1  christos     {
    376  1.1  christos     case x86_DEBUG_STATE32:
    377  1.1  christos       switch (regnum)
    378  1.1  christos 	{
    379  1.1  christos 	case 0:
    380  1.1  christos 	  return dr_regs.uds.ds32.__dr0;
    381  1.1  christos 	case 1:
    382  1.1  christos 	  return dr_regs.uds.ds32.__dr1;
    383  1.1  christos 	case 2:
    384  1.1  christos 	  return dr_regs.uds.ds32.__dr2;
    385  1.1  christos 	case 3:
    386  1.1  christos 	  return dr_regs.uds.ds32.__dr3;
    387  1.1  christos 	case 4:
    388  1.1  christos 	  return dr_regs.uds.ds32.__dr4;
    389  1.1  christos 	case 5:
    390  1.1  christos 	  return dr_regs.uds.ds32.__dr5;
    391  1.1  christos 	case 6:
    392  1.1  christos 	  return dr_regs.uds.ds32.__dr6;
    393  1.1  christos 	case 7:
    394  1.1  christos 	  return dr_regs.uds.ds32.__dr7;
    395  1.1  christos 	default:
    396  1.1  christos 	  return -1;
    397  1.1  christos 	}
    398  1.1  christos       break;
    399  1.1  christos #ifdef BFD64
    400  1.1  christos     case x86_DEBUG_STATE64:
    401  1.1  christos       switch (regnum)
    402  1.1  christos 	{
    403  1.1  christos 	case 0:
    404  1.1  christos 	  return dr_regs.uds.ds64.__dr0;
    405  1.1  christos 	case 1:
    406  1.1  christos 	  return dr_regs.uds.ds64.__dr1;
    407  1.1  christos 	case 2:
    408  1.1  christos 	  return dr_regs.uds.ds64.__dr2;
    409  1.1  christos 	case 3:
    410  1.1  christos 	  return dr_regs.uds.ds64.__dr3;
    411  1.1  christos 	case 4:
    412  1.1  christos 	  return dr_regs.uds.ds64.__dr4;
    413  1.1  christos 	case 5:
    414  1.1  christos 	  return dr_regs.uds.ds64.__dr5;
    415  1.1  christos 	case 6:
    416  1.1  christos 	  return dr_regs.uds.ds64.__dr6;
    417  1.1  christos 	case 7:
    418  1.1  christos 	  return dr_regs.uds.ds64.__dr7;
    419  1.1  christos 	default:
    420  1.1  christos 	  return -1;
    421  1.1  christos 	}
    422  1.1  christos       break;
    423  1.1  christos #endif
    424  1.1  christos     default:
    425  1.1  christos       return -1;
    426  1.1  christos     }
    427  1.1  christos }
    428  1.1  christos 
    429  1.1  christos static void
    430  1.1  christos i386_darwin_dr_set_control (unsigned long control)
    431  1.1  christos {
    432  1.1  christos   i386_darwin_dr_set (DR_CONTROL, control);
    433  1.1  christos }
    434  1.1  christos 
    435  1.1  christos static void
    436  1.1  christos i386_darwin_dr_set_addr (int regnum, CORE_ADDR addr)
    437  1.1  christos {
    438  1.1  christos   gdb_assert (regnum >= 0 && regnum <= DR_LASTADDR - DR_FIRSTADDR);
    439  1.1  christos 
    440  1.1  christos   i386_darwin_dr_set (DR_FIRSTADDR + regnum, addr);
    441  1.1  christos }
    442  1.1  christos 
    443  1.1  christos static CORE_ADDR
    444  1.1  christos i386_darwin_dr_get_addr (int regnum)
    445  1.1  christos {
    446  1.1  christos   return i386_darwin_dr_get (regnum);
    447  1.1  christos }
    448  1.1  christos 
    449  1.1  christos static unsigned long
    450  1.1  christos i386_darwin_dr_get_status (void)
    451  1.1  christos {
    452  1.1  christos   return i386_darwin_dr_get (DR_STATUS);
    453  1.1  christos }
    454  1.1  christos 
    455  1.1  christos static unsigned long
    456  1.1  christos i386_darwin_dr_get_control (void)
    457  1.1  christos {
    458  1.1  christos   return i386_darwin_dr_get (DR_CONTROL);
    459  1.1  christos }
    460  1.1  christos 
    461  1.1  christos void
    462  1.1  christos darwin_check_osabi (darwin_inferior *inf, thread_t thread)
    463  1.1  christos {
    464  1.1  christos   if (gdbarch_osabi (target_gdbarch ()) == GDB_OSABI_UNKNOWN)
    465  1.1  christos     {
    466  1.1  christos       /* Attaching to a process.  Let's figure out what kind it is.  */
    467  1.1  christos       x86_thread_state_t gp_regs;
    468  1.1  christos       struct gdbarch_info info;
    469  1.1  christos       unsigned int gp_count = x86_THREAD_STATE_COUNT;
    470  1.1  christos       kern_return_t ret;
    471  1.1  christos 
    472  1.1  christos       ret = thread_get_state (thread, x86_THREAD_STATE,
    473  1.1  christos 			      (thread_state_t) &gp_regs, &gp_count);
    474  1.1  christos       if (ret != KERN_SUCCESS)
    475  1.1  christos 	{
    476  1.1  christos 	  MACH_CHECK_ERROR (ret);
    477  1.1  christos 	  return;
    478  1.1  christos 	}
    479  1.1  christos 
    480  1.1  christos       gdbarch_info_init (&info);
    481  1.1  christos       gdbarch_info_fill (&info);
    482  1.1  christos       info.byte_order = gdbarch_byte_order (target_gdbarch ());
    483  1.1  christos       info.osabi = GDB_OSABI_DARWIN;
    484  1.1  christos       if (gp_regs.tsh.flavor == x86_THREAD_STATE64)
    485  1.1  christos 	info.bfd_arch_info = bfd_lookup_arch (bfd_arch_i386,
    486  1.1  christos 					      bfd_mach_x86_64);
    487  1.1  christos       else
    488  1.1  christos 	info.bfd_arch_info = bfd_lookup_arch (bfd_arch_i386,
    489  1.1  christos 					      bfd_mach_i386_i386);
    490  1.1  christos       gdbarch_update_p (info);
    491  1.1  christos     }
    492  1.1  christos }
    493  1.1  christos 
    494  1.1  christos #define X86_EFLAGS_T 0x100UL
    495  1.1  christos 
    496  1.1  christos /* Returning from a signal trampoline is done by calling a
    497  1.1  christos    special system call (sigreturn).  This system call
    498  1.1  christos    restores the registers that were saved when the signal was
    499  1.1  christos    raised, including %eflags/%rflags.  That means that single-stepping
    500  1.1  christos    won't work.  Instead, we'll have to modify the signal context
    501  1.1  christos    that's about to be restored, and set the trace flag there.  */
    502  1.1  christos 
    503  1.1  christos static int
    504  1.1  christos i386_darwin_sstep_at_sigreturn (x86_thread_state_t *regs)
    505  1.1  christos {
    506  1.1  christos   enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
    507  1.1  christos   static const gdb_byte darwin_syscall[] = { 0xcd, 0x80 }; /* int 0x80 */
    508  1.1  christos   gdb_byte buf[sizeof (darwin_syscall)];
    509  1.1  christos 
    510  1.1  christos   /* Check if PC is at a sigreturn system call.  */
    511  1.1  christos   if (target_read_memory (regs->uts.ts32.__eip, buf, sizeof (buf)) == 0
    512  1.1  christos       && memcmp (buf, darwin_syscall, sizeof (darwin_syscall)) == 0
    513  1.1  christos       && regs->uts.ts32.__eax == 0xb8 /* SYS_sigreturn */)
    514  1.1  christos     {
    515  1.1  christos       ULONGEST uctx_addr;
    516  1.1  christos       ULONGEST mctx_addr;
    517  1.1  christos       ULONGEST flags_addr;
    518  1.1  christos       unsigned int eflags;
    519  1.1  christos 
    520  1.1  christos       uctx_addr = read_memory_unsigned_integer
    521  1.1  christos 		    (regs->uts.ts32.__esp + 4, 4, byte_order);
    522  1.1  christos       mctx_addr = read_memory_unsigned_integer
    523  1.1  christos 		    (uctx_addr + 28, 4, byte_order);
    524  1.1  christos 
    525  1.1  christos       flags_addr = mctx_addr + 12 + 9 * 4;
    526  1.1  christos       read_memory (flags_addr, (gdb_byte *) &eflags, 4);
    527  1.1  christos       eflags |= X86_EFLAGS_T;
    528  1.1  christos       write_memory (flags_addr, (gdb_byte *) &eflags, 4);
    529  1.1  christos 
    530  1.1  christos       return 1;
    531  1.1  christos     }
    532  1.1  christos   return 0;
    533  1.1  christos }
    534  1.1  christos 
    535  1.1  christos #ifdef BFD64
    536  1.1  christos static int
    537  1.1  christos amd64_darwin_sstep_at_sigreturn (x86_thread_state_t *regs)
    538  1.1  christos {
    539  1.1  christos   enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
    540  1.1  christos   static const gdb_byte darwin_syscall[] = { 0x0f, 0x05 }; /* syscall */
    541  1.1  christos   gdb_byte buf[sizeof (darwin_syscall)];
    542  1.1  christos 
    543  1.1  christos   /* Check if PC is at a sigreturn system call.  */
    544  1.1  christos   if (target_read_memory (regs->uts.ts64.__rip, buf, sizeof (buf)) == 0
    545  1.1  christos       && memcmp (buf, darwin_syscall, sizeof (darwin_syscall)) == 0
    546  1.1  christos       && (regs->uts.ts64.__rax & 0xffffffff) == 0x20000b8 /* SYS_sigreturn */)
    547  1.1  christos     {
    548  1.1  christos       ULONGEST mctx_addr;
    549  1.1  christos       ULONGEST flags_addr;
    550  1.1  christos       unsigned int rflags;
    551  1.1  christos 
    552  1.1  christos       mctx_addr = read_memory_unsigned_integer
    553  1.1  christos 		    (regs->uts.ts64.__rdi + 48, 8, byte_order);
    554  1.1  christos       flags_addr = mctx_addr + 16 + 17 * 8;
    555  1.1  christos 
    556  1.1  christos       /* AMD64 is little endian.  */
    557  1.1  christos       read_memory (flags_addr, (gdb_byte *) &rflags, 4);
    558  1.1  christos       rflags |= X86_EFLAGS_T;
    559  1.1  christos       write_memory (flags_addr, (gdb_byte *) &rflags, 4);
    560  1.1  christos 
    561  1.1  christos       return 1;
    562  1.1  christos     }
    563  1.1  christos   return 0;
    564  1.1  christos }
    565  1.1  christos #endif
    566  1.1  christos 
    567  1.1  christos void
    568  1.1  christos darwin_set_sstep (thread_t thread, int enable)
    569  1.1  christos {
    570  1.1  christos   x86_thread_state_t regs;
    571  1.1  christos   unsigned int count = x86_THREAD_STATE_COUNT;
    572  1.1  christos   kern_return_t kret;
    573  1.1  christos 
    574  1.1  christos   kret = thread_get_state (thread, x86_THREAD_STATE,
    575  1.1  christos 			   (thread_state_t) &regs, &count);
    576  1.1  christos   if (kret != KERN_SUCCESS)
    577  1.1  christos     {
    578  1.1  christos       printf_unfiltered (_("darwin_set_sstep: error %x, thread=%x\n"),
    579  1.1  christos 			 kret, thread);
    580  1.1  christos       return;
    581  1.1  christos     }
    582  1.1  christos 
    583  1.1  christos   switch (regs.tsh.flavor)
    584  1.1  christos     {
    585  1.1  christos     case x86_THREAD_STATE32:
    586  1.1  christos       {
    587  1.1  christos 	__uint32_t bit = enable ? X86_EFLAGS_T : 0;
    588  1.1  christos 
    589  1.1  christos 	if (enable && i386_darwin_sstep_at_sigreturn (&regs))
    590  1.1  christos 	  return;
    591  1.1  christos 	if ((regs.uts.ts32.__eflags & X86_EFLAGS_T) == bit)
    592  1.1  christos 	  return;
    593  1.1  christos 	regs.uts.ts32.__eflags
    594  1.1  christos 	  = (regs.uts.ts32.__eflags & ~X86_EFLAGS_T) | bit;
    595  1.1  christos 	kret = thread_set_state (thread, x86_THREAD_STATE,
    596  1.1  christos 				 (thread_state_t) &regs, count);
    597  1.1  christos 	MACH_CHECK_ERROR (kret);
    598  1.1  christos       }
    599  1.1  christos       break;
    600  1.1  christos #ifdef BFD64
    601  1.1  christos     case x86_THREAD_STATE64:
    602  1.1  christos       {
    603  1.1  christos 	__uint64_t bit = enable ? X86_EFLAGS_T : 0;
    604  1.1  christos 
    605  1.1  christos 	if (enable && amd64_darwin_sstep_at_sigreturn (&regs))
    606  1.1  christos 	  return;
    607  1.1  christos 	if ((regs.uts.ts64.__rflags & X86_EFLAGS_T) == bit)
    608  1.1  christos 	  return;
    609  1.1  christos 	regs.uts.ts64.__rflags
    610  1.1  christos 	  = (regs.uts.ts64.__rflags & ~X86_EFLAGS_T) | bit;
    611  1.1  christos 	kret = thread_set_state (thread, x86_THREAD_STATE,
    612  1.1  christos 				 (thread_state_t) &regs, count);
    613  1.1  christos 	MACH_CHECK_ERROR (kret);
    614  1.1  christos       }
    615  1.1  christos       break;
    616  1.1  christos #endif
    617  1.1  christos     default:
    618  1.1  christos       error (_("darwin_set_sstep: unknown flavour: %d"), regs.tsh.flavor);
    619  1.1  christos     }
    620  1.1  christos }
    621  1.1  christos 
    622  1.1  christos void
    623  1.1  christos darwin_complete_target (struct target_ops *target)
    624  1.1  christos {
    625  1.1  christos #ifdef BFD64
    626  1.1  christos   amd64_native_gregset64_reg_offset = amd64_darwin_thread_state_reg_offset;
    627  1.1  christos   amd64_native_gregset64_num_regs = amd64_darwin_thread_state_num_regs;
    628  1.1  christos   amd64_native_gregset32_reg_offset = i386_darwin_thread_state_reg_offset;
    629  1.1  christos   amd64_native_gregset32_num_regs = i386_darwin_thread_state_num_regs;
    630  1.1  christos #endif
    631  1.1  christos 
    632  1.1  christos   i386_use_watchpoints (target);
    633  1.1  christos 
    634  1.1  christos   i386_dr_low.set_control = i386_darwin_dr_set_control;
    635  1.1  christos   i386_dr_low.set_addr = i386_darwin_dr_set_addr;
    636  1.1  christos   i386_dr_low.get_addr = i386_darwin_dr_get_addr;
    637  1.1  christos   i386_dr_low.get_status = i386_darwin_dr_get_status;
    638  1.1  christos   i386_dr_low.get_control = i386_darwin_dr_get_control;
    639  1.1  christos 
    640  1.1  christos   /* Let's assume that the kernel is 64 bits iff the executable is.  */
    641  1.1  christos #ifdef __x86_64__
    642  1.1  christos   i386_set_debug_register_length (8);
    643  1.1  christos #else
    644  1.1  christos   i386_set_debug_register_length (4);
    645  1.1  christos #endif
    646  1.1  christos 
    647  1.1  christos   target->to_fetch_registers = i386_darwin_fetch_inferior_registers;
    648  1.1  christos   target->to_store_registers = i386_darwin_store_inferior_registers;
    649  1.1  christos }
    650