28,29c28
< * Authors: Miguel Serrano
< * Ali Saidi
---
> * Authors: Ali Saidi
36,39d34
< #include <deque>
< #include <string>
< #include <vector>
<
52,53c47,48
< pioSize = p->pio_size;
< }
---
> if (!params()->retBadAddr)
> pioSize = p->pio_size;
55,80c50
< Tick
< IsaFake::read(PacketPtr pkt)
< {
< assert(pkt->result == Packet::Unknown);
< assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
<
< DPRINTF(Tsunami, "read va=%#x size=%d\n", pkt->getAddr(), pkt->getSize());
<
< switch (pkt->getSize()) {
< case sizeof(uint64_t):
< pkt->set(0xFFFFFFFFFFFFFFFFULL);
< break;
< case sizeof(uint32_t):
< pkt->set((uint32_t)0xFFFFFFFF);
< break;
< case sizeof(uint16_t):
< pkt->set((uint16_t)0xFFFF);
< break;
< case sizeof(uint8_t):
< pkt->set((uint8_t)0xFF);
< break;
< default:
< panic("invalid access size(?) for PCI configspace!\n");
< }
< pkt->result = Packet::Success;
< return pioDelay;
---
> memset(&retData, p->retData, sizeof(retData));
83,95d52
< Tick
< IsaFake::write(PacketPtr pkt)
< {
< DPRINTF(Tsunami, "write - va=%#x size=%d \n", pkt->getAddr(), pkt->getSize());
< pkt->result = Packet::Success;
< return pioDelay;
< }
<
< BadAddr::BadAddr(Params *p)
< : BasicPioDevice(p)
< {
< }
<
97c54
< BadAddr::init()
---
> IsaFake::init()
103a61
>
105c63
< BadAddr::read(PacketPtr pkt)
---
> IsaFake::read(PacketPtr pkt)
108,110c66,92
< DPRINTF(Tsunami, "read to bad address va=%#x size=%d\n",
< pkt->getAddr(), pkt->getSize());
< pkt->result = Packet::BadAddress;
---
>
> if (params()->retBadAddr) {
> DPRINTF(Tsunami, "read to bad address va=%#x size=%d\n",
> pkt->getAddr(), pkt->getSize());
> pkt->result = Packet::BadAddress;
> } else {
> assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
> DPRINTF(Tsunami, "read va=%#x size=%d\n",
> pkt->getAddr(), pkt->getSize());
> switch (pkt->getSize()) {
> case sizeof(uint64_t):
> pkt->set(retData);
> break;
> case sizeof(uint32_t):
> pkt->set((uint32_t)retData);
> break;
> case sizeof(uint16_t):
> pkt->set((uint16_t)retData);
> break;
> case sizeof(uint8_t):
> pkt->set((uint8_t)retData);
> break;
> default:
> panic("invalid access size!\n");
> }
> pkt->result = Packet::Success;
> }
115c97
< BadAddr::write(PacketPtr pkt)
---
> IsaFake::write(PacketPtr pkt)
117,119c99,107
< DPRINTF(Tsunami, "write to bad address va=%#x size=%d \n",
< pkt->getAddr(), pkt->getSize());
< pkt->result = Packet::BadAddress;
---
> if (params()->retBadAddr) {
> DPRINTF(Tsunami, "write to bad address va=%#x size=%d \n",
> pkt->getAddr(), pkt->getSize());
> pkt->result = Packet::BadAddress;
> } else {
> DPRINTF(Tsunami, "write - va=%#x size=%d \n",
> pkt->getAddr(), pkt->getSize());
> pkt->result = Packet::Success;
> }
127a116,117
> Param<bool> ret_bad_addr;
> Param<uint8_t> ret_data;
137a128,129
> INIT_PARAM(ret_bad_addr, "Return pkt status BadAddr"),
> INIT_PARAM(ret_data, "Data to return if not bad addr"),
149a142,143
> p->retBadAddr = ret_bad_addr;
> p->retData = ret_data;
156,186d149
<
< 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)