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