isa_fake.cc revision 8232
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{ 592539SN/A 604986Ssaidi@eecs.umich.edu pkt->makeAtomicResponse(); 614762Snate@binkert.org if (params()->warn_access != "") 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()); 644762Snate@binkert.org if (params()->ret_bad_addr) { 655192Ssaidi@eecs.umich.edu DPRINTF(IsaFake, "read to bad address va=%#x size=%d\n", 663499Ssaidi@eecs.umich.edu pkt->getAddr(), pkt->getSize()); 674870Sstever@eecs.umich.edu pkt->setBadAddress(); 683499Ssaidi@eecs.umich.edu } else { 693499Ssaidi@eecs.umich.edu assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize); 705192Ssaidi@eecs.umich.edu DPRINTF(IsaFake, "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 } 881817SN/A } 892539SN/A return pioDelay; 901817SN/A} 911817SN/A 922542SN/ATick 933349Sbinkertn@umich.eduIsaFake::write(PacketPtr pkt) 941817SN/A{ 954986Ssaidi@eecs.umich.edu pkt->makeAtomicResponse(); 964762Snate@binkert.org if (params()->warn_access != "") { 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 } 1174762Snate@binkert.org if (params()->ret_bad_addr) { 1185192Ssaidi@eecs.umich.edu DPRINTF(IsaFake, "write to bad address va=%#x size=%d \n", 1193499Ssaidi@eecs.umich.edu pkt->getAddr(), pkt->getSize()); 1204870Sstever@eecs.umich.edu pkt->setBadAddress(); 1213499Ssaidi@eecs.umich.edu } else { 1225192Ssaidi@eecs.umich.edu DPRINTF(IsaFake, "write - va=%#x size=%d \n", 1233499Ssaidi@eecs.umich.edu pkt->getAddr(), pkt->getSize()); 1243814Ssaidi@eecs.umich.edu 1254762Snate@binkert.org if (params()->update_data) { 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 } 1443488Sktlim@umich.edu return pioDelay; 1453488Sktlim@umich.edu} 1463488Sktlim@umich.edu 1474762Snate@binkert.orgIsaFake * 1484762Snate@binkert.orgIsaFakeParams::create() 1491817SN/A{ 1504762Snate@binkert.org return new IsaFake(this); 1511817SN/A} 152