simple_disk.cc revision 2665
114299Sbbruce@ucdavis.edu/* 214299Sbbruce@ucdavis.edu * Copyright (c) 2001-2005 The Regents of The University of Michigan 314299Sbbruce@ucdavis.edu * All rights reserved. 414299Sbbruce@ucdavis.edu * 514299Sbbruce@ucdavis.edu * Redistribution and use in source and binary forms, with or without 614299Sbbruce@ucdavis.edu * modification, are permitted provided that the following conditions are 714299Sbbruce@ucdavis.edu * met: redistributions of source code must retain the above copyright 814299Sbbruce@ucdavis.edu * notice, this list of conditions and the following disclaimer; 914299Sbbruce@ucdavis.edu * redistributions in binary form must reproduce the above copyright 1014299Sbbruce@ucdavis.edu * notice, this list of conditions and the following disclaimer in the 1114299Sbbruce@ucdavis.edu * documentation and/or other materials provided with the distribution; 1214299Sbbruce@ucdavis.edu * neither the name of the copyright holders nor the names of its 1314299Sbbruce@ucdavis.edu * contributors may be used to endorse or promote products derived from 1414299Sbbruce@ucdavis.edu * this software without specific prior written permission. 1514299Sbbruce@ucdavis.edu * 1614299Sbbruce@ucdavis.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1714299Sbbruce@ucdavis.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1814299Sbbruce@ucdavis.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1914299Sbbruce@ucdavis.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2014299Sbbruce@ucdavis.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2114299Sbbruce@ucdavis.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2214299Sbbruce@ucdavis.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2314299Sbbruce@ucdavis.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2414299Sbbruce@ucdavis.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2514299Sbbruce@ucdavis.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2614299Sbbruce@ucdavis.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2714299Sbbruce@ucdavis.edu * 2814299Sbbruce@ucdavis.edu * Authors: Nathan Binkert 2914299Sbbruce@ucdavis.edu */ 3014299Sbbruce@ucdavis.edu 3114299Sbbruce@ucdavis.edu/* @file 3214299Sbbruce@ucdavis.edu * Simple disk interface for the system console 3314299Sbbruce@ucdavis.edu */ 3414299Sbbruce@ucdavis.edu 3514299Sbbruce@ucdavis.edu#include <sys/types.h> 3614299Sbbruce@ucdavis.edu#include <sys/uio.h> 3714299Sbbruce@ucdavis.edu#include <fcntl.h> 3814299Sbbruce@ucdavis.edu#include <unistd.h> 3914299Sbbruce@ucdavis.edu 4014299Sbbruce@ucdavis.edu#include <cstring> 4114299Sbbruce@ucdavis.edu#include <string> 4214299Sbbruce@ucdavis.edu 4314299Sbbruce@ucdavis.edu#include "base/misc.hh" 4414299Sbbruce@ucdavis.edu#include "base/trace.hh" 4514299Sbbruce@ucdavis.edu#include "dev/disk_image.hh" 4614299Sbbruce@ucdavis.edu#include "dev/simple_disk.hh" 4714299Sbbruce@ucdavis.edu#include "mem/port.hh" 4814299Sbbruce@ucdavis.edu#include "sim/builder.hh" 4914299Sbbruce@ucdavis.edu#include "sim/system.hh" 5014299Sbbruce@ucdavis.edu 5114299Sbbruce@ucdavis.eduusing namespace std; 5214299Sbbruce@ucdavis.edu 5314299Sbbruce@ucdavis.eduSimpleDisk::SimpleDisk(const string &name, System *sys, DiskImage *img) 5414299Sbbruce@ucdavis.edu : SimObject(name), system(sys), image(img) 5514299Sbbruce@ucdavis.edu{} 5614299Sbbruce@ucdavis.edu 5714299Sbbruce@ucdavis.eduSimpleDisk::~SimpleDisk() 5814299Sbbruce@ucdavis.edu{} 5914299Sbbruce@ucdavis.edu 6014299Sbbruce@ucdavis.edu 6114299Sbbruce@ucdavis.eduvoid 6214299Sbbruce@ucdavis.eduSimpleDisk::read(Addr addr, baddr_t block, int count) const 6314299Sbbruce@ucdavis.edu{ 6414299Sbbruce@ucdavis.edu uint8_t *data = new uint8_t[SectorSize * count]; 6514299Sbbruce@ucdavis.edu 6614299Sbbruce@ucdavis.edu if (count & (SectorSize - 1)) 6714299Sbbruce@ucdavis.edu panic("Not reading a multiple of a sector (count = %d)", count); 6814299Sbbruce@ucdavis.edu 6914299Sbbruce@ucdavis.edu for (int i = 0, j = 0; i < count; i += SectorSize, j++) 7014299Sbbruce@ucdavis.edu image->read(data + i, block + j); 7114299Sbbruce@ucdavis.edu 7214299Sbbruce@ucdavis.edu system->functionalPort.writeBlob(addr, data, count); 7314299Sbbruce@ucdavis.edu 7414299Sbbruce@ucdavis.edu DPRINTF(SimpleDisk, "read block=%#x len=%d\n", (uint64_t)block, count); 7514299Sbbruce@ucdavis.edu DDUMP(SimpleDiskData, data, count); 7614299Sbbruce@ucdavis.edu 7714299Sbbruce@ucdavis.edu delete data; 7814299Sbbruce@ucdavis.edu} 7914299Sbbruce@ucdavis.edu 8014299Sbbruce@ucdavis.eduvoid 8114299Sbbruce@ucdavis.eduSimpleDisk::write(Addr addr, baddr_t block, int count) 8214299Sbbruce@ucdavis.edu{ 8314299Sbbruce@ucdavis.edu panic("unimplemented!\n"); 8414299Sbbruce@ucdavis.edu 8514299Sbbruce@ucdavis.edu#if 0 86 uint8_t *data = physmem->dma_addr(addr, count); 87 if (!data) 88 panic("dma out of range! write addr=%#x count=%d\n", addr, count); 89 90 image->write(data, block, count); 91#endif 92} 93 94BEGIN_DECLARE_SIM_OBJECT_PARAMS(SimpleDisk) 95 96 SimObjectParam<System *> system; 97 SimObjectParam<DiskImage *> disk; 98 99END_DECLARE_SIM_OBJECT_PARAMS(SimpleDisk) 100 101BEGIN_INIT_SIM_OBJECT_PARAMS(SimpleDisk) 102 103 INIT_PARAM(system, "System pointer"), 104 INIT_PARAM(disk, "Disk Image") 105 106END_INIT_SIM_OBJECT_PARAMS(SimpleDisk) 107 108CREATE_SIM_OBJECT(SimpleDisk) 109{ 110 return new SimpleDisk(getInstanceName(), system, disk); 111} 112 113REGISTER_SIM_OBJECT("SimpleDisk", SimpleDisk) 114