x86: add tlb checkpointing
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.
This commit is contained in:
parent
b5bb2a25aa
commit
e038741598
6 changed files with 51 additions and 17 deletions
|
@ -54,6 +54,6 @@ class X86TLB(BaseTLB):
|
||||||
type = 'X86TLB'
|
type = 'X86TLB'
|
||||||
cxx_class = 'X86ISA::TLB'
|
cxx_class = 'X86ISA::TLB'
|
||||||
cxx_header = 'arch/x86/tlb.hh'
|
cxx_header = 'arch/x86/tlb.hh'
|
||||||
size = Param.Int(64, "TLB size")
|
size = Param.Unsigned(64, "TLB size")
|
||||||
walker = Param.X86PagetableWalker(\
|
walker = Param.X86PagetableWalker(\
|
||||||
X86PagetableWalker(), "page table walker")
|
X86PagetableWalker(), "page table walker")
|
||||||
|
|
|
@ -70,25 +70,14 @@ TlbEntry::unserialize(Checkpoint *cp, const std::string §ion)
|
||||||
{
|
{
|
||||||
UNSERIALIZE_SCALAR(paddr);
|
UNSERIALIZE_SCALAR(paddr);
|
||||||
UNSERIALIZE_SCALAR(vaddr);
|
UNSERIALIZE_SCALAR(vaddr);
|
||||||
//
|
UNSERIALIZE_SCALAR(logBytes);
|
||||||
// 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(writable);
|
UNSERIALIZE_SCALAR(writable);
|
||||||
UNSERIALIZE_SCALAR(user);
|
UNSERIALIZE_SCALAR(user);
|
||||||
UNSERIALIZE_SCALAR(uncacheable);
|
UNSERIALIZE_SCALAR(uncacheable);
|
||||||
UNSERIALIZE_SCALAR(global);
|
UNSERIALIZE_SCALAR(global);
|
||||||
UNSERIALIZE_SCALAR(patBit);
|
UNSERIALIZE_SCALAR(patBit);
|
||||||
UNSERIALIZE_SCALAR(noExec);
|
UNSERIALIZE_SCALAR(noExec);
|
||||||
if (UNSERIALIZE_OPT_SCALAR(lruSeq) == false) {
|
UNSERIALIZE_SCALAR(lruSeq);
|
||||||
lruSeq = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -439,11 +439,42 @@ TLB::getWalker()
|
||||||
void
|
void
|
||||||
TLB::serialize(std::ostream &os)
|
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
|
void
|
||||||
TLB::unserialize(Checkpoint *cp, const std::string §ion)
|
TLB::unserialize(Checkpoint *cp, const std::string §ion)
|
||||||
{
|
{
|
||||||
|
// 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 *
|
BaseMasterPort *
|
||||||
|
|
|
@ -95,12 +95,11 @@ namespace X86ISA
|
||||||
void demapPage(Addr va, uint64_t asn);
|
void demapPage(Addr va, uint64_t asn);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
int size;
|
uint32_t size;
|
||||||
|
|
||||||
TlbEntry * tlb;
|
TlbEntry * tlb;
|
||||||
|
|
||||||
EntryList freeList;
|
EntryList freeList;
|
||||||
EntryList entryList;
|
|
||||||
|
|
||||||
TlbEntryTrie trie;
|
TlbEntryTrie trie;
|
||||||
uint64_t lruSeq;
|
uint64_t lruSeq;
|
||||||
|
|
|
@ -57,7 +57,7 @@ class SimObject;
|
||||||
* SimObject shouldn't cause the version number to increase, only changes to
|
* SimObject shouldn't cause the version number to increase, only changes to
|
||||||
* existing objects such as serializing/unserializing more state, changing sizes
|
* existing objects such as serializing/unserializing more state, changing sizes
|
||||||
* of serialized arrays, etc. */
|
* of serialized arrays, etc. */
|
||||||
static const uint64_t gem5CheckpointVersion = 0x0000000000000005;
|
static const uint64_t gem5CheckpointVersion = 0x0000000000000006;
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void paramOut(std::ostream &os, const std::string &name, const T ¶m);
|
void paramOut(std::ostream &os, const std::string &name, const T ¶m);
|
||||||
|
|
|
@ -193,7 +193,21 @@ def from_4(cpt):
|
||||||
del mr[137]
|
del mr[137]
|
||||||
cpt.set(sec, 'miscRegs', ' '.join(str(x) for x in mr))
|
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 = []
|
||||||
migrations.append(from_0)
|
migrations.append(from_0)
|
||||||
|
@ -201,6 +215,7 @@ migrations.append(from_1)
|
||||||
migrations.append(from_2)
|
migrations.append(from_2)
|
||||||
migrations.append(from_3)
|
migrations.append(from_3)
|
||||||
migrations.append(from_4)
|
migrations.append(from_4)
|
||||||
|
migrations.append(from_5)
|
||||||
|
|
||||||
verbose_print = False
|
verbose_print = False
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue