arm: Correctly access the stack pointer in GDB
authorAndreas Sandberg <Andreas.Sandberg@ARM.com>
Mon, 2 Mar 2015 09:00:27 +0000 (04:00 -0500)
committerAndreas Sandberg <Andreas.Sandberg@ARM.com>
Mon, 2 Mar 2015 09:00:27 +0000 (04:00 -0500)
We curently use INTREG_X31 instead of INTREG_SPX when accessing the
stack pointer in GDB. gem5 normally uses INTREG_SPX to access the
stack pointer, which gets mapped to the stack pointer corresponding
(INTREG_SPn) to the current exception level. This changeset updates
the GDB interface to use SPX instead of X31 (which is always zero)
when transfering CPU state to gdb.

src/arch/arm/remote_gdb.cc
src/arch/arm/remote_gdb.hh

index d52a9db17d4cddf6b790b4318c4fe4538f8c1a58..b85b453694a9839cd7186e5a4b4a89732ef3e2b1 100644 (file)
@@ -204,9 +204,10 @@ RemoteGDB::getregs()
     memset(gdbregs.regs, 0, gdbregs.bytes());
 
     if (inAArch64(context)) {  // AArch64
-        // x0-x31
-        for (int i = 0; i < 32; ++i)
+        // x0-x30
+        for (int i = 0; i < 31; ++i)
             gdbregs.regs64[GDB64_X0 + i] = context->readIntReg(INTREG_X0 + i);
+        gdbregs.regs64[GDB64_SPX] = context->readIntReg(INTREG_SPX);
         // pc
         gdbregs.regs64[GDB64_PC] = context->pcState().pc();
         // cpsr
@@ -262,13 +263,17 @@ RemoteGDB::setregs()
 
     DPRINTF(GDBAcc, "setregs in remotegdb \n");
     if (inAArch64(context)) {  // AArch64
-        // x0-x31
-        for (int i = 0; i < 32; ++i)
+        // x0-x30
+        for (int i = 0; i < 31; ++i)
             context->setIntReg(INTREG_X0 + i, gdbregs.regs64[GDB64_X0 + i]);
         // pc
         context->pcState(gdbregs.regs64[GDB64_PC]);
         // cpsr
         context->setMiscRegNoEffect(MISCREG_CPSR, gdbregs.regs64[GDB64_CPSR]);
+        // Update the stack pointer. This should be done after
+        // updating CPSR/PSTATE since that might affect how SPX gets
+        // mapped.
+        context->setIntReg(INTREG_SPX, gdbregs.regs64[GDB64_SPX]);
         // v0-v31
         for (int i = 0; i < 128; i += 4) {
             int gdboff = GDB64_V0_32 + i;
index 80a0bf1b12f629f343a407503628e01ea4233db4..56a50a133c153c3b320c18ede46917d3a03dad90 100644 (file)
@@ -68,6 +68,7 @@ enum {
 // AArch64 registers
 enum {
     GDB64_X0 = 0,
+    GDB64_SPX = 31,
     GDB64_PC = 32,
     GDB64_CPSR = 33,
     GDB64_V0 = 34,