Files
fail/simulators/gem5/src/dev/fail_fake_device.cc
Richard Hellwig b60e1c0c66 gem5: campaigns are now running without interruption
This change introduces a fake iobus device into gem5 to prevent
it from crashing on bogus I/O memory accesses.

Change-Id: Ie69e3191bdd917cc681269852937a5a3820a93fb
2014-06-05 17:14:11 +02:00

71 lines
1.5 KiB
C++

#include "base/trace.hh"
#include "debug/Fail.hh"
#include "dev/fail_fake_device.hh"
#include "mem/packet.hh"
#include "mem/packet_access.hh"
#include "sim/system.hh"
#include "config/FailConfig.hpp"
#include "sal/SALInst.hpp"
using namespace std;
FailFakeDevice::FailFakeDevice(Params *p)
: BasicPioDevice(p)
{
if (!p->ret_bad_addr)
pioSize = p->pio_size;
retData8 = p->ret_data8;
retData16 = p->ret_data16;
retData32 = p->ret_data32;
retData64 = p->ret_data64;
}
Tick
FailFakeDevice::read(PacketPtr pkt)
{
pkt->allocate();
pkt->makeAtomicResponse();
DPRINTF(Fail, "[FAIL] dev/fail_fake_device.cc read(): fake response\n");
switch (pkt->getSize()) {
case sizeof(uint64_t):
pkt->set(retData64);
break;
case sizeof(uint32_t):
pkt->set(retData32);
break;
case sizeof(uint16_t):
pkt->set(retData16);
break;
case sizeof(uint8_t):
pkt->set(retData8);
break;
default:
if (params()->fake_mem)
std::memset(pkt->getPtr<uint8_t>(), 0, pkt->getSize());
else
panic("invalid access size! Device being accessed by cache?\n");
}
return pioDelay;
}
Tick
FailFakeDevice::write(PacketPtr pkt)
{
pkt->makeAtomicResponse();
DPRINTF(Fail, "[FAIL] dev/fail_fake_device.cc write(): fake response\n");
return pioDelay;
}
FailFakeDevice *
FailFakeDeviceParams::create()
{
return new FailFakeDevice(this);
}