X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fdev%2Fisa_fake.cc;h=af3ca3b0f84b6ddf12a647e9a22d1fd630823e70;hb=da3c3bfa98e7cf81010a476b0b6ceba4c936f417;hp=ccc9a1f7cb3bb2442524ddcabaac4b59d650e1d9;hpb=de90ae482507207566139c58911bc8e2894ad856;p=gem5.git diff --git a/src/dev/isa_fake.cc b/src/dev/isa_fake.cc index ccc9a1f7c..af3ca3b0f 100644 --- a/src/dev/isa_fake.cc +++ b/src/dev/isa_fake.cc @@ -25,23 +25,17 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * Authors: Miguel Serrano - * Ali Saidi + * Authors: Ali Saidi */ /** @file * Isa Fake Device implementation */ -#include -#include -#include - #include "base/trace.hh" #include "dev/isa_fake.hh" #include "mem/packet.hh" #include "mem/packet_access.hh" -#include "sim/builder.hh" #include "sim/system.hh" using namespace std; @@ -49,138 +43,108 @@ using namespace std; IsaFake::IsaFake(Params *p) : BasicPioDevice(p) { - pioSize = p->pio_size; + 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 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->makeAtomicResponse(); + if (params()->warn_access != "") + warn("Device %s accessed by read to address %#x size=%d\n", + name(), pkt->getAddr(), pkt->getSize()); + if (params()->ret_bad_addr) { + DPRINTF(IsaFake, "read to bad address va=%#x size=%d\n", + pkt->getAddr(), pkt->getSize()); + pkt->setBadAddress(); + } else { + assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize); + DPRINTF(IsaFake, "read va=%#x size=%d\n", + pkt->getAddr(), pkt->getSize()); + 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: + panic("invalid access size!\n"); + } } - pkt->result = Packet::Success; return pioDelay; } 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) -{ -} - -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; + pkt->makeAtomicResponse(); + if (params()->warn_access != "") { + uint64_t data; + switch (pkt->getSize()) { + case sizeof(uint64_t): + data = pkt->get(); + break; + case sizeof(uint32_t): + data = pkt->get(); + break; + case sizeof(uint16_t): + data = pkt->get(); + break; + case sizeof(uint8_t): + data = pkt->get(); + 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); + } + if (params()->ret_bad_addr) { + DPRINTF(IsaFake, "write to bad address va=%#x size=%d \n", + pkt->getAddr(), pkt->getSize()); + pkt->setBadAddress(); + } else { + DPRINTF(IsaFake, "write - va=%#x size=%d \n", + pkt->getAddr(), pkt->getSize()); + + if (params()->update_data) { + switch (pkt->getSize()) { + case sizeof(uint64_t): + retData64 = pkt->get(); + break; + case sizeof(uint32_t): + retData32 = pkt->get(); + break; + case sizeof(uint16_t): + retData16 = pkt->get(); + break; + case sizeof(uint8_t): + retData8 = pkt->get(); + break; + default: + panic("invalid access size!\n"); + } + } + } return pioDelay; } -BEGIN_DECLARE_SIM_OBJECT_PARAMS(IsaFake) - - Param pio_addr; - Param pio_latency; - Param pio_size; - SimObjectParam platform; - SimObjectParam system; - -END_DECLARE_SIM_OBJECT_PARAMS(IsaFake) - -BEGIN_INIT_SIM_OBJECT_PARAMS(IsaFake) - - INIT_PARAM(pio_addr, "Device Address"), - INIT_PARAM(pio_latency, "Programmed IO latency"), - INIT_PARAM(pio_size, "Size of address range"), - INIT_PARAM(platform, "platform"), - INIT_PARAM(system, "system object") - -END_INIT_SIM_OBJECT_PARAMS(IsaFake) - -CREATE_SIM_OBJECT(IsaFake) +IsaFake * +IsaFakeParams::create() { - IsaFake::Params *p = new IsaFake::Params; - p->name = getInstanceName(); - p->pio_addr = pio_addr; - p->pio_delay = pio_latency; - p->pio_size = pio_size; - p->platform = platform; - p->system = system; - return new IsaFake(p); + return new IsaFake(this); } - -REGISTER_SIM_OBJECT("IsaFake", IsaFake) - -BEGIN_DECLARE_SIM_OBJECT_PARAMS(BadAddr) - - Param pio_addr; - Param pio_latency; - SimObjectParam platform; - SimObjectParam 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)