isa_fake.cc revision 8461
11817SN/A/*
21817SN/A * Copyright (c) 2004-2005 The Regents of The University of Michigan
31817SN/A * All rights reserved.
41817SN/A *
51817SN/A * Redistribution and use in source and binary forms, with or without
61817SN/A * modification, are permitted provided that the following conditions are
71817SN/A * met: redistributions of source code must retain the above copyright
81817SN/A * notice, this list of conditions and the following disclaimer;
91817SN/A * redistributions in binary form must reproduce the above copyright
101817SN/A * notice, this list of conditions and the following disclaimer in the
111817SN/A * documentation and/or other materials provided with the distribution;
121817SN/A * neither the name of the copyright holders nor the names of its
131817SN/A * contributors may be used to endorse or promote products derived from
141817SN/A * this software without specific prior written permission.
151817SN/A *
161817SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
171817SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
181817SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
191817SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
201817SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
211817SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
221817SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
231817SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
241817SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
251817SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
261817SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272665Ssaidi@eecs.umich.edu *
283499Ssaidi@eecs.umich.edu * Authors: Ali Saidi
291817SN/A */
301817SN/A
311817SN/A/** @file
321817SN/A * Isa Fake Device implementation
331817SN/A */
341817SN/A
351817SN/A#include "base/trace.hh"
368232Snate@binkert.org#include "debug/IsaFake.hh"
372542SN/A#include "dev/isa_fake.hh"
382542SN/A#include "mem/packet.hh"
393348Sbinkertn@umich.edu#include "mem/packet_access.hh"
401817SN/A#include "sim/system.hh"
411817SN/A
421817SN/Ausing namespace std;
431817SN/A
442539SN/AIsaFake::IsaFake(Params *p)
452539SN/A    : BasicPioDevice(p)
461817SN/A{
474762Snate@binkert.org    if (!p->ret_bad_addr)
483499Ssaidi@eecs.umich.edu        pioSize = p->pio_size;
493499Ssaidi@eecs.umich.edu
504762Snate@binkert.org    retData8 = p->ret_data8;
514762Snate@binkert.org    retData16 = p->ret_data16;
524762Snate@binkert.org    retData32 = p->ret_data32;
534762Snate@binkert.org    retData64 = p->ret_data64;
542539SN/A}
551817SN/A
562539SN/ATick
573349Sbinkertn@umich.eduIsaFake::read(PacketPtr pkt)
582539SN/A{
598461SAli.Saidi@ARM.com    pkt->allocate();
608461SAli.Saidi@ARM.com    pkt->makeAtomicResponse();
612539SN/A
624762Snate@binkert.org    if (params()->warn_access != "")
633814Ssaidi@eecs.umich.edu        warn("Device %s accessed by read to address %#x size=%d\n",
643814Ssaidi@eecs.umich.edu                name(), pkt->getAddr(), pkt->getSize());
654762Snate@binkert.org    if (params()->ret_bad_addr) {
665192Ssaidi@eecs.umich.edu        DPRINTF(IsaFake, "read to bad address va=%#x size=%d\n",
673499Ssaidi@eecs.umich.edu                pkt->getAddr(), pkt->getSize());
684870Sstever@eecs.umich.edu        pkt->setBadAddress();
693499Ssaidi@eecs.umich.edu    } else {
703499Ssaidi@eecs.umich.edu        assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
715192Ssaidi@eecs.umich.edu        DPRINTF(IsaFake, "read  va=%#x size=%d\n",
723499Ssaidi@eecs.umich.edu                pkt->getAddr(), pkt->getSize());
733499Ssaidi@eecs.umich.edu        switch (pkt->getSize()) {
743499Ssaidi@eecs.umich.edu          case sizeof(uint64_t):
753814Ssaidi@eecs.umich.edu             pkt->set(retData64);
763499Ssaidi@eecs.umich.edu             break;
773499Ssaidi@eecs.umich.edu          case sizeof(uint32_t):
783814Ssaidi@eecs.umich.edu             pkt->set(retData32);
793499Ssaidi@eecs.umich.edu             break;
803499Ssaidi@eecs.umich.edu          case sizeof(uint16_t):
813814Ssaidi@eecs.umich.edu             pkt->set(retData16);
823499Ssaidi@eecs.umich.edu             break;
833499Ssaidi@eecs.umich.edu          case sizeof(uint8_t):
843814Ssaidi@eecs.umich.edu             pkt->set(retData8);
853499Ssaidi@eecs.umich.edu             break;
863499Ssaidi@eecs.umich.edu          default:
878461SAli.Saidi@ARM.com             if (params()->fake_mem)
888461SAli.Saidi@ARM.com                 std::memset(pkt->getPtr<uint8_t>(), 0, pkt->getSize());
898461SAli.Saidi@ARM.com             else
908461SAli.Saidi@ARM.com                 panic("invalid access size! Device being accessed by cache?\n");
913499Ssaidi@eecs.umich.edu        }
921817SN/A    }
932539SN/A    return pioDelay;
941817SN/A}
951817SN/A
962542SN/ATick
973349Sbinkertn@umich.eduIsaFake::write(PacketPtr pkt)
981817SN/A{
994986Ssaidi@eecs.umich.edu    pkt->makeAtomicResponse();
1004762Snate@binkert.org    if (params()->warn_access != "") {
1013814Ssaidi@eecs.umich.edu        uint64_t data;
1023814Ssaidi@eecs.umich.edu        switch (pkt->getSize()) {
1033814Ssaidi@eecs.umich.edu          case sizeof(uint64_t):
1043814Ssaidi@eecs.umich.edu            data = pkt->get<uint64_t>();
1053814Ssaidi@eecs.umich.edu            break;
1063814Ssaidi@eecs.umich.edu          case sizeof(uint32_t):
1073814Ssaidi@eecs.umich.edu            data = pkt->get<uint32_t>();
1083814Ssaidi@eecs.umich.edu            break;
1093814Ssaidi@eecs.umich.edu          case sizeof(uint16_t):
1103814Ssaidi@eecs.umich.edu            data = pkt->get<uint16_t>();
1113814Ssaidi@eecs.umich.edu            break;
1123814Ssaidi@eecs.umich.edu          case sizeof(uint8_t):
1133814Ssaidi@eecs.umich.edu            data = pkt->get<uint8_t>();
1143814Ssaidi@eecs.umich.edu            break;
1153814Ssaidi@eecs.umich.edu          default:
1163814Ssaidi@eecs.umich.edu            panic("invalid access size!\n");
1173814Ssaidi@eecs.umich.edu        }
1183814Ssaidi@eecs.umich.edu        warn("Device %s accessed by write to address %#x size=%d data=%#x\n",
1193814Ssaidi@eecs.umich.edu                name(), pkt->getAddr(), pkt->getSize(), data);
1203814Ssaidi@eecs.umich.edu    }
1214762Snate@binkert.org    if (params()->ret_bad_addr) {
1225192Ssaidi@eecs.umich.edu        DPRINTF(IsaFake, "write to bad address va=%#x size=%d \n",
1233499Ssaidi@eecs.umich.edu                pkt->getAddr(), pkt->getSize());
1244870Sstever@eecs.umich.edu        pkt->setBadAddress();
1253499Ssaidi@eecs.umich.edu    } else {
1265192Ssaidi@eecs.umich.edu        DPRINTF(IsaFake, "write - va=%#x size=%d \n",
1273499Ssaidi@eecs.umich.edu                pkt->getAddr(), pkt->getSize());
1283814Ssaidi@eecs.umich.edu
1294762Snate@binkert.org        if (params()->update_data) {
1303814Ssaidi@eecs.umich.edu            switch (pkt->getSize()) {
1313814Ssaidi@eecs.umich.edu              case sizeof(uint64_t):
1323814Ssaidi@eecs.umich.edu                retData64 = pkt->get<uint64_t>();
1333814Ssaidi@eecs.umich.edu                break;
1343814Ssaidi@eecs.umich.edu              case sizeof(uint32_t):
1353814Ssaidi@eecs.umich.edu                retData32 = pkt->get<uint32_t>();
1363814Ssaidi@eecs.umich.edu                break;
1373814Ssaidi@eecs.umich.edu              case sizeof(uint16_t):
1383814Ssaidi@eecs.umich.edu                retData16 = pkt->get<uint16_t>();
1393814Ssaidi@eecs.umich.edu                break;
1403814Ssaidi@eecs.umich.edu              case sizeof(uint8_t):
1413814Ssaidi@eecs.umich.edu                retData8 = pkt->get<uint8_t>();
1423814Ssaidi@eecs.umich.edu                break;
1433814Ssaidi@eecs.umich.edu              default:
1443814Ssaidi@eecs.umich.edu                panic("invalid access size!\n");
1453814Ssaidi@eecs.umich.edu            }
1463814Ssaidi@eecs.umich.edu        }
1473499Ssaidi@eecs.umich.edu    }
1483488Sktlim@umich.edu    return pioDelay;
1493488Sktlim@umich.edu}
1503488Sktlim@umich.edu
1514762Snate@binkert.orgIsaFake *
1524762Snate@binkert.orgIsaFakeParams::create()
1531817SN/A{
1544762Snate@binkert.org    return new IsaFake(this);
1551817SN/A}
156