#include "base/misc.hh"
#include "base/trace.hh"
#include "dev/disk_image.hh"
-#include "params/CowDiskImage.hh"
-#include "params/RawDiskImage.hh"
#include "sim/sim_exit.hh"
#include "sim/byteswap.hh"
//
// Raw Disk image
//
-RawDiskImage::RawDiskImage(const string &name, const string &filename,
- bool rd_only)
- : DiskImage(name), disk_size(0)
-{ open(filename, rd_only); }
+RawDiskImage::RawDiskImage(const Params* p)
+ : DiskImage(p), disk_size(0)
+{ open(p->image_file, p->read_only); }
RawDiskImage::~RawDiskImage()
{ close(); }
RawDiskImage *
RawDiskImageParams::create()
{
- return new RawDiskImage(name, image_file, read_only);
+ return new RawDiskImage(this);
}
////////////////////////////////////////////////////////////////////////
const int CowDiskImage::VersionMajor = 1;
const int CowDiskImage::VersionMinor = 0;
-CowDiskImage::CowDiskImage(const string &name, DiskImage *kid, int hash_size)
- : DiskImage(name), child(kid), table(NULL)
-{ init(hash_size); }
-
class CowDiskCallback : public Callback
{
private:
void process() { image->save(); delete this; }
};
-CowDiskImage::CowDiskImage(const string &name, DiskImage *kid, int hash_size,
- const string &file, bool read_only)
- : DiskImage(name), filename(file), child(kid), table(NULL)
+CowDiskImage::CowDiskImage(const Params *p)
+ : DiskImage(p), filename(p->image_file), child(p->child), table(NULL)
{
- if (!open(filename)) {
- assert(!read_only && "why have a non-existent read only file?");
- init(hash_size);
+ if (filename.empty()) {
+ init(p->table_size);
+ } else {
+ if (!open(filename)) {
+ if (p->read_only)
+ fatal("could not open read-only file");
+ init(p->table_size);
+ }
+
+ if (!p->read_only)
+ registerExitCallback(new CowDiskCallback(this));
}
-
- if (!read_only)
- registerExitCallback(new CowDiskCallback(this));
}
CowDiskImage::~CowDiskImage()
CowDiskImage *
CowDiskImageParams::create()
{
- if (((string)image_file).empty())
- return new CowDiskImage(name, child, table_size);
- else
- return new CowDiskImage(name, child, table_size,
- image_file, read_only);
+ return new CowDiskImage(this);
}