dev: Use the correct return type for disk offsets
authorAndreas Sandberg <Andreas.Sandberg@ARM.com>
Fri, 15 Feb 2013 22:40:10 +0000 (17:40 -0500)
committerAndreas Sandberg <Andreas.Sandberg@ARM.com>
Fri, 15 Feb 2013 22:40:10 +0000 (17:40 -0500)
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.

src/dev/disk_image.cc
src/dev/disk_image.hh
src/dev/ide_disk.cc

index c9defb605db81ee726376290506a30a40363464b..84027d9b42e8ceda0b3ca46a413a62c90a9af35a 100644 (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");
index 1b846522f11ce9fa832c83555a378cd41985785e..90587924825df0f85e2d8505f21e8be9175b97b2 100644 (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__
index 6c5ccdd869529d9673a2e4d400c91ad8bd684af1..bc7210d42166556988f6aeb2cefab27b218a9b30 100644 (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);