[1/3,nios2] revert to using "trap 31" for breakpoints

Message ID 55393F7F.40004@codesourcery.com
State New, archived
Headers

Commit Message

Sandra Loosemore April 23, 2015, 6:52 p.m. UTC
  This patch fixes a bug I introduced in commit 
d53c26c753a39b80a338fb85bd41f75a49374842, when I was refactoring code to 
prepare for the addition of new Nios II ISA variants.  One of the new 
variants we were testing did not have an appropriate "trap" encoding 
usable for all breakpoints, so we had to tweak GDB to use "break 31" 
instead of "trap 31".  While that works fine for bare-metal, it's 
incompatible with the published Nios II ABI documentation for Linux 
systems, which explicitly requires "trap 31".  Moreover, using "break 
31" causes a kernel hang.  Oops!  So, this patch puts it back to using 
"trap 31", the way it was before.  We've discussed this with Altera and 
they are going to fix the new ISA instead of changing the ABI.

OK to commit?

-Sandra
  

Comments

Yao Qi April 28, 2015, 11:07 a.m. UTC | #1
Sandra Loosemore <sandra@codesourcery.com> writes:

> -/* Implement the breakpoint_from_pc gdbarch hook.  */
> +/* Implement the breakpoint_from_pc gdbarch hook.
> +   Note that the Nios II ABI for Linux requires "trap 31"
> +   as the breakpoint, and we use that consistently on all targets.  */

Please quote the original statement from NIOS 2 ABI,

"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)."

OK with this change.
  

Patch

diff --git a/gdb/nios2-tdep.c b/gdb/nios2-tdep.c
index 08f2034..882c263 100644
--- a/gdb/nios2-tdep.c
+++ b/gdb/nios2-tdep.c
@@ -1189,7 +1189,9 @@  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.
+   Note that the Nios II ABI for Linux requires "trap 31"
+   as the breakpoint, and we use that consistently on all targets.  */
 
 static const gdb_byte*
 nios2_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *bp_addr,
@@ -1198,11 +1200,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;