summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dev/isa_fake.cc63
-rw-r--r--src/dev/isa_fake.hh17
2 files changed, 80 insertions, 0 deletions
diff --git a/src/dev/isa_fake.cc b/src/dev/isa_fake.cc
index 23761cd10..ccc9a1f7c 100644
--- a/src/dev/isa_fake.cc
+++ b/src/dev/isa_fake.cc
@@ -88,6 +88,38 @@ IsaFake::write(PacketPtr pkt)
return pioDelay;
}
+BadAddr::BadAddr(Params *p)
+ : BasicPioDevice(p)
+{
+}
+
+void
+BadAddr::init()
+{
+ // Only init this device if it's connected to anything.
+ if (pioPort)
+ PioDevice::init();
+}
+
+Tick
+BadAddr::read(PacketPtr pkt)
+{
+ assert(pkt->result == Packet::Unknown);
+ DPRINTF(Tsunami, "read to bad address va=%#x size=%d\n",
+ pkt->getAddr(), pkt->getSize());
+ pkt->result = Packet::BadAddress;
+ return pioDelay;
+}
+
+Tick
+BadAddr::write(PacketPtr pkt)
+{
+ DPRINTF(Tsunami, "write to bad address va=%#x size=%d \n",
+ pkt->getAddr(), pkt->getSize());
+ pkt->result = Packet::BadAddress;
+ return pioDelay;
+}
+
BEGIN_DECLARE_SIM_OBJECT_PARAMS(IsaFake)
Param<Addr> pio_addr;
@@ -121,3 +153,34 @@ CREATE_SIM_OBJECT(IsaFake)
}
REGISTER_SIM_OBJECT("IsaFake", IsaFake)
+
+BEGIN_DECLARE_SIM_OBJECT_PARAMS(BadAddr)
+
+ Param<Addr> pio_addr;
+ Param<Tick> pio_latency;
+ SimObjectParam<Platform *> platform;
+ SimObjectParam<System *> system;
+
+END_DECLARE_SIM_OBJECT_PARAMS(BadAddr)
+
+BEGIN_INIT_SIM_OBJECT_PARAMS(BadAddr)
+
+ INIT_PARAM(pio_addr, "Device Address"),
+ INIT_PARAM(pio_latency, "Programmed IO latency"),
+ INIT_PARAM(platform, "platform"),
+ INIT_PARAM(system, "system object")
+
+END_INIT_SIM_OBJECT_PARAMS(BadAddr)
+
+CREATE_SIM_OBJECT(BadAddr)
+{
+ BadAddr::Params *p = new BadAddr::Params;
+ p->name = getInstanceName();
+ p->pio_addr = pio_addr;
+ p->pio_delay = pio_latency;
+ p->platform = platform;
+ p->system = system;
+ return new BadAddr(p);
+}
+
+REGISTER_SIM_OBJECT("BadAddr", BadAddr)
diff --git a/src/dev/isa_fake.hh b/src/dev/isa_fake.hh
index 366061c25..6665f1a78 100644
--- a/src/dev/isa_fake.hh
+++ b/src/dev/isa_fake.hh
@@ -79,4 +79,21 @@ class IsaFake : public BasicPioDevice
virtual Tick write(PacketPtr pkt);
};
+/**
+ * BadAddr is a device that fills the packet's result field with "BadAddress".
+ * @todo: Consider consolidating with IsaFake and similar classes.
+ */
+class BadAddr : public BasicPioDevice
+{
+ public:
+ struct Params : public BasicPioDevice::Params
+ {
+ };
+
+ BadAddr(Params *p);
+ virtual void init();
+ virtual Tick read(PacketPtr pkt);
+ virtual Tick write(PacketPtr pkt);
+};
+
#endif // __TSUNAMI_FAKE_HH__