summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarco Elver <marco.elver@ed.ac.uk>2012-09-10 11:57:43 -0400
committerMarco Elver <marco.elver@ed.ac.uk>2012-09-10 11:57:43 -0400
commit9e0edbcea8d14446487f13f56b65c669ba580673 (patch)
tree7780efe6534912c2020e4f7882d8868ccf250581 /src
parent21d4d50ba1f8aae47108db91bc20108812fb62a4 (diff)
downloadgem5-9e0edbcea8d14446487f13f56b65c669ba580673.tar.xz
Mem: Allow serializing of more than INT_MAX bytes
Despite gzwrite taking an unsigned for length, it returns an int for bytes written; gzwrite fails if (int)len < 0. Because of this, call gzwrite with len no larger than INT_MAX: write in blocks of INT_MAX if data to be written is larger than INT_MAX.
Diffstat (limited to 'src')
-rw-r--r--src/mem/abstract_mem.cc15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/mem/abstract_mem.cc b/src/mem/abstract_mem.cc
index a7016bb51..775517e3b 100644
--- a/src/mem/abstract_mem.cc
+++ b/src/mem/abstract_mem.cc
@@ -51,6 +51,7 @@
#include <cerrno>
#include <cstdio>
+#include <climits>
#include <iostream>
#include <string>
@@ -486,9 +487,17 @@ AbstractMemory::serialize(ostream &os)
fatal("Insufficient memory to allocate compression state for %s\n",
filename);
- if (gzwrite(compressedMem, pmemAddr, size()) != (int)size()) {
- fatal("Write failed on physical memory checkpoint file '%s'\n",
- filename);
+ uint64_t pass_size = 0;
+ // gzwrite fails if (int)len < 0 (gzwrite returns int)
+ for (uint64_t written = 0; written < size(); written += pass_size) {
+ pass_size = (uint64_t)INT_MAX < (size() - written) ?
+ (uint64_t)INT_MAX : (size() - written);
+
+ if (gzwrite(compressedMem, pmemAddr + written,
+ (unsigned int) pass_size) != (int)pass_size) {
+ fatal("Write failed on physical memory checkpoint file '%s'\n",
+ filename);
+ }
}
if (gzclose(compressedMem))