isa_fake.cc revision 3814
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" 362542SN/A#include "dev/isa_fake.hh" 372542SN/A#include "mem/packet.hh" 383348Sbinkertn@umich.edu#include "mem/packet_access.hh" 391817SN/A#include "sim/builder.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{ 473499Ssaidi@eecs.umich.edu if (!params()->retBadAddr) 483499Ssaidi@eecs.umich.edu pioSize = p->pio_size; 493499Ssaidi@eecs.umich.edu 503814Ssaidi@eecs.umich.edu retData8 = params()->retData8; 513814Ssaidi@eecs.umich.edu retData16 = params()->retData16; 523814Ssaidi@eecs.umich.edu retData32 = params()->retData32; 533814Ssaidi@eecs.umich.edu retData64 = params()->retData64; 542539SN/A} 551817SN/A 562539SN/ATick 573349Sbinkertn@umich.eduIsaFake::read(PacketPtr pkt) 582539SN/A{ 592641Sstever@eecs.umich.edu assert(pkt->result == Packet::Unknown); 602539SN/A 613814Ssaidi@eecs.umich.edu if (params()->warnAccess != "") 623814Ssaidi@eecs.umich.edu warn("Device %s accessed by read to address %#x size=%d\n", 633814Ssaidi@eecs.umich.edu name(), pkt->getAddr(), pkt->getSize()); 643499Ssaidi@eecs.umich.edu if (params()->retBadAddr) { 653499Ssaidi@eecs.umich.edu DPRINTF(Tsunami, "read to bad address va=%#x size=%d\n", 663499Ssaidi@eecs.umich.edu pkt->getAddr(), pkt->getSize()); 673499Ssaidi@eecs.umich.edu pkt->result = Packet::BadAddress; 683499Ssaidi@eecs.umich.edu } else { 693499Ssaidi@eecs.umich.edu assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize); 703499Ssaidi@eecs.umich.edu DPRINTF(Tsunami, "read va=%#x size=%d\n", 713499Ssaidi@eecs.umich.edu pkt->getAddr(), pkt->getSize()); 723499Ssaidi@eecs.umich.edu switch (pkt->getSize()) { 733499Ssaidi@eecs.umich.edu case sizeof(uint64_t): 743814Ssaidi@eecs.umich.edu pkt->set(retData64); 753499Ssaidi@eecs.umich.edu break; 763499Ssaidi@eecs.umich.edu case sizeof(uint32_t): 773814Ssaidi@eecs.umich.edu pkt->set(retData32); 783499Ssaidi@eecs.umich.edu break; 793499Ssaidi@eecs.umich.edu case sizeof(uint16_t): 803814Ssaidi@eecs.umich.edu pkt->set(retData16); 813499Ssaidi@eecs.umich.edu break; 823499Ssaidi@eecs.umich.edu case sizeof(uint8_t): 833814Ssaidi@eecs.umich.edu pkt->set(retData8); 843499Ssaidi@eecs.umich.edu break; 853499Ssaidi@eecs.umich.edu default: 863499Ssaidi@eecs.umich.edu panic("invalid access size!\n"); 873499Ssaidi@eecs.umich.edu } 883499Ssaidi@eecs.umich.edu pkt->result = Packet::Success; 891817SN/A } 902539SN/A return pioDelay; 911817SN/A} 921817SN/A 932542SN/ATick 943349Sbinkertn@umich.eduIsaFake::write(PacketPtr pkt) 951817SN/A{ 963814Ssaidi@eecs.umich.edu if (params()->warnAccess != "") { 973814Ssaidi@eecs.umich.edu uint64_t data; 983814Ssaidi@eecs.umich.edu switch (pkt->getSize()) { 993814Ssaidi@eecs.umich.edu case sizeof(uint64_t): 1003814Ssaidi@eecs.umich.edu data = pkt->get<uint64_t>(); 1013814Ssaidi@eecs.umich.edu break; 1023814Ssaidi@eecs.umich.edu case sizeof(uint32_t): 1033814Ssaidi@eecs.umich.edu data = pkt->get<uint32_t>(); 1043814Ssaidi@eecs.umich.edu break; 1053814Ssaidi@eecs.umich.edu case sizeof(uint16_t): 1063814Ssaidi@eecs.umich.edu data = pkt->get<uint16_t>(); 1073814Ssaidi@eecs.umich.edu break; 1083814Ssaidi@eecs.umich.edu case sizeof(uint8_t): 1093814Ssaidi@eecs.umich.edu data = pkt->get<uint8_t>(); 1103814Ssaidi@eecs.umich.edu break; 1113814Ssaidi@eecs.umich.edu default: 1123814Ssaidi@eecs.umich.edu panic("invalid access size!\n"); 1133814Ssaidi@eecs.umich.edu } 1143814Ssaidi@eecs.umich.edu warn("Device %s accessed by write to address %#x size=%d data=%#x\n", 1153814Ssaidi@eecs.umich.edu name(), pkt->getAddr(), pkt->getSize(), data); 1163814Ssaidi@eecs.umich.edu } 1173499Ssaidi@eecs.umich.edu if (params()->retBadAddr) { 1183499Ssaidi@eecs.umich.edu DPRINTF(Tsunami, "write to bad address va=%#x size=%d \n", 1193499Ssaidi@eecs.umich.edu pkt->getAddr(), pkt->getSize()); 1203499Ssaidi@eecs.umich.edu pkt->result = Packet::BadAddress; 1213499Ssaidi@eecs.umich.edu } else { 1223499Ssaidi@eecs.umich.edu DPRINTF(Tsunami, "write - va=%#x size=%d \n", 1233499Ssaidi@eecs.umich.edu pkt->getAddr(), pkt->getSize()); 1243814Ssaidi@eecs.umich.edu 1253814Ssaidi@eecs.umich.edu if (params()->updateData) { 1263814Ssaidi@eecs.umich.edu switch (pkt->getSize()) { 1273814Ssaidi@eecs.umich.edu case sizeof(uint64_t): 1283814Ssaidi@eecs.umich.edu retData64 = pkt->get<uint64_t>(); 1293814Ssaidi@eecs.umich.edu break; 1303814Ssaidi@eecs.umich.edu case sizeof(uint32_t): 1313814Ssaidi@eecs.umich.edu retData32 = pkt->get<uint32_t>(); 1323814Ssaidi@eecs.umich.edu break; 1333814Ssaidi@eecs.umich.edu case sizeof(uint16_t): 1343814Ssaidi@eecs.umich.edu retData16 = pkt->get<uint16_t>(); 1353814Ssaidi@eecs.umich.edu break; 1363814Ssaidi@eecs.umich.edu case sizeof(uint8_t): 1373814Ssaidi@eecs.umich.edu retData8 = pkt->get<uint8_t>(); 1383814Ssaidi@eecs.umich.edu break; 1393814Ssaidi@eecs.umich.edu default: 1403814Ssaidi@eecs.umich.edu panic("invalid access size!\n"); 1413814Ssaidi@eecs.umich.edu } 1423814Ssaidi@eecs.umich.edu } 1433499Ssaidi@eecs.umich.edu pkt->result = Packet::Success; 1443499Ssaidi@eecs.umich.edu } 1453488Sktlim@umich.edu return pioDelay; 1463488Sktlim@umich.edu} 1473488Sktlim@umich.edu 1481817SN/ABEGIN_DECLARE_SIM_OBJECT_PARAMS(IsaFake) 1491817SN/A 1502539SN/A Param<Addr> pio_addr; 1511817SN/A Param<Tick> pio_latency; 1522539SN/A Param<Addr> pio_size; 1533499Ssaidi@eecs.umich.edu Param<bool> ret_bad_addr; 1543814Ssaidi@eecs.umich.edu Param<bool> update_data; 1553814Ssaidi@eecs.umich.edu Param<std::string> warn_access; 1563814Ssaidi@eecs.umich.edu Param<uint8_t> ret_data8; 1573814Ssaidi@eecs.umich.edu Param<uint16_t> ret_data16; 1583814Ssaidi@eecs.umich.edu Param<uint32_t> ret_data32; 1593814Ssaidi@eecs.umich.edu Param<uint64_t> ret_data64; 1602539SN/A SimObjectParam<Platform *> platform; 1612539SN/A SimObjectParam<System *> system; 1621817SN/A 1631817SN/AEND_DECLARE_SIM_OBJECT_PARAMS(IsaFake) 1641817SN/A 1651817SN/ABEGIN_INIT_SIM_OBJECT_PARAMS(IsaFake) 1661817SN/A 1672539SN/A INIT_PARAM(pio_addr, "Device Address"), 1682539SN/A INIT_PARAM(pio_latency, "Programmed IO latency"), 1692539SN/A INIT_PARAM(pio_size, "Size of address range"), 1703499Ssaidi@eecs.umich.edu INIT_PARAM(ret_bad_addr, "Return pkt status BadAddr"), 1713814Ssaidi@eecs.umich.edu INIT_PARAM(update_data, "Update returned data"), 1723814Ssaidi@eecs.umich.edu INIT_PARAM(warn_access, "Warn if this device is touched"), 1733814Ssaidi@eecs.umich.edu INIT_PARAM(ret_data8, "Data to return if not bad addr"), 1743814Ssaidi@eecs.umich.edu INIT_PARAM(ret_data16, "Data to return if not bad addr"), 1753814Ssaidi@eecs.umich.edu INIT_PARAM(ret_data32, "Data to return if not bad addr"), 1763814Ssaidi@eecs.umich.edu INIT_PARAM(ret_data64, "Data to return if not bad addr"), 1772539SN/A INIT_PARAM(platform, "platform"), 1782539SN/A INIT_PARAM(system, "system object") 1791817SN/A 1801817SN/AEND_INIT_SIM_OBJECT_PARAMS(IsaFake) 1811817SN/A 1821817SN/ACREATE_SIM_OBJECT(IsaFake) 1831817SN/A{ 1842539SN/A IsaFake::Params *p = new IsaFake::Params; 1852539SN/A p->name = getInstanceName(); 1862539SN/A p->pio_addr = pio_addr; 1872539SN/A p->pio_delay = pio_latency; 1882539SN/A p->pio_size = pio_size; 1893499Ssaidi@eecs.umich.edu p->retBadAddr = ret_bad_addr; 1903814Ssaidi@eecs.umich.edu p->updateData = update_data; 1913814Ssaidi@eecs.umich.edu p->warnAccess = warn_access; 1923814Ssaidi@eecs.umich.edu p->retData8= ret_data8; 1933814Ssaidi@eecs.umich.edu p->retData16 = ret_data16; 1943814Ssaidi@eecs.umich.edu p->retData32 = ret_data32; 1953814Ssaidi@eecs.umich.edu p->retData64 = ret_data64; 1962539SN/A p->platform = platform; 1972539SN/A p->system = system; 1982539SN/A return new IsaFake(p); 1991817SN/A} 2001817SN/A 2011817SN/AREGISTER_SIM_OBJECT("IsaFake", IsaFake) 202