50c50,53
< memset(&retData, p->retData, sizeof(retData));
---
> retData8 = params()->retData8;
> retData16 = params()->retData16;
> retData32 = params()->retData32;
> retData64 = params()->retData64;
57a61,63
> if (params()->warnAccess != "")
> warn("Device %s accessed by read to address %#x size=%d\n",
> name(), pkt->getAddr(), pkt->getSize());
68c74
< pkt->set(retData);
---
> pkt->set(retData64);
71c77
< pkt->set((uint32_t)retData);
---
> pkt->set(retData32);
74c80
< pkt->set((uint16_t)retData);
---
> pkt->set(retData16);
77c83
< pkt->set((uint8_t)retData);
---
> pkt->set(retData8);
89a96,116
> if (params()->warnAccess != "") {
> uint64_t data;
> switch (pkt->getSize()) {
> case sizeof(uint64_t):
> data = pkt->get<uint64_t>();
> break;
> case sizeof(uint32_t):
> data = pkt->get<uint32_t>();
> break;
> case sizeof(uint16_t):
> data = pkt->get<uint16_t>();
> break;
> case sizeof(uint8_t):
> data = pkt->get<uint8_t>();
> break;
> default:
> panic("invalid access size!\n");
> }
> warn("Device %s accessed by write to address %#x size=%d data=%#x\n",
> name(), pkt->getAddr(), pkt->getSize(), data);
> }
96a124,142
>
> if (params()->updateData) {
> switch (pkt->getSize()) {
> case sizeof(uint64_t):
> retData64 = pkt->get<uint64_t>();
> break;
> case sizeof(uint32_t):
> retData32 = pkt->get<uint32_t>();
> break;
> case sizeof(uint16_t):
> retData16 = pkt->get<uint16_t>();
> break;
> case sizeof(uint8_t):
> retData8 = pkt->get<uint8_t>();
> break;
> default:
> panic("invalid access size!\n");
> }
> }
108c154,159
< Param<uint8_t> ret_data;
---
> Param<bool> update_data;
> Param<std::string> warn_access;
> Param<uint8_t> ret_data8;
> Param<uint16_t> ret_data16;
> Param<uint32_t> ret_data32;
> Param<uint64_t> ret_data64;
120c171,176
< INIT_PARAM(ret_data, "Data to return if not bad addr"),
---
> INIT_PARAM(update_data, "Update returned data"),
> INIT_PARAM(warn_access, "Warn if this device is touched"),
> INIT_PARAM(ret_data8, "Data to return if not bad addr"),
> INIT_PARAM(ret_data16, "Data to return if not bad addr"),
> INIT_PARAM(ret_data32, "Data to return if not bad addr"),
> INIT_PARAM(ret_data64, "Data to return if not bad addr"),
134c190,195
< p->retData = ret_data;
---
> p->updateData = update_data;
> p->warnAccess = warn_access;
> p->retData8= ret_data8;
> p->retData16 = ret_data16;
> p->retData32 = ret_data32;
> p->retData64 = ret_data64;