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.
This commit is contained in:
Andreas Sandberg
2015-03-02 04:00:27 -05:00
parent 34dcd90b61
commit 804b11a3ed
2 changed files with 10 additions and 4 deletions

View 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;

View File

@@ -68,6 +68,7 @@ enum {
// AArch64 registers
enum {
GDB64_X0 = 0,
GDB64_SPX = 31,
GDB64_PC = 32,
GDB64_CPSR = 33,
GDB64_V0 = 34,