dev: Use the correct return type for disk offsets

Replace the use of off_t in the various DiskImage related classes with
std::streampos. off_t is a signed 32 bit integer on most 32-bit
systems, whereas std::streampos is normally a 64 bit integer on most
modern systems. Furthermore, std::streampos is the type used by
tellg() and seekg() in the standard library, so it should have been
used in the first place. This patch makes it possible to use disk
images larger than 2 GiB on 32 bit systems with a modern C++ standard
library.
This commit is contained in:
Andreas Sandberg
2013-02-15 17:40:10 -05:00
parent ca96e7bff1
commit 08467a88a6
3 changed files with 23 additions and 21 deletions

View File

@@ -86,7 +86,7 @@ RawDiskImage::close()
stream.close();
}
off_t
std::streampos
RawDiskImage::size() const
{
if (disk_size == 0) {
@@ -99,8 +99,8 @@ RawDiskImage::size() const
return disk_size / SectorSize;
}
off_t
RawDiskImage::read(uint8_t *data, off_t offset) const
std::streampos
RawDiskImage::read(uint8_t *data, std::streampos offset) const
{
if (!initialized)
panic("RawDiskImage not initialized");
@@ -120,8 +120,8 @@ RawDiskImage::read(uint8_t *data, off_t offset) const
return stream.tellg() - pos;
}
off_t
RawDiskImage::write(const uint8_t *data, off_t offset)
std::streampos
RawDiskImage::write(const uint8_t *data, std::streampos offset)
{
if (!initialized)
panic("RawDiskImage not initialized");
@@ -357,12 +357,12 @@ CowDiskImage::writeback()
}
}
off_t
std::streampos
CowDiskImage::size() const
{ return child->size(); }
off_t
CowDiskImage::read(uint8_t *data, off_t offset) const
std::streampos
CowDiskImage::read(uint8_t *data, std::streampos offset) const
{
if (!initialized)
panic("CowDiskImage not initialized");
@@ -381,8 +381,8 @@ CowDiskImage::read(uint8_t *data, off_t offset) const
}
}
off_t
CowDiskImage::write(const uint8_t *data, off_t offset)
std::streampos
CowDiskImage::write(const uint8_t *data, std::streampos offset)
{
if (!initialized)
panic("RawDiskImage not initialized");

View File

@@ -58,10 +58,12 @@ class DiskImage : public SimObject
DiskImage(const Params *p) : SimObject(p), initialized(false) {}
virtual ~DiskImage() {}
virtual off_t size() const = 0;
virtual std::streampos size() const = 0;
virtual off_t read(uint8_t *data, off_t offset) const = 0;
virtual off_t write(const uint8_t *data, off_t offset) = 0;
virtual std::streampos read(uint8_t *data,
std::streampos offset) const = 0;
virtual std::streampos write(const uint8_t *data,
std::streampos offset) = 0;
};
/**
@@ -73,7 +75,7 @@ class RawDiskImage : public DiskImage
mutable std::fstream stream;
std::string file;
bool readonly;
mutable off_t disk_size;
mutable std::streampos disk_size;
public:
typedef RawDiskImageParams Params;
@@ -83,10 +85,10 @@ class RawDiskImage : public DiskImage
void close();
void open(const std::string &filename, bool rd_only = false);
virtual off_t size() const;
virtual std::streampos size() const;
virtual off_t read(uint8_t *data, off_t offset) const;
virtual off_t write(const uint8_t *data, off_t offset);
virtual std::streampos read(uint8_t *data, std::streampos offset) const;
virtual std::streampos write(const uint8_t *data, std::streampos offset);
};
/**
@@ -129,10 +131,10 @@ class CowDiskImage : public DiskImage
void serialize(std::ostream &os);
void unserialize(Checkpoint *cp, const std::string &section);
virtual off_t size() const;
virtual std::streampos size() const;
virtual off_t read(uint8_t *data, off_t offset) const;
virtual off_t write(const uint8_t *data, off_t offset);
virtual std::streampos read(uint8_t *data, std::streampos offset) const;
virtual std::streampos write(const uint8_t *data, std::streampos offset);
};
#endif // __DISK_IMAGE_HH__

View File

@@ -590,7 +590,7 @@ IdeDisk::startCommand()
switch (cmdReg.command) {
// Supported non-data commands
case WDSF_READ_NATIVE_MAX:
size = image->size() - 1;
size = (uint32_t)image->size() - 1;
cmdReg.sec_num = (size & 0xff);
cmdReg.cyl_low = ((size & 0xff00) >> 8);
cmdReg.cyl_high = ((size & 0xff0000) >> 16);