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 3511793Sbrandon.potter@amd.com#include "dev/isa_fake.hh" 3611793Sbrandon.potter@amd.com 371817SN/A#include "base/trace.hh" 388232Snate@binkert.org#include "debug/IsaFake.hh" 392542SN/A#include "mem/packet.hh" 403348Sbinkertn@umich.edu#include "mem/packet_access.hh" 411817SN/A#include "sim/system.hh" 421817SN/A 431817SN/Ausing namespace std; 441817SN/A 452539SN/AIsaFake::IsaFake(Params *p) 469808Sstever@gmail.com : BasicPioDevice(p, p->ret_bad_addr ? 0 : p->pio_size) 471817SN/A{ 484762Snate@binkert.org retData8 = p->ret_data8; 494762Snate@binkert.org retData16 = p->ret_data16; 504762Snate@binkert.org retData32 = p->ret_data32; 514762Snate@binkert.org retData64 = p->ret_data64; 522539SN/A} 531817SN/A 542539SN/ATick 553349Sbinkertn@umich.eduIsaFake::read(PacketPtr pkt) 562539SN/A{ 578461SAli.Saidi@ARM.com pkt->makeAtomicResponse(); 582539SN/A 594762Snate@binkert.org if (params()->warn_access != "") 603814Ssaidi@eecs.umich.edu warn("Device %s accessed by read to address %#x size=%d\n", 613814Ssaidi@eecs.umich.edu name(), pkt->getAddr(), pkt->getSize()); 624762Snate@binkert.org if (params()->ret_bad_addr) { 635192Ssaidi@eecs.umich.edu DPRINTF(IsaFake, "read to bad address va=%#x size=%d\n", 643499Ssaidi@eecs.umich.edu pkt->getAddr(), pkt->getSize()); 654870Sstever@eecs.umich.edu pkt->setBadAddress(); 663499Ssaidi@eecs.umich.edu } else { 673499Ssaidi@eecs.umich.edu assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize); 685192Ssaidi@eecs.umich.edu DPRINTF(IsaFake, "read va=%#x size=%d\n", 693499Ssaidi@eecs.umich.edu pkt->getAddr(), pkt->getSize()); 703499Ssaidi@eecs.umich.edu switch (pkt->getSize()) { 713499Ssaidi@eecs.umich.edu case sizeof(uint64_t): 7213342Sgabeblack@google.com pkt->setLE(retData64); 733499Ssaidi@eecs.umich.edu break; 743499Ssaidi@eecs.umich.edu case sizeof(uint32_t): 7513342Sgabeblack@google.com pkt->setLE(retData32); 763499Ssaidi@eecs.umich.edu break; 773499Ssaidi@eecs.umich.edu case sizeof(uint16_t): 7813342Sgabeblack@google.com pkt->setLE(retData16); 793499Ssaidi@eecs.umich.edu break; 803499Ssaidi@eecs.umich.edu case sizeof(uint8_t): 8113342Sgabeblack@google.com pkt->setLE(retData8); 823499Ssaidi@eecs.umich.edu break; 833499Ssaidi@eecs.umich.edu default: 848461SAli.Saidi@ARM.com if (params()->fake_mem) 858461SAli.Saidi@ARM.com std::memset(pkt->getPtr<uint8_t>(), 0, pkt->getSize()); 868461SAli.Saidi@ARM.com else 878461SAli.Saidi@ARM.com panic("invalid access size! Device being accessed by cache?\n"); 883499Ssaidi@eecs.umich.edu } 891817SN/A } 902539SN/A return pioDelay; 911817SN/A} 921817SN/A 932542SN/ATick 943349Sbinkertn@umich.eduIsaFake::write(PacketPtr pkt) 951817SN/A{ 964986Ssaidi@eecs.umich.edu pkt->makeAtomicResponse(); 974762Snate@binkert.org if (params()->warn_access != "") { 983814Ssaidi@eecs.umich.edu uint64_t data; 993814Ssaidi@eecs.umich.edu switch (pkt->getSize()) { 1003814Ssaidi@eecs.umich.edu case sizeof(uint64_t): 10113342Sgabeblack@google.com data = pkt->getLE<uint64_t>(); 1023814Ssaidi@eecs.umich.edu break; 1033814Ssaidi@eecs.umich.edu case sizeof(uint32_t): 10413342Sgabeblack@google.com data = pkt->getLE<uint32_t>(); 1053814Ssaidi@eecs.umich.edu break; 1063814Ssaidi@eecs.umich.edu case sizeof(uint16_t): 10713342Sgabeblack@google.com data = pkt->getLE<uint16_t>(); 1083814Ssaidi@eecs.umich.edu break; 1093814Ssaidi@eecs.umich.edu case sizeof(uint8_t): 11013342Sgabeblack@google.com data = pkt->getLE<uint8_t>(); 1113814Ssaidi@eecs.umich.edu break; 1123814Ssaidi@eecs.umich.edu default: 11310415SCurtis.Dunham@arm.com panic("invalid access size: %u\n", pkt->getSize()); 1143814Ssaidi@eecs.umich.edu } 1153814Ssaidi@eecs.umich.edu warn("Device %s accessed by write to address %#x size=%d data=%#x\n", 1163814Ssaidi@eecs.umich.edu name(), pkt->getAddr(), pkt->getSize(), data); 1173814Ssaidi@eecs.umich.edu } 1184762Snate@binkert.org if (params()->ret_bad_addr) { 1195192Ssaidi@eecs.umich.edu DPRINTF(IsaFake, "write to bad address va=%#x size=%d \n", 1203499Ssaidi@eecs.umich.edu pkt->getAddr(), pkt->getSize()); 1214870Sstever@eecs.umich.edu pkt->setBadAddress(); 1223499Ssaidi@eecs.umich.edu } else { 1235192Ssaidi@eecs.umich.edu DPRINTF(IsaFake, "write - va=%#x size=%d \n", 1243499Ssaidi@eecs.umich.edu pkt->getAddr(), pkt->getSize()); 1253814Ssaidi@eecs.umich.edu 1264762Snate@binkert.org if (params()->update_data) { 1273814Ssaidi@eecs.umich.edu switch (pkt->getSize()) { 1283814Ssaidi@eecs.umich.edu case sizeof(uint64_t): 12913342Sgabeblack@google.com retData64 = pkt->getLE<uint64_t>(); 1303814Ssaidi@eecs.umich.edu break; 1313814Ssaidi@eecs.umich.edu case sizeof(uint32_t): 13213342Sgabeblack@google.com retData32 = pkt->getLE<uint32_t>(); 1333814Ssaidi@eecs.umich.edu break; 1343814Ssaidi@eecs.umich.edu case sizeof(uint16_t): 13513342Sgabeblack@google.com retData16 = pkt->getLE<uint16_t>(); 1363814Ssaidi@eecs.umich.edu break; 1373814Ssaidi@eecs.umich.edu case sizeof(uint8_t): 13813342Sgabeblack@google.com retData8 = pkt->getLE<uint8_t>(); 1393814Ssaidi@eecs.umich.edu break; 1403814Ssaidi@eecs.umich.edu default: 1413814Ssaidi@eecs.umich.edu panic("invalid access size!\n"); 1423814Ssaidi@eecs.umich.edu } 1433814Ssaidi@eecs.umich.edu } 1443499Ssaidi@eecs.umich.edu } 1453488Sktlim@umich.edu return pioDelay; 1463488Sktlim@umich.edu} 1473488Sktlim@umich.edu 1484762Snate@binkert.orgIsaFake * 1494762Snate@binkert.orgIsaFakeParams::create() 1501817SN/A{ 1514762Snate@binkert.org return new IsaFake(this); 1521817SN/A} 153