* remote-utils.c (remote_open): Print a status notice after
[deliverable/binutils-gdb.git] / gdb / gdbserver / linux-sh-low.c
index 9fdb75700a948555742ef1b0e033e4385819c5cf..cbe2f95c47ebe6e0b8d72f5d91ef7578f36999cd 100644 (file)
@@ -1,5 +1,5 @@
 /* GNU/Linux/SH specific low level interface, for the remote server for GDB.
-   Copyright 1995, 1996, 1998, 1999, 2000, 2001, 2002
+   Copyright 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003
    Free Software Foundation, Inc.
 
    This file is part of GDB.
@@ -20,6 +20,7 @@
    Boston, MA 02111-1307, USA.  */
 
 #include "server.h"
+#include "linux-low.h"
 
 #ifdef HAVE_SYS_REG_H
 #include <sys/reg.h>
 
 #include <asm/ptrace.h>
 
-int num_regs = 41;
+#define sh_num_regs 41
 
 /* Currently, don't check/send MQ.  */
-int regmap[] = {
+static int sh_regmap[] = {
  0,    4,      8,      12,     16,     20,     24,     28,
  32,   36,     40,     44,     48,     52,     56,     60,
 
@@ -38,21 +39,67 @@ int regmap[] = {
  REG_MACH*4, REG_MACL*4, REG_SR*4,
  REG_FPUL*4, REG_FPSCR*4,
 
- REG_FPREG0+0,   REG_FPREG0+4,   REG_FPREG0+8,   REG_FPREG0+12,
- REG_FPREG0+16,  REG_FPREG0+20,  REG_FPREG0+24,  REG_FPREG0+28,
- REG_FPREG0+32,  REG_FPREG0+36,  REG_FPREG0+40,  REG_FPREG0+44,
- REG_FPREG0+48,  REG_FPREG0+52,  REG_FPREG0+56,  REG_FPREG0+60,
+ REG_FPREG0*4+0,   REG_FPREG0*4+4,   REG_FPREG0*4+8,   REG_FPREG0*4+12,
+ REG_FPREG0*4+16,  REG_FPREG0*4+20,  REG_FPREG0*4+24,  REG_FPREG0*4+28,
+ REG_FPREG0*4+32,  REG_FPREG0*4+36,  REG_FPREG0*4+40,  REG_FPREG0*4+44,
+ REG_FPREG0*4+48,  REG_FPREG0*4+52,  REG_FPREG0*4+56,  REG_FPREG0*4+60,
 };
 
-int
-cannot_store_register (int regno)
+static int
+sh_cannot_store_register (int regno)
 {
   return 0;
 }
 
-int
-cannot_fetch_register (int regno)
+static int
+sh_cannot_fetch_register (int regno)
 {
   return 0;
 }
 
+static CORE_ADDR
+sh_get_pc ()
+{
+  unsigned long pc;
+  collect_register_by_name ("pc", &pc);
+  return pc;
+}
+
+static void
+sh_set_pc (CORE_ADDR pc)
+{
+  unsigned long newpc = pc;
+  supply_register_by_name ("pc", &newpc);
+}
+
+/* Correct in either endianness, obviously.  */
+static const unsigned short sh_breakpoint = 0xc3c3;
+#define sh_breakpoint_len 2
+
+static int
+sh_breakpoint_at (CORE_ADDR where)
+{
+  unsigned short insn;
+
+  (*the_target->read_memory) (where, (char *) &insn, 2);
+  if (insn == sh_breakpoint)
+    return 1;
+
+  /* If necessary, recognize more trap instructions here.  GDB only uses the
+     one.  */
+  return 0;
+}
+
+struct linux_target_ops the_low_target = {
+  sh_num_regs,
+  sh_regmap,
+  sh_cannot_fetch_register,
+  sh_cannot_store_register,
+  sh_get_pc,
+  sh_set_pc,
+  (const char *) &sh_breakpoint,
+  sh_breakpoint_len,
+  NULL,
+  0,
+  sh_breakpoint_at,
+};
This page took 0.024847 seconds and 4 git commands to generate.