summaryrefslogtreecommitdiff
path: root/src/arch
diff options
context:
space:
mode:
authorAndreas Sandberg <Andreas.Sandberg@ARM.com>2015-03-02 04:00:27 -0500
committerAndreas Sandberg <Andreas.Sandberg@ARM.com>2015-03-02 04:00:27 -0500
commit804b11a3ed37dd429de2e4ecf3a8892843d57e12 (patch)
treedf3263a5f3133883f5811817f24a1fe65df838d0 /src/arch
parent34dcd90b61b6fcde7f4ff1cd717f71edca40f9b9 (diff)
downloadgem5-804b11a3ed37dd429de2e4ecf3a8892843d57e12.tar.xz
arm: Correctly access the stack pointer in GDB
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.
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/arm/remote_gdb.cc13
-rw-r--r--src/arch/arm/remote_gdb.hh1
2 files changed, 10 insertions, 4 deletions
diff --git a/src/arch/arm/remote_gdb.cc b/src/arch/arm/remote_gdb.cc
index d52a9db17..b85b45369 100644
--- a/src/arch/arm/remote_gdb.cc
+++ b/src/arch/arm/remote_gdb.cc
@@ -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;
diff --git a/src/arch/arm/remote_gdb.hh b/src/arch/arm/remote_gdb.hh
index 80a0bf1b1..56a50a133 100644
--- a/src/arch/arm/remote_gdb.hh
+++ b/src/arch/arm/remote_gdb.hh
@@ -68,6 +68,7 @@ enum {
// AArch64 registers
enum {
GDB64_X0 = 0,
+ GDB64_SPX = 31,
GDB64_PC = 32,
GDB64_CPSR = 33,
GDB64_V0 = 34,