This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] [GDBServer][AArch64] Use the same break instruction as GDB


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=37d669427f8b90f3c9d17a6e04d72c731d3abdbc

commit 37d669427f8b90f3c9d17a6e04d72c731d3abdbc
Author: Pierre Langlois <pierre.langlois@arm.com>
Date:   Mon Jun 29 10:34:42 2015 +0100

    [GDBServer][AArch64] Use the same break instruction as GDB
    
    GDB uses a "brk #0" instruction to perform a software breakpoint while
    GDBServer uses an illegal instruction.  Both instructions should match.
    
    When enabling support for the 'Z0' packet, we let GDBServer insert the
    breakpoint instruction instead of GDB.  And in case of permanent
    breakpoints for example, GDB will check if a breakpoint is inserted in the
    inferior with `program_breakpoint_here_p (gdbarch, address)', and
    compare the instruction read from the inferior with the breakpoint
    instruction.
    
    On AArch64, instructions are always little endian so we need to
    represent it as an array of bytes, as done in aarch64-tdep.c.
    
    gdb/gdbserver/ChangeLog:
    
    	* linux-aarch64-low.c: Remove comment about endianness.
    	(aarch64_breakpoint): Change type to gdb_byte[].  Set to "brk #0".
    	(aarch64_breakpoint_at): Change type of insn to gdb_byte[].  Use
    	memcmp.

Diff:
---
 gdb/gdbserver/ChangeLog           |  7 +++++++
 gdb/gdbserver/linux-aarch64-low.c | 14 ++++++++------
 2 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index 2528f0f..8dad98e 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,3 +1,10 @@
+2015-06-29  Pierre Langlois  <pierre.langlois@arm.com>
+
+	* linux-aarch64-low.c: Remove comment about endianness.
+	(aarch64_breakpoint): Change type to gdb_byte[].  Set to "brk #0".
+	(aarch64_breakpoint_at): Change type of insn to gdb_byte[].  Use
+	memcmp.
+
 2015-06-24  Gary Benson  <gbenson@redhat.com>
 
 	* linux-i386-ipa.c (stdint.h): Do not include.
diff --git a/gdb/gdbserver/linux-aarch64-low.c b/gdb/gdbserver/linux-aarch64-low.c
index 043458d..b0a2775 100644
--- a/gdb/gdbserver/linux-aarch64-low.c
+++ b/gdb/gdbserver/linux-aarch64-low.c
@@ -295,19 +295,21 @@ aarch64_set_pc (struct regcache *regcache, CORE_ADDR pc)
   supply_register_by_name (regcache, "pc", &newpc);
 }
 
-/* Correct in either endianness.  */
-
 #define aarch64_breakpoint_len 4
 
-static const unsigned long aarch64_breakpoint = 0x00800011;
+/* AArch64 BRK software debug mode instruction.
+   This instruction needs to match gdb/aarch64-tdep.c
+   (aarch64_default_breakpoint).  */
+static const gdb_byte aarch64_breakpoint[] = {0x00, 0x00, 0x20, 0xd4};
 
 static int
 aarch64_breakpoint_at (CORE_ADDR where)
 {
-  unsigned long insn;
+  gdb_byte insn[aarch64_breakpoint_len];
 
-  (*the_target->read_memory) (where, (unsigned char *) &insn, 4);
-  if (insn == aarch64_breakpoint)
+  (*the_target->read_memory) (where, (unsigned char *) &insn,
+			      aarch64_breakpoint_len);
+  if (memcmp (insn, aarch64_breakpoint, aarch64_breakpoint_len) == 0)
     return 1;
 
   return 0;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]