diff --git a/src/core/sal/arm/Architecture.cc b/src/core/sal/arm/Architecture.cc index ac7df412..bb84d130 100644 --- a/src/core/sal/arm/Architecture.cc +++ b/src/core/sal/arm/Architecture.cc @@ -18,9 +18,16 @@ void ArmArchitecture::fillRegisterList() // Build and set the register name: std::stringstream sstr; sstr << "R" << i+1; - reg->setName(str.str()); + // FIXME This doesn't work because no matching setName is found. + // Not sure why this happens. + //reg->setName(sstr.str()); addRegister(reg); } + + // Instruction Pointer + Register *reg = new Register(RI_IP, RT_IP, 32); + reg->setName("IP"); + addRegister(reg); } ArmArchitecture::~ArmArchitecture() diff --git a/src/core/sal/gem5/Gem5ArmCPU.cc b/src/core/sal/gem5/Gem5ArmCPU.cc index 1b2ccabc..c457539b 100644 --- a/src/core/sal/gem5/Gem5ArmCPU.cc +++ b/src/core/sal/gem5/Gem5ArmCPU.cc @@ -6,6 +6,10 @@ regdata_t Gem5ArmCPU::getRegisterContent(Register* reg) { switch (reg->getType()) { case RT_GP: + if (reg->getIndex() == 15) { + return m_System->getThreadContext(m_Id)->pcState().pc(); + } + return m_System->getThreadContext(m_Id)->readIntReg(reg->getIndex()); case RT_FP: @@ -15,7 +19,7 @@ regdata_t Gem5ArmCPU::getRegisterContent(Register* reg) return m_System->getThreadContext(m_Id)->readMiscReg(reg->getIndex()); case RT_IP: - return getRegisterContent(getRegister(RI_IP)); + return m_System->getThreadContext(m_Id)->pcState().pc(); } // This shouldn't be reached if a valid register is passed