Nios II R2 support for GDB.
[deliverable/binutils-gdb.git] / gdb / gdbserver / linux-nios2-low.c
index 8a7ac28b2b3a31b00fca61e4648f74e68a62d561..71542b495a61910b4857e96e0f9506eec3382918 100644 (file)
@@ -117,9 +117,17 @@ nios2_set_pc (struct regcache *regcache, CORE_ADDR pc)
   supply_register_by_name (regcache, "pc", newpc.buf);
 }
 
-/* Breakpoint support.  */
+/* Breakpoint support.  Also see comments on nios2_breakpoint_from_pc
+   in nios2-tdep.c.  */
+
+#if defined(__nios2_arch__) && __nios2_arch__ == 2
+#define NIOS2_BREAKPOINT 0xb7fd0020
+#define CDX_BREAKPOINT 0xd7c9
+#else
+#define NIOS2_BREAKPOINT 0x003b6ffa
+#endif
 
-static const unsigned int nios2_breakpoint = 0x003b6ffa;
+static const unsigned int nios2_breakpoint = NIOS2_BREAKPOINT;
 #define nios2_breakpoint_len 4
 
 /* Implement the breakpoint_reinsert_addr linux_target_ops method.  */
@@ -141,6 +149,13 @@ nios2_breakpoint_at (CORE_ADDR where)
 {
   unsigned int insn;
 
+  /* For R2, first check for the 2-byte CDX trap.n breakpoint encoding.  */
+#if defined(__nios2_arch__) && __nios2_arch__ == 2
+  (*the_target->read_memory) (where, (unsigned char *) &insn, 2);
+  if (insn == CDX_BREAKPOINT)
+    return 1;
+#endif
+
   (*the_target->read_memory) (where, (unsigned char *) &insn, 4);
   if (insn == nios2_breakpoint)
     return 1;
@@ -248,6 +263,12 @@ struct linux_target_ops the_low_target =
   NULL,
   nios2_get_pc,
   nios2_set_pc,
+
+  /* We only register the 4-byte breakpoint, even on R2 targets which also
+     support 2-byte breakpoints.  Since there is no supports_z_point_type
+     function provided, gdbserver never inserts software breakpoints itself
+     and instead relies on GDB to insert the breakpoint of the correct length
+     via a memory write.  */
   (const unsigned char *) &nios2_breakpoint,
   nios2_breakpoint_len,
   nios2_reinsert_addr,
This page took 0.024266 seconds and 4 git commands to generate.