diff options
Diffstat (limited to 'src/arch')
-rw-r--r-- | src/arch/alpha/tlb.hh | 2 | ||||
-rw-r--r-- | src/arch/arm/tlb.cc | 24 | ||||
-rw-r--r-- | src/arch/arm/tlb.hh | 2 | ||||
-rw-r--r-- | src/arch/mips/tlb.hh | 3 | ||||
-rw-r--r-- | src/arch/power/tlb.hh | 2 | ||||
-rw-r--r-- | src/arch/sparc/tlb.hh | 2 | ||||
-rw-r--r-- | src/arch/x86/tlb.hh | 2 |
7 files changed, 37 insertions, 0 deletions
diff --git a/src/arch/alpha/tlb.hh b/src/arch/alpha/tlb.hh index 3300e5761..91394e972 100644 --- a/src/arch/alpha/tlb.hh +++ b/src/arch/alpha/tlb.hh @@ -87,6 +87,8 @@ class TLB : public BaseTLB TLB(const Params *p); virtual ~TLB(); + void takeOverFrom(BaseTLB *otlb) {} + virtual void regStats(); int getsize() const { return size; } diff --git a/src/arch/arm/tlb.cc b/src/arch/arm/tlb.cc index 037f7490e..37cf9b149 100644 --- a/src/arch/arm/tlb.cc +++ b/src/arch/arm/tlb.cc @@ -354,6 +354,30 @@ TLB::drainResume() } void +TLB::takeOverFrom(BaseTLB *_otlb) +{ + TLB *otlb = dynamic_cast<TLB*>(_otlb); + /* Make sure we actually have a valid type */ + if (otlb) { + _attr = otlb->_attr; + haveLPAE = otlb->haveLPAE; + directToStage2 = otlb->directToStage2; + stage2Req = otlb->stage2Req; + bootUncacheability = otlb->bootUncacheability; + + /* Sync the stage2 MMU if they exist in both + * the old CPU and the new + */ + if (!isStage2 && + stage2Tlb && otlb->stage2Tlb) { + stage2Tlb->takeOverFrom(otlb->stage2Tlb); + } + } else { + panic("Incompatible TLB type!"); + } +} + +void TLB::serialize(ostream &os) { DPRINTF(Checkpoint, "Serializing Arm TLB\n"); diff --git a/src/arch/arm/tlb.hh b/src/arch/arm/tlb.hh index ac8c672bf..b9025fa5f 100644 --- a/src/arch/arm/tlb.hh +++ b/src/arch/arm/tlb.hh @@ -155,6 +155,8 @@ class TLB : public BaseTLB virtual ~TLB(); + void takeOverFrom(BaseTLB *otlb); + /// setup all the back pointers virtual void init(); diff --git a/src/arch/mips/tlb.hh b/src/arch/mips/tlb.hh index fdd590e85..706a96ff0 100644 --- a/src/arch/mips/tlb.hh +++ b/src/arch/mips/tlb.hh @@ -87,6 +87,9 @@ class TLB : public BaseTLB int probeEntry(Addr vpn,uint8_t) const; MipsISA::PTE *getEntry(unsigned) const; virtual ~TLB(); + + void takeOverFrom(BaseTLB *otlb) {} + int smallPages; int getsize() const { return size; } diff --git a/src/arch/power/tlb.hh b/src/arch/power/tlb.hh index 753231a89..b18956b07 100644 --- a/src/arch/power/tlb.hh +++ b/src/arch/power/tlb.hh @@ -130,6 +130,8 @@ class TLB : public BaseTLB TLB(const Params *p); virtual ~TLB(); + void takeOverFrom(BaseTLB *otlb) {} + int probeEntry(Addr vpn,uint8_t) const; PowerISA::PTE *getEntry(unsigned) const; diff --git a/src/arch/sparc/tlb.hh b/src/arch/sparc/tlb.hh index e084f665c..e29c5171a 100644 --- a/src/arch/sparc/tlb.hh +++ b/src/arch/sparc/tlb.hh @@ -154,6 +154,8 @@ class TLB : public BaseTLB typedef SparcTLBParams Params; TLB(const Params *p); + void takeOverFrom(BaseTLB *otlb) {} + void demapPage(Addr vaddr, uint64_t asn) { diff --git a/src/arch/x86/tlb.hh b/src/arch/x86/tlb.hh index ea2d50ec2..6b65b6f37 100644 --- a/src/arch/x86/tlb.hh +++ b/src/arch/x86/tlb.hh @@ -75,6 +75,8 @@ namespace X86ISA typedef X86TLBParams Params; TLB(const Params *p); + void takeOverFrom(BaseTLB *otlb) {} + TlbEntry *lookup(Addr va, bool update_lru = true); void setConfigAddress(uint32_t addr); |