Linux x86 low-level debug register comment synchronization
[deliverable/binutils-gdb.git] / gdb / gdbserver / linux-m68k-low.c
index aa5a5dd5a967b0b2456001bd7a1e661a8d956eae..4501904e391a8607c21e91c0059935d8b491eb1e 100644 (file)
@@ -1,12 +1,11 @@
 /* GNU/Linux/m68k specific low level interface, for the remote server for GDB.
-   Copyright (C) 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-   Free Software Foundation, Inc.
+   Copyright (C) 1995-2015 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "server.h"
 #include "linux-low.h"
 
+/* Defined in auto-generated file reg-m68k.c.  */
+void init_registers_m68k (void);
+extern const struct target_desc *tdesc_m68k;
+
 #ifdef HAVE_SYS_REG_H
 #include <sys/reg.h>
 #endif
@@ -70,75 +71,75 @@ m68k_cannot_fetch_register (int regno)
 #include <sys/ptrace.h>
 
 static void
-m68k_fill_gregset (void *buf)
+m68k_fill_gregset (struct regcache *regcache, void *buf)
 {
   int i;
 
   for (i = 0; i < m68k_num_gregs; i++)
-    collect_register (i, (char *) buf + m68k_regmap[i]);
+    collect_register (regcache, i, (char *) buf + m68k_regmap[i]);
 }
 
 static void
-m68k_store_gregset (const void *buf)
+m68k_store_gregset (struct regcache *regcache, const void *buf)
 {
   int i;
 
   for (i = 0; i < m68k_num_gregs; i++)
-    supply_register (i, (const char *) buf + m68k_regmap[i]);
+    supply_register (regcache, i, (const char *) buf + m68k_regmap[i]);
 }
 
 static void
-m68k_fill_fpregset (void *buf)
+m68k_fill_fpregset (struct regcache *regcache, void *buf)
 {
   int i;
 
   for (i = m68k_num_gregs; i < m68k_num_regs; i++)
-    collect_register (i, ((char *) buf
-                         + (m68k_regmap[i] - m68k_regmap[m68k_num_gregs])));
+    collect_register (regcache, i, ((char *) buf
+                        + (m68k_regmap[i] - m68k_regmap[m68k_num_gregs])));
 }
 
 static void
-m68k_store_fpregset (const void *buf)
+m68k_store_fpregset (struct regcache *regcache, const void *buf)
 {
   int i;
 
   for (i = m68k_num_gregs; i < m68k_num_regs; i++)
-    supply_register (i, ((const char *) buf
+    supply_register (regcache, i, ((const char *) buf
                         + (m68k_regmap[i] - m68k_regmap[m68k_num_gregs])));
 }
 
 #endif /* HAVE_PTRACE_GETREGS */
 
-struct regset_info target_regsets[] = {
+static struct regset_info m68k_regsets[] = {
 #ifdef HAVE_PTRACE_GETREGS
-  { PTRACE_GETREGS, PTRACE_SETREGS, sizeof (elf_gregset_t),
+  { PTRACE_GETREGS, PTRACE_SETREGS, 0, sizeof (elf_gregset_t),
     GENERAL_REGS,
     m68k_fill_gregset, m68k_store_gregset },
-  { PTRACE_GETFPREGS, PTRACE_SETFPREGS, sizeof (elf_fpregset_t),
+  { PTRACE_GETFPREGS, PTRACE_SETFPREGS, 0, sizeof (elf_fpregset_t),
     FP_REGS,
     m68k_fill_fpregset, m68k_store_fpregset },
 #endif /* HAVE_PTRACE_GETREGS */
-  { 0, 0, -1, -1, NULL, NULL }
+  { 0, 0, 0, -1, -1, NULL, NULL }
 };
 
 static const unsigned char m68k_breakpoint[] = { 0x4E, 0x4F };
 #define m68k_breakpoint_len 2
 
 static CORE_ADDR
-m68k_get_pc ()
+m68k_get_pc (struct regcache *regcache)
 {
   unsigned long pc;
 
-  collect_register_by_name ("pc", &pc);
+  collect_register_by_name (regcache, "pc", &pc);
   return pc;
 }
 
 static void
-m68k_set_pc (CORE_ADDR value)
+m68k_set_pc (struct regcache *regcache, CORE_ADDR value)
 {
   unsigned long newpc = value;
 
-  supply_register_by_name ("pc", &newpc);
+  supply_register_by_name (regcache, "pc", &newpc);
 }
 
 static int
@@ -153,11 +154,65 @@ m68k_breakpoint_at (CORE_ADDR pc)
   return 0;
 }
 
+#include <asm/ptrace.h>
+
+#ifdef PTRACE_GET_THREAD_AREA
+/* Fetch the thread-local storage pointer for libthread_db.  */
+
+ps_err_e
+ps_get_thread_area (const struct ps_prochandle *ph,
+                   lwpid_t lwpid, int idx, void **base)
+{
+  if (ptrace (PTRACE_GET_THREAD_AREA, lwpid, NULL, base) != 0)
+    return PS_ERR;
+
+  /* IDX is the bias from the thread pointer to the beginning of the
+     thread descriptor.  It has to be subtracted due to implementation
+     quirks in libthread_db.  */
+  *base = (void *) ((char *)*base - idx);
+
+  return PS_OK;
+}
+#endif /* PTRACE_GET_THREAD_AREA */
+
+static struct regsets_info m68k_regsets_info =
+  {
+    m68k_regsets, /* regsets */
+    0, /* num_regsets */
+    NULL, /* disabled_regsets */
+  };
+
+static struct usrregs_info m68k_usrregs_info =
+  {
+    m68k_num_regs,
+    m68k_regmap,
+  };
+
+static struct regs_info regs_info =
+  {
+    NULL, /* regset_bitmap */
+    &m68k_usrregs_info,
+    &m68k_regsets_info
+  };
+
+static const struct regs_info *
+m68k_regs_info (void)
+{
+  return &regs_info;
+}
+
+static void
+m68k_arch_setup (void)
+{
+  current_process ()->tdesc = tdesc_m68k;
+}
+
 struct linux_target_ops the_low_target = {
-  m68k_num_regs,
-  m68k_regmap,
+  m68k_arch_setup,
+  m68k_regs_info,
   m68k_cannot_fetch_register,
   m68k_cannot_store_register,
+  NULL, /* fetch_register */
   m68k_get_pc,
   m68k_set_pc,
   m68k_breakpoint,
@@ -166,3 +221,12 @@ struct linux_target_ops the_low_target = {
   2,
   m68k_breakpoint_at,
 };
+
+void
+initialize_low_arch (void)
+{
+  /* Initialize the Linux target descriptions.  */
+  init_registers_m68k ();
+
+  initialize_regsets_info (&m68k_regsets_info);
+}
This page took 0.027142 seconds and 4 git commands to generate.