Files
fail/src/core/sal/gem5/Gem5ArmCPU.cc
friemel b052c0494b Architecture changes (only gem5 implementation right now):
- The register manager is gone. It's functionality is now encapsulated in the
  CPU classes.
- For the client, there is the ConcreteCPU class that encapsulates the access
  to the CPU state (including registers) and architecture details. The
  correspondig objects for the CPUs inside the simulator can be accessed
  through the SimulatorController.getCPU() function.
- Listener got a new ConcreteCPU* member to filter for which CPU the events
  should fire. The default NULL is used as wildcard for all aviable CPUs. The
  events respectively got a ConcreteCPU* member to indicate which CPU really
  fired the event.
- For the server, there is CPUArchitecture to access the architecture details.

git-svn-id: https://www4.informatik.uni-erlangen.de/i4svn/danceos/trunk/devel/fail@1966 8c4709b5-6ec9-48aa-a5cd-a96041d1645a
2012-12-02 17:50:46 +00:00

60 lines
1.3 KiB
C++

#include "Gem5ArmCPU.hpp"
namespace fail {
regdata_t Gem5ArmCPU::getRegisterContent(Register* reg)
{
switch (reg->getType()) {
case RT_GP:
return m_System->getThreadContext(m_Id)->readIntReg(reg->getIndex());
case RT_FP:
return m_System->getThreadContext(m_Id)->readFloatReg(reg->getIndex());
case RT_ST:
return m_System->getThreadContext(m_Id)->readMiscReg(reg->getIndex());
case RT_IP:
return getRegisterContent(getRegister(RI_IP));
}
// This shouldn't be reached if a valid register is passed
return 0;
}
void Gem5ArmCPU::setRegisterContent(Register* reg, regdata_t value)
{
switch (reg->getType()) {
case RT_GP:
m_System->getThreadContext(m_Id)->setIntReg(reg->getIndex(), value);
break;
case RT_FP:
m_System->getThreadContext(m_Id)->setFloatReg(reg->getIndex(), value);
break;
case RT_ST:
return m_System->getThreadContext(m_Id)->setMiscReg(reg->getIndex(), value);
case RT_IP:
return setRegisterContent(getRegister(RI_IP), value);
}
}
address_t Gem5ArmCPU::getInstructionPointer()
{
return getRegisterContent(getRegister(RI_IP));
}
address_t Gem5ArmCPU::getStackPointer()
{
return getRegisterContent(getRegister(RI_SP));
}
address_t Gem5ArmCPU::getLinkRegister()
{
return getRegisterContent(getRegister(RI_LR));
}
} // end-of-namespace: fail