util: make a generic checkpoint aggregator that can aggregate different cpts into...
authorLisa Hsu <Lisa.Hsu@amd.com>
Mon, 18 Jan 2010 22:30:31 +0000 (14:30 -0800)
committerLisa Hsu <Lisa.Hsu@amd.com>
Mon, 18 Jan 2010 22:30:31 +0000 (14:30 -0800)
src/mem/page_table.cc
src/sim/serialize.cc
util/checkpoint-aggregator.py [new file with mode: 0755]

index 4bc3a4434dfe721ff477b69a693ff90b9a0730b4..88cfdfeb73d672163893c8a6f51426260bc44908 100644 (file)
@@ -222,6 +222,16 @@ PageTable::unserialize(Checkpoint *cp, const std::string &section)
         entry->unserialize(cp, csprintf("%s.Entry%d", process->name(), i));
         pTable[vaddr] = *entry;
         ++i;
-   }
+    }
+
+    process->M5_pid = pTable[vaddr].asn;
+
+#if THE_ISA == ALPHA_ISA
+    // The IPR_DTB_ASN misc reg must be set in Alpha for the tlb to work 
+    // correctly
+    int id = process->contextIds[0];
+    ThreadContext *tc = process->system->getThreadContext(id);
+    tc->setMiscRegNoEffect(IPR_DTB_ASN, process->M5_pid << 57);
+#endif
 }
 
index 5ae9128e56e8b8b5b8b578f2756331e4aecabdd0..1663d18bc9bef993050694b86b87edc1ae6f0a70 100644 (file)
@@ -422,7 +422,7 @@ Serializable::serializeAll(const string &cpt_dir)
     time_t t = time(NULL);
     if (!outstream.is_open())
         fatal("Unable to open file %s for writing\n", cpt_file.c_str());
-    outstream << "// checkpoint generated: " << ctime(&t);
+    outstream << "## checkpoint generated: " << ctime(&t);
 
     globals.serialize(outstream);
     SimObject::serializeAll(outstream);
diff --git a/util/checkpoint-aggregator.py b/util/checkpoint-aggregator.py
new file mode 100755 (executable)
index 0000000..f3c5eb5
--- /dev/null
@@ -0,0 +1,139 @@
+#! /usr/bin/env python2.6
+
+from ConfigParser import ConfigParser
+import gzip
+
+import sys, re, optparse, os
+
+class myCP(ConfigParser):
+    def __init__(self):
+        ConfigParser.__init__(self)
+
+    def optionxform(self, optionstr):
+        return optionstr
+
+def aggregate(options, args):
+    merged = myCP()
+    page_ptr = 0
+
+    allfiles = os.listdir(os.getcwd())
+    cpts = []
+    for arg in args:
+        found = False
+        for f in allfiles:
+            if re.compile("cpt." + arg + ".\d+").search(f):
+                found = True
+                cpts.append(f)
+                break
+        if not found:
+            print "missing checkpoint: ", arg
+            sys.exit(1)
+
+    dirname = "-".join([options.prefix, "cpt"])
+    print dirname
+    agg_name = "-".join(args)
+    print agg_name
+    fullpath = os.path.join("..", dirname, "cpt." + agg_name + ".10000")
+    if not os.path.isdir(fullpath):
+        os.system("mkdir -p " + fullpath)
+
+    myfile = open(fullpath + "/system.physmem.physmem", "wb+")
+    merged_mem = gzip.GzipFile(fileobj=myfile, mode="wb")
+
+    max_curtick = 0
+    when = 0
+    for (i, arg) in enumerate(args):
+        config = myCP()
+        config.readfp(open(cpts[i] + "/m5.cpt"))
+
+        for sec in config.sections():
+            if re.compile("cpu").search(sec):
+                newsec = re.sub("cpu", "cpu" + str(i), sec)
+                merged.add_section(newsec)
+
+                items = config.items(sec)
+                for item in items:
+                    if item[0] == "ppn":
+                        if config.getint(sec, "tag") != 0:
+                            merged.set(newsec, item[0], int(item[1]) + page_ptr)
+                            continue
+                    elif item[0] == "asn":
+                        tmp = re.compile("(.*).Entry(\d+)").search(sec).groups()
+                        if config.has_option(tmp[0], "nlu"):
+                            size = config.getint(tmp[0], "nlu")
+                            if int(tmp[1]) < size:
+                                merged.set(newsec, item[0], i)
+                                continue
+                        else:
+                            merged.set(newsec, item[0], i)
+                            continue
+                    merged.set(newsec, item[0], item[1])
+            elif sec == "system":
+                pass
+            elif sec == "Globals":
+                tick = config.getint(sec, "curTick")
+                if tick > max_curtick:
+                    max_curtick = tick
+                    when = config.getint("system.cpu.tickEvent", "_when")
+            else:
+                if i == 0:
+                    print sec
+                    merged.add_section(sec)
+                    for item in config.items(sec):
+                        merged.set(sec, item[0], item[1])
+                        if item[0] == "curtick":
+                            merged.optionxform(str("curTick"))
+                        elif item[0] == "numevents":
+                            merged.optionxform(str("numEvents"))
+
+        page_ptr = page_ptr + int(config.get("system", "page_ptr"))
+
+        ### memory stuff
+        f = open(cpts[i] + "/system.physmem.physmem", "rb")
+        gf = gzip.GzipFile(fileobj=f, mode="rb")
+        bytes = int(config.get("system", "page_ptr")) << 13
+        print "bytes to be read: ", bytes
+
+        bytesRead = gf.read(int(config.get("system", "page_ptr")) << 13)
+        merged_mem.write(bytesRead)
+
+        gf.close()
+        f.close()
+
+    merged.add_section("system")
+    merged.set("system", "page_ptr", page_ptr)
+    print "WARNING: "
+    print "Make sure the simulation using this checkpoint has at least "
+    if page_ptr > (1<<20):
+        print "8G ",
+    elif page_ptr > (1<<19):
+        print "4G ",
+    elif page_ptr > (1<<18):
+        print "2G ",
+    elif page_ptr > (1<<17):
+        print "1G ",
+    elif page_ptr > (1<<16):
+        print "512KB ",
+    else:
+        print "this is a small sim, you're probably fine",
+    print "of memory."
+
+    merged.add_section("Globals")
+    merged.set("Globals", "curTick", max_curtick)
+
+    for i in xrange(len(args)):
+        merged.set("system.cpu" + str(i) + ".tickEvent", "_when", when)
+
+    merged.write(file(fullpath + "/m5.cpt", "wb"))
+    merged_mem.close()
+    myfile.close()
+
+if __name__ == "__main__":
+
+    parser = optparse.OptionParser()
+    parser.add_option("--prefix", type="string", default="agg")
+
+    (options, args) = parser.parse_args()
+
+    aggregate(options, args)
+