summaryrefslogtreecommitdiff
path: root/src/dev
diff options
context:
space:
mode:
authorAndreas Sandberg <Andreas.Sandberg@ARM.com>2013-02-15 17:40:10 -0500
committerAndreas Sandberg <Andreas.Sandberg@ARM.com>2013-02-15 17:40:10 -0500
commit08467a88a67c1d8b8530694b27ca04fbba8dd8d8 (patch)
tree0d1388ed62a440704c0d0a392c7e2bcb4ef164e0 /src/dev
parentca96e7bff1dfaa8e0a6d900feb88c711198b4b2b (diff)
downloadgem5-08467a88a67c1d8b8530694b27ca04fbba8dd8d8.tar.xz
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.
Diffstat (limited to 'src/dev')
-rw-r--r--src/dev/disk_image.cc20
-rw-r--r--src/dev/disk_image.hh22
-rw-r--r--src/dev/ide_disk.cc2
3 files changed, 23 insertions, 21 deletions
diff --git a/src/dev/disk_image.cc b/src/dev/disk_image.cc
index c9defb605..84027d9b4 100644
--- a/src/dev/disk_image.cc
+++ b/src/dev/disk_image.cc
@@ -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");
diff --git a/src/dev/disk_image.hh b/src/dev/disk_image.hh
index 1b846522f..905879248 100644
--- a/src/dev/disk_image.hh
+++ b/src/dev/disk_image.hh
@@ -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__
diff --git a/src/dev/ide_disk.cc b/src/dev/ide_disk.cc
index 6c5ccdd86..bc7210d42 100644
--- a/src/dev/ide_disk.cc
+++ b/src/dev/ide_disk.cc
@@ -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);