keiths / rpms / gdb

Forked from rpms/gdb 5 months ago
Clone
cb6c86a
[ Backported.  ]
cb6c86a
cb6c86a
commit 5362e5e1dc4cfac24fbd58773aaa7a82c615b662
cb6c86a
Author: H.J. Lu <hjl.tools@gmail.com>
cb6c86a
Date:   Thu Apr 1 20:02:07 2010 +0000
cb6c86a
cb6c86a
    Support "ah", "bh", "ch", "dh" on amd64.
cb6c86a
    
cb6c86a
    gdb/
cb6c86a
    
cb6c86a
    2010-04-01  H.J. Lu  <hongjiu.lu@intel.com>
cb6c86a
    
cb6c86a
    	* amd64-tdep.c (amd64_byte_names): Add "ah", "bh", "ch", "dh".
cb6c86a
    	(AMD64_NUM_LOWER_BYTE_REGS): New.
cb6c86a
    	(amd64_pseudo_register_read): Handle "ah", "bh", "ch", "dh".
cb6c86a
    	(amd64_pseudo_register_write): Likewise.
cb6c86a
    	(amd64_init_abi): Set num_byte_regs to 20.
cb6c86a
    
cb6c86a
    gdb/testsuite/
cb6c86a
    
cb6c86a
    2010-04-01  H.J. Lu  <hongjiu.lu@intel.com>
cb6c86a
    
cb6c86a
    	* gdb.arch/amd64-byte.exp: Check "ah", "bh", "ch", "dh".
cb6c86a
cb6c86a
--- gdb-7.1-p7/gdb/amd64-tdep.c	2010-04-03 21:08:21.000000000 +0200
cb6c86a
+++ gdb-7.1/gdb/amd64-tdep.c	2010-04-03 21:11:41.000000000 +0200
cb6c86a
@@ -215,9 +215,13 @@ amd64_arch_reg_to_regnum (int reg)
cb6c86a
 static const char *amd64_byte_names[] =
cb6c86a
 {
cb6c86a
   "al", "bl", "cl", "dl", "sil", "dil", "bpl", "spl",
cb6c86a
-  "r8l", "r9l", "r10l", "r11l", "r12l", "r13l", "r14l", "r15l"
cb6c86a
+  "r8l", "r9l", "r10l", "r11l", "r12l", "r13l", "r14l", "r15l",
cb6c86a
+  "ah", "bh", "ch", "dh"
cb6c86a
 };
cb6c86a
 
cb6c86a
+/* Number of lower byte registers.  */
cb6c86a
+#define AMD64_NUM_LOWER_BYTE_REGS 16
cb6c86a
+
cb6c86a
 /* Register names for word pseudo-registers.  */
cb6c86a
 
cb6c86a
 static const char *amd64_word_names[] =
cb6c86a
@@ -263,8 +267,18 @@ amd64_pseudo_register_read (struct gdbar
cb6c86a
       int gpnum = regnum - tdep->al_regnum;
cb6c86a
 
cb6c86a
       /* Extract (always little endian).  */
cb6c86a
-      regcache_raw_read (regcache, gpnum, raw_buf);
cb6c86a
-      memcpy (buf, raw_buf, 1);
cb6c86a
+      if (gpnum >= AMD64_NUM_LOWER_BYTE_REGS)
cb6c86a
+	{
cb6c86a
+	  /* Special handling for AH, BH, CH, DH.  */
cb6c86a
+	  regcache_raw_read (regcache,
cb6c86a
+			     gpnum - AMD64_NUM_LOWER_BYTE_REGS, raw_buf);
cb6c86a
+	  memcpy (buf, raw_buf + 1, 1);
cb6c86a
+	}
cb6c86a
+      else
cb6c86a
+	{
cb6c86a
+	  regcache_raw_read (regcache, gpnum, raw_buf);
cb6c86a
+	  memcpy (buf, raw_buf, 1);
cb6c86a
+	}
cb6c86a
     }
cb6c86a
   else if (i386_dword_regnum_p (gdbarch, regnum))
cb6c86a
     {
cb6c86a
@@ -289,12 +303,26 @@ amd64_pseudo_register_write (struct gdba
cb6c86a
     {
cb6c86a
       int gpnum = regnum - tdep->al_regnum;
cb6c86a
 
cb6c86a
-      /* Read ...  */
cb6c86a
-      regcache_raw_read (regcache, gpnum, raw_buf);
cb6c86a
-      /* ... Modify ... (always little endian).  */
cb6c86a
-      memcpy (raw_buf, buf, 1);
cb6c86a
-      /* ... Write.  */
cb6c86a
-      regcache_raw_write (regcache, gpnum, raw_buf);
cb6c86a
+      if (gpnum >= AMD64_NUM_LOWER_BYTE_REGS)
cb6c86a
+	{
cb6c86a
+	  /* Read ... AH, BH, CH, DH.  */
cb6c86a
+	  regcache_raw_read (regcache,
cb6c86a
+			     gpnum - AMD64_NUM_LOWER_BYTE_REGS, raw_buf);
cb6c86a
+	  /* ... Modify ... (always little endian).  */
cb6c86a
+	  memcpy (raw_buf + 1, buf, 1);
cb6c86a
+	  /* ... Write.  */
cb6c86a
+	  regcache_raw_write (regcache,
cb6c86a
+			      gpnum - AMD64_NUM_LOWER_BYTE_REGS, raw_buf);
cb6c86a
+	}
cb6c86a
+      else
cb6c86a
+	{
cb6c86a
+	  /* Read ...  */
cb6c86a
+	  regcache_raw_read (regcache, gpnum, raw_buf);
cb6c86a
+	  /* ... Modify ... (always little endian).  */
cb6c86a
+	  memcpy (raw_buf, buf, 1);
cb6c86a
+	  /* ... Write.  */
cb6c86a
+	  regcache_raw_write (regcache, gpnum, raw_buf);
cb6c86a
+	}
cb6c86a
     }
cb6c86a
   else if (i386_dword_regnum_p (gdbarch, regnum))
cb6c86a
     {
cb6c86a
@@ -2233,7 +2261,7 @@ amd64_init_abi (struct gdbarch_info info
cb6c86a
   tdep->num_core_regs = AMD64_NUM_GREGS + I387_NUM_REGS;
cb6c86a
   tdep->register_names = amd64_register_names;
cb6c86a
 
cb6c86a
-  tdep->num_byte_regs = 16;
cb6c86a
+  tdep->num_byte_regs = 20;
cb6c86a
   tdep->num_word_regs = 16;
cb6c86a
   tdep->num_dword_regs = 16;
cb6c86a
   /* Avoid wiring in the MMX registers for now.  */
cb6c86a
--- gdb-7.1-p7/gdb/testsuite/gdb.arch/amd64-byte.exp	2010-04-03 21:06:52.000000000 +0200
cb6c86a
+++ gdb-7.1/gdb/testsuite/gdb.arch/amd64-byte.exp	2010-04-03 21:11:41.000000000 +0200
cb6c86a
@@ -52,7 +52,6 @@ if ![runto_main] then {
cb6c86a
     gdb_suppress_tests
cb6c86a
 }
cb6c86a
 
cb6c86a
-set nr_regs 14
cb6c86a
 set byte_regs(1) al
cb6c86a
 set byte_regs(2) bl
cb6c86a
 set byte_regs(3) cl
cb6c86a
@@ -67,6 +66,10 @@ set byte_regs(11) r12l
cb6c86a
 set byte_regs(12) r13l
cb6c86a
 set byte_regs(13) r14l
cb6c86a
 set byte_regs(14) r15l
cb6c86a
+set byte_regs(15) ah
cb6c86a
+set byte_regs(16) bh
cb6c86a
+set byte_regs(17) ch
cb6c86a
+set byte_regs(18) dh
cb6c86a
 
cb6c86a
 gdb_test "break [gdb_get_line_number "first breakpoint here"]" \
cb6c86a
          "Breakpoint .* at .*${srcfile}.*" \
cb6c86a
@@ -79,12 +82,19 @@ for { set r 1 } { $r <= 6  } { incr r } 
cb6c86a
         "check contents of %$byte_regs($r)"
cb6c86a
 }
cb6c86a
 
cb6c86a
+for { set r 1 } { $r <= 4  } { incr r } {
cb6c86a
+    set h [expr $r + 14]
cb6c86a
+    gdb_test "print/x \$$byte_regs($h)" \
cb6c86a
+        ".. = 0x[format %x $r]2" \
cb6c86a
+        "check contents of %$byte_regs($h)"
cb6c86a
+}
cb6c86a
+
cb6c86a
 gdb_test "break [gdb_get_line_number "second breakpoint here"]" \
cb6c86a
          "Breakpoint .* at .*${srcfile}.*" \
cb6c86a
          "set second breakpoint in main"
cb6c86a
 gdb_continue_to_breakpoint "continue to second breakpoint in main"
cb6c86a
 
cb6c86a
-for { set r 7 } { $r <= $nr_regs  } { incr r } {
cb6c86a
+for { set r 7 } { $r <= 14  } { incr r } {
cb6c86a
     gdb_test "print/x \$$byte_regs($r)" \
cb6c86a
         ".. = 0x[format %x $r]1" \
cb6c86a
         "check contents of %$byte_regs($r)"
cb6c86a
@@ -94,6 +104,11 @@ for { set r 1 } { $r <= 6  } { incr r } 
cb6c86a
   gdb_test "set var \$$byte_regs($r) = $r" "" "set %$byte_regs($r)"
cb6c86a
 }
cb6c86a
 
cb6c86a
+for { set r 1 } { $r <= 4  } { incr r } {
cb6c86a
+  set h [expr $r + 14]
cb6c86a
+  gdb_test "set var \$$byte_regs($h) = $h" "" "set %$byte_regs($h)"
cb6c86a
+}
cb6c86a
+
cb6c86a
 gdb_test "break [gdb_get_line_number "third breakpoint here"]" \
cb6c86a
          "Breakpoint .* at .*${srcfile}.*" \
cb6c86a
          "set third breakpoint in main"
cb6c86a
@@ -105,7 +120,14 @@ for { set r 1 } { $r <= 6  } { incr r } 
cb6c86a
         "check contents of %$byte_regs($r)"
cb6c86a
 }
cb6c86a
 
cb6c86a
-for { set r 7 } { $r <= $nr_regs  } { incr r } {
cb6c86a
+for { set r 1 } { $r <= 4  } { incr r } {
cb6c86a
+    set h [expr $r + 14]
cb6c86a
+    gdb_test "print \$$byte_regs($h)" \
cb6c86a
+        ".. = $h" \
cb6c86a
+        "check contents of %$byte_regs($h)"
cb6c86a
+}
cb6c86a
+
cb6c86a
+for { set r 7 } { $r <= 14  } { incr r } {
cb6c86a
   gdb_test "set var \$$byte_regs($r) = $r" "" "set %$byte_regs($r)"
cb6c86a
 }
cb6c86a
 
cb6c86a
@@ -114,7 +136,7 @@ gdb_test "break [gdb_get_line_number "fo
cb6c86a
          "set forth breakpoint in main"
cb6c86a
 gdb_continue_to_breakpoint "continue to forth breakpoint in main"
cb6c86a
 
cb6c86a
-for { set r 7 } { $r <= $nr_regs  } { incr r } {
cb6c86a
+for { set r 7 } { $r <= 14  } { incr r } {
cb6c86a
     gdb_test "print \$$byte_regs($r)" \
cb6c86a
         ".. = $r" \
cb6c86a
         "check contents of %$byte_regs($r)"