x86: add tlb checkpointing
authorNilay Vaish <nilay@cs.wisc.edu>
Wed, 7 Aug 2013 19:51:17 +0000 (14:51 -0500)
committerNilay Vaish <nilay@cs.wisc.edu>
Wed, 7 Aug 2013 19:51:17 +0000 (14:51 -0500)
This patch adds checkpointing support to x86 tlb. It upgrades the
cpt_upgrader.py script so that previously created checkpoints can
be updated. It moves the checkpoint version to 6.

src/arch/x86/X86TLB.py
src/arch/x86/pagetable.cc
src/arch/x86/tlb.cc
src/arch/x86/tlb.hh
src/sim/serialize.hh
util/cpt_upgrader.py

index b652118cedb1509c5abb18ee5f77cb3b83f9fcaf..7f195f2334868ef11c9ce887ad5f2704a450bdcf 100644 (file)
@@ -54,6 +54,6 @@ class X86TLB(BaseTLB):
     type = 'X86TLB'
     cxx_class = 'X86ISA::TLB'
     cxx_header = 'arch/x86/tlb.hh'
-    size = Param.Int(64, "TLB size")
+    size = Param.Unsigned(64, "TLB size")
     walker = Param.X86PagetableWalker(\
             X86PagetableWalker(), "page table walker")
index 40d5e09840295450a3a3ad297a22bb48dcda06e6..a9ef1812979b4c3e65a2f1fdb3732ab8c0979ee1 100644 (file)
@@ -70,25 +70,14 @@ TlbEntry::unserialize(Checkpoint *cp, const std::string &section)
 {
     UNSERIALIZE_SCALAR(paddr);
     UNSERIALIZE_SCALAR(vaddr);
-    //
-    // The logBytes scalar variable replaced the previous size variable.
-    // The following code maintains backwards compatibility with previous
-    // checkpoints using the old size variable.
-    //
-    if (UNSERIALIZE_OPT_SCALAR(logBytes) == false) {
-        int size;
-        UNSERIALIZE_SCALAR(size);
-        logBytes = log2(size);
-    }
+    UNSERIALIZE_SCALAR(logBytes);
     UNSERIALIZE_SCALAR(writable);
     UNSERIALIZE_SCALAR(user);
     UNSERIALIZE_SCALAR(uncacheable);
     UNSERIALIZE_SCALAR(global);
     UNSERIALIZE_SCALAR(patBit);
     UNSERIALIZE_SCALAR(noExec);
-    if (UNSERIALIZE_OPT_SCALAR(lruSeq) == false) {
-        lruSeq = 0;
-    }
+    UNSERIALIZE_SCALAR(lruSeq);
 }
 
 }
index 52cc3e0eef895d2a054ee73eaa2203a33999dbb8..087cfbadf0ef8a87edd38cdb5f0019e5f2ec9fcb 100644 (file)
@@ -439,11 +439,42 @@ TLB::getWalker()
 void
 TLB::serialize(std::ostream &os)
 {
+    // Only store the entries in use.
+    uint32_t _size = size - freeList.size();
+    SERIALIZE_SCALAR(_size);
+    SERIALIZE_SCALAR(lruSeq);
+
+    uint32_t _count = 0;
+
+    for (uint32_t x = 0; x < size; x++) {
+        if (tlb[x].trieHandle != NULL) {
+            os << "\n[" << csprintf("%s.Entry%d", name(), _count) << "]\n";
+            tlb[x].serialize(os);
+            _count++;
+        }
+    }
 }
 
 void
 TLB::unserialize(Checkpoint *cp, const std::string &section)
 {
+    // Do not allow to restore with a smaller tlb.
+    uint32_t _size;
+    UNSERIALIZE_SCALAR(_size);
+    if (_size > size) {
+        fatal("TLB size less than the one in checkpoint!");
+    }
+
+    UNSERIALIZE_SCALAR(lruSeq);
+
+    for (uint32_t x = 0; x < _size; x++) {
+        TlbEntry *newEntry = freeList.front();
+        freeList.pop_front();
+
+        newEntry->unserialize(cp, csprintf("%s.Entry%d", name(), x));
+        newEntry->trieHandle = trie.insert(newEntry->vaddr,
+            TlbEntryTrie::MaxBits - newEntry->logBytes, newEntry);
+    }
 }
 
 BaseMasterPort *
index 4f0d58d5c19cae41cb2b131e9defedfe5191f74c..ea2d50ec2bc90886ffd454a9f2f2013335c24364 100644 (file)
@@ -95,12 +95,11 @@ namespace X86ISA
         void demapPage(Addr va, uint64_t asn);
 
       protected:
-        int size;
+        uint32_t size;
 
         TlbEntry * tlb;
 
         EntryList freeList;
-        EntryList entryList;
 
         TlbEntryTrie trie;
         uint64_t lruSeq;
index e523e68a546f9bbb51ad098eacce2cf585a58652..aedb2d1aec4586a751e21f7f155663461fe1c30d 100644 (file)
@@ -57,7 +57,7 @@ class SimObject;
  * SimObject shouldn't cause the version number to increase, only changes to
  * existing objects such as serializing/unserializing more state, changing sizes
  * of serialized arrays, etc. */
-static const uint64_t gem5CheckpointVersion = 0x0000000000000005;
+static const uint64_t gem5CheckpointVersion = 0x0000000000000006;
 
 template <class T>
 void paramOut(std::ostream &os, const std::string &name, const T &param);
index e1f56b3bac1ac4bf461f5775a84b47b43b5617aa..623c9b2972b38512d217bdcc5690f426b627d66d 100755 (executable)
@@ -193,7 +193,21 @@ def from_4(cpt):
                 del mr[137]
                 cpt.set(sec, 'miscRegs', ' '.join(str(x) for x in mr))
 
+# Version 6 of the checkpoint format adds tlb to x86 checkpoints
+def from_5(cpt):
+    if cpt.get('root','isa') == 'x86':
+        for sec in cpt.sections():
+            import re
+            # Search for all ISA sections
+            if re.search('.*sys.*\.cpu.*\.dtb$', sec):
+                cpt.set(sec, '_size', '0')
+                cpt.set(sec, 'lruSeq', '0')
 
+            if re.search('.*sys.*\.cpu.*\.itb$', sec):
+                cpt.set(sec, '_size', '0')
+                cpt.set(sec, 'lruSeq', '0')
+    else:
+        print "ISA is not x86"
 
 migrations = []
 migrations.append(from_0)
@@ -201,6 +215,7 @@ migrations.append(from_1)
 migrations.append(from_2)
 migrations.append(from_3)
 migrations.append(from_4)
+migrations.append(from_5)
 
 verbose_print = False