gdbserver: fix killed-outside.exp
[deliverable/binutils-gdb.git] / gdb / gdbserver / linux-tile-low.c
index c73bdf229b7e545a6369cc3c84922cab843504ec..47ca245215ec42dc838a45181064cd34c1e3d9ca 100644 (file)
@@ -1,6 +1,6 @@
 /* GNU/Linux/TILE-Gx specific low level interface, GDBserver.
 
-   Copyright (C) 2012-2013 Free Software Foundation, Inc.
+   Copyright (C) 2012-2015 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 #include "server.h"
 #include "linux-low.h"
 
-#include <sys/ptrace.h>
+#include <arch/abi.h>
+#include "nat/gdb_ptrace.h"
 
-/* Defined in auto-generated file reg-tile.c.  */
-void init_registers_tile (void);
+/* Defined in auto-generated file reg-tilegx.c.  */
+void init_registers_tilegx (void);
+extern const struct target_desc *tdesc_tilegx;
+
+/* Defined in auto-generated file reg-tilegx32.c.  */
+void init_registers_tilegx32 (void);
+extern const struct target_desc *tdesc_tilegx32;
 
 #define tile_num_regs 65
 
@@ -82,6 +88,15 @@ tile_set_pc (struct regcache *regcache, CORE_ADDR pc)
 static uint64_t tile_breakpoint = 0x400b3cae70166000ULL;
 #define tile_breakpoint_len 8
 
+/* Implementation of linux_target_ops method "sw_breakpoint_from_kind".  */
+
+static const gdb_byte *
+tile_sw_breakpoint_from_kind (int kind, int *size)
+{
+  *size = tile_breakpoint_len;
+  return (const gdb_byte *) &tile_breakpoint;
+}
+
 static int
 tile_breakpoint_at (CORE_ADDR where)
 {
@@ -103,7 +118,7 @@ tile_fill_gregset (struct regcache *regcache, void *buf)
 
   for (i = 0; i < tile_num_regs; i++)
     if (tile_regmap[i] != -1)
-      collect_register (regcache, i, ((unsigned int *) buf) + tile_regmap[i]);
+      collect_register (regcache, i, ((uint_reg_t *) buf) + tile_regmap[i]);
 }
 
 static void
@@ -113,30 +128,81 @@ tile_store_gregset (struct regcache *regcache, const void *buf)
 
   for (i = 0; i < tile_num_regs; i++)
     if (tile_regmap[i] != -1)
-      supply_register (regcache, i, ((unsigned long *) buf) + tile_regmap[i]);
+      supply_register (regcache, i, ((uint_reg_t *) buf) + tile_regmap[i]);
 }
 
-struct regset_info target_regsets[] =
+static struct regset_info tile_regsets[] =
 {
-  { PTRACE_GETREGS, PTRACE_SETREGS, 0, tile_num_regs * 4,
+  { PTRACE_GETREGS, PTRACE_SETREGS, 0, tile_num_regs * 8,
     GENERAL_REGS, tile_fill_gregset, tile_store_gregset },
-  { 0, 0, 0, -1, -1, NULL, NULL }
+  NULL_REGSET
 };
 
+static struct regsets_info tile_regsets_info =
+  {
+    tile_regsets, /* regsets */
+    0, /* num_regsets */
+    NULL, /* disabled_regsets */
+  };
+
+static struct usrregs_info tile_usrregs_info =
+  {
+    tile_num_regs,
+    tile_regmap,
+  };
+
+static struct regs_info regs_info =
+  {
+    NULL, /* regset_bitmap */
+    &tile_usrregs_info,
+    &tile_regsets_info,
+  };
+
+static const struct regs_info *
+tile_regs_info (void)
+{
+  return &regs_info;
+}
+
+static void
+tile_arch_setup (void)
+{
+  int pid = pid_of (current_thread);
+  unsigned int machine;
+  int is_elf64 = linux_pid_exe_is_elf_64_file (pid, &machine);
+
+  if (sizeof (void *) == 4)
+    if (is_elf64 > 0)
+      error (_("Can't debug 64-bit process with 32-bit GDBserver"));
+
+  if (!is_elf64)
+    current_process ()->tdesc = tdesc_tilegx32;
+  else
+    current_process ()->tdesc = tdesc_tilegx;
+}
+
+
 struct linux_target_ops the_low_target =
 {
-  init_registers_tile,
-  tile_num_regs,
-  tile_regmap,
-  NULL,
+  tile_arch_setup,
+  tile_regs_info,
   tile_cannot_fetch_register,
   tile_cannot_store_register,
   NULL,
   tile_get_pc,
   tile_set_pc,
-  (const unsigned char *) &tile_breakpoint,
-  tile_breakpoint_len,
+  NULL, /* breakpoint_kind_from_pc */
+  tile_sw_breakpoint_from_kind,
   NULL,
   0,
   tile_breakpoint_at,
 };
+
+void
+initialize_low_arch (void)
+{
+  init_registers_tilegx32();
+  init_registers_tilegx();
+
+  initialize_regsets_info (&tile_regsets_info);
+}
This page took 0.025253 seconds and 4 git commands to generate.