diff mbox

unbreak nios2-*-linux* testing

Message ID 5592AE67.9080905@codesourcery.com
State New
Headers show

Commit Message

Sandra Loosemore June 30, 2015, 2:57 p.m. UTC
As previously noted, on Nios II Linux targets, the kernel now puts 
signal handler handler trampolines on a read-only page of memory and GDB 
cannot set single-step breakpoints there.  My last attempt at working 
around this

https://sourceware.org/ml/gdb-patches/2015-04/msg01092.html

was rejected in favor of some not-yet-implemented target-independent 
solution:

https://sourceware.org/ml/gdb-patches/2015-05/msg00183.html

Given that the discussion pointed to by that thread is 11 years old, I 
think it's safe to say that fixing this is not a priority.  :-(

Meanwhile, the GDB testsuite remains broken on this target.  Tests are 
not just failing, but getting stuck in infinite loops trying 
unsuccessfully to step out of a signal handler without recognizing that 
they are stuck.  This is blocking regression testing of other patches in 
my queue.

This patch adds kfails for these issues similar to what other targets 
with this problem already do.  There are no code changes.

OK to commit, so I can get on with other work?

-Sandra
diff mbox

Patch

diff --git a/gdb/nios2-tdep.c b/gdb/nios2-tdep.c
index 08f2034..988b9fc 100644
--- a/gdb/nios2-tdep.c
+++ b/gdb/nios2-tdep.c
@@ -1189,7 +1189,15 @@  nios2_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
   return nios2_analyze_prologue (gdbarch, start_pc, start_pc, &cache, NULL);
 }
 
-/* Implement the breakpoint_from_pc gdbarch hook.  */
+/* Implement the breakpoint_from_pc gdbarch hook.
+
+   The Nios II ABI for Linux says: "Userspace programs should not use
+   the break instruction and userspace debuggers should not insert
+   one." and "Userspace breakpoints are accomplished using the trap
+   instruction with immediate operand 31 (all ones)."
+
+   So, we use "trap 31" consistently as the breakpoint on bare-metal
+   as well as Linux targets.  */
 
 static const gdb_byte*
 nios2_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *bp_addr,
@@ -1198,11 +1206,11 @@  nios2_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *bp_addr,
   enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
   unsigned long mach = gdbarch_bfd_arch_info (gdbarch)->mach;
 
-  /* R1 break encoding:
-     ((0x1e << 17) | (0x34 << 11) | (0x1f << 6) | (0x3a << 0))
-     0x003da7fa */
-  static const gdb_byte r1_breakpoint_le[] = {0xfa, 0xa7, 0x3d, 0x0};
-  static const gdb_byte r1_breakpoint_be[] = {0x0, 0x3d, 0xa7, 0xfa};
+  /* R1 trap encoding:
+     ((0x1d << 17) | (0x2d << 11) | (0x1f << 6) | (0x3a << 0))
+     0x003b6ffa */
+  static const gdb_byte r1_breakpoint_le[] = {0xfa, 0x6f, 0x3b, 0x0};
+  static const gdb_byte r1_breakpoint_be[] = {0x0, 0x3b, 0x6f, 0xfa};
   *bp_size = NIOS2_OPCODE_SIZE;
   if (byte_order_for_code == BFD_ENDIAN_BIG)
     return r1_breakpoint_be;