disk_image.hh revision 6227
12623SN/A/*
22623SN/A * Copyright (c) 2001-2005 The Regents of The University of Michigan
32623SN/A * All rights reserved.
42623SN/A *
52623SN/A * Redistribution and use in source and binary forms, with or without
62623SN/A * modification, are permitted provided that the following conditions are
72623SN/A * met: redistributions of source code must retain the above copyright
82623SN/A * notice, this list of conditions and the following disclaimer;
92623SN/A * redistributions in binary form must reproduce the above copyright
102623SN/A * notice, this list of conditions and the following disclaimer in the
112623SN/A * documentation and/or other materials provided with the distribution;
122623SN/A * neither the name of the copyright holders nor the names of its
132623SN/A * contributors may be used to endorse or promote products derived from
142623SN/A * this software without specific prior written permission.
152623SN/A *
162623SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
172623SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
182623SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
192623SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
202623SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
212623SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
222623SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232623SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242623SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252623SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262623SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272665Ssaidi@eecs.umich.edu *
282665Ssaidi@eecs.umich.edu * Authors: Nathan Binkert
292623SN/A */
302623SN/A
313170Sstever@eecs.umich.edu/** @file
325103Ssaidi@eecs.umich.edu * Disk Image Interfaces
332623SN/A */
344040Ssaidi@eecs.umich.edu
356658Snate@binkert.org#ifndef __DISK_IMAGE_HH__
362623SN/A#define __DISK_IMAGE_HH__
372623SN/A
383348Sbinkertn@umich.edu#include <fstream>
393348Sbinkertn@umich.edu
404762Snate@binkert.org#include "base/hashmap.hh"
412901Ssaidi@eecs.umich.edu#include "sim/sim_object.hh"
422623SN/A#include "params/DiskImage.hh"
432623SN/A#include "params/CowDiskImage.hh"
442623SN/A#include "params/RawDiskImage.hh"
452623SN/A
462856Srdreslin@umich.edu#define SectorSize (512)
472856Srdreslin@umich.edu
482856Srdreslin@umich.edu/**
492856Srdreslin@umich.edu * Basic interface for accessing a disk image.
502856Srdreslin@umich.edu */
512856Srdreslin@umich.educlass DiskImage : public SimObject
522856Srdreslin@umich.edu{
532856Srdreslin@umich.edu  protected:
542856Srdreslin@umich.edu    bool initialized;
552856Srdreslin@umich.edu
562623SN/A  public:
572623SN/A    typedef DiskImageParams Params;
582623SN/A    DiskImage(const Params *p) : SimObject(p), initialized(false) {}
592623SN/A    virtual ~DiskImage() {}
602623SN/A
612623SN/A    virtual off_t size() const = 0;
622680Sktlim@umich.edu
632680Sktlim@umich.edu    virtual off_t read(uint8_t *data, off_t offset) const = 0;
642623SN/A    virtual off_t write(const uint8_t *data, off_t offset) = 0;
652623SN/A};
665712Shsul@eecs.umich.edu
672623SN/A/**
682623SN/A * Specialization for accessing a raw disk image
692623SN/A */
702623SN/Aclass RawDiskImage : public DiskImage
712623SN/A{
723349Sbinkertn@umich.edu  protected:
732623SN/A    mutable std::fstream stream;
742623SN/A    std::string file;
752623SN/A    bool readonly;
762623SN/A    mutable off_t disk_size;
772623SN/A
782623SN/A  public:
793349Sbinkertn@umich.edu    typedef RawDiskImageParams Params;
802623SN/A    RawDiskImage(const Params *p);
813184Srdreslin@umich.edu    ~RawDiskImage();
823184Srdreslin@umich.edu
832623SN/A    void close();
842623SN/A    void open(const std::string &filename, bool rd_only = false);
852623SN/A
862623SN/A    virtual off_t size() const;
872623SN/A
883647Srdreslin@umich.edu    virtual off_t read(uint8_t *data, off_t offset) const;
893647Srdreslin@umich.edu    virtual off_t write(const uint8_t *data, off_t offset);
903647Srdreslin@umich.edu};
913647Srdreslin@umich.edu
923647Srdreslin@umich.edu/**
932631SN/A * Specialization for accessing a copy-on-write disk image layer.
943647Srdreslin@umich.edu * A copy-on-write(COW) layer must be stacked on top of another disk
952631SN/A * image layer this layer can be another CowDiskImage, or a
962623SN/A * RawDiskImage.
972623SN/A *
982623SN/A * This object is designed to provide a mechanism for persistant
992948Ssaidi@eecs.umich.edu * changes to a main disk image, or to provide a place for temporary
1002948Ssaidi@eecs.umich.edu * changes to the image to take place that later may be thrown away.
1013349Sbinkertn@umich.edu */
1022948Ssaidi@eecs.umich.educlass CowDiskImage : public DiskImage
1032948Ssaidi@eecs.umich.edu{
1045606Snate@binkert.org  public:
1052948Ssaidi@eecs.umich.edu    static const uint32_t VersionMajor;
1062948Ssaidi@eecs.umich.edu    static const uint32_t VersionMinor;
1075529Snate@binkert.org
1085894Sgblack@eecs.umich.edu  protected:
1095894Sgblack@eecs.umich.edu    struct Sector {
1102623SN/A        uint8_t data[SectorSize];
1112623SN/A    };
1123647Srdreslin@umich.edu    typedef m5::hash_map<uint64_t, Sector *> SectorTable;
1133647Srdreslin@umich.edu
1143647Srdreslin@umich.edu  protected:
1153647Srdreslin@umich.edu    std::string filename;
1162623SN/A    DiskImage *child;
1172839Sktlim@umich.edu    SectorTable *table;
1183222Sktlim@umich.edu
1192901Ssaidi@eecs.umich.edu  public:
1202623SN/A    typedef CowDiskImageParams Params;
1212623SN/A    CowDiskImage(const Params *p);
1222623SN/A    ~CowDiskImage();
1232623SN/A
1242623SN/A    void init(int hash_size);
1252623SN/A    bool open(const std::string &file);
1262623SN/A    void save();
1272623SN/A    void save(const std::string &file);
1282623SN/A    void writeback();
1292623SN/A    void serialize(std::ostream &os);
1302915Sktlim@umich.edu    void unserialize(Checkpoint *cp, const std::string &section);
1312915Sktlim@umich.edu
1322623SN/A    virtual off_t size() const;
1332623SN/A
1342623SN/A    virtual off_t read(uint8_t *data, off_t offset) const;
1352623SN/A    virtual off_t write(const uint8_t *data, off_t offset);
1362623SN/A};
1372623SN/A
1382915Sktlim@umich.edu#endif // __DISK_IMAGE_HH__
1392915Sktlim@umich.edu