diff options
Diffstat (limited to 'src/arch')
-rw-r--r-- | src/arch/alpha/faults.cc | 22 | ||||
-rw-r--r-- | src/arch/sparc/faults.cc | 25 | ||||
-rw-r--r-- | src/arch/x86/tlb.cc | 16 |
3 files changed, 41 insertions, 22 deletions
diff --git a/src/arch/alpha/faults.cc b/src/arch/alpha/faults.cc index 89b0ecea8..3433844c1 100644 --- a/src/arch/alpha/faults.cc +++ b/src/arch/alpha/faults.cc @@ -196,11 +196,14 @@ ItbPageFault::invoke(ThreadContext *tc, const StaticInstPtr &inst) } Process *p = tc->getProcessPtr(); - TlbEntry *entry = p->pTable->lookup(pc); - panic_if(!entry, "Tried to execute unmapped address %#x.\n", pc); + const EmulationPageTable::Entry *pte = p->pTable->lookup(pc); + panic_if(!pte, "Tried to execute unmapped address %#x.\n", pc); VAddr vaddr(pc); - dynamic_cast<TLB *>(tc->getITBPtr())->insert(vaddr.page(), *entry); + TlbEntry entry(p->pTable->pid(), vaddr.page(), pte->paddr, + pte->flags & EmulationPageTable::Uncacheable, + pte->flags & EmulationPageTable::ReadOnly); + dynamic_cast<TLB *>(tc->getITBPtr())->insert(vaddr.page(), entry); } void @@ -212,11 +215,14 @@ NDtbMissFault::invoke(ThreadContext *tc, const StaticInstPtr &inst) } Process *p = tc->getProcessPtr(); - TlbEntry *entry = p->pTable->lookup(vaddr); - if (!entry && p->fixupStackFault(vaddr)) - entry = p->pTable->lookup(vaddr); - panic_if(!entry, "Tried to access unmapped address %#x.\n", (Addr)vaddr); - dynamic_cast<TLB *>(tc->getDTBPtr())->insert(vaddr.page(), *entry); + const EmulationPageTable::Entry *pte = p->pTable->lookup(vaddr); + if (!pte && p->fixupStackFault(vaddr)) + pte = p->pTable->lookup(vaddr); + panic_if(!pte, "Tried to access unmapped address %#x.\n", (Addr)vaddr); + TlbEntry entry(p->pTable->pid(), vaddr.page(), pte->paddr, + pte->flags & EmulationPageTable::Uncacheable, + pte->flags & EmulationPageTable::ReadOnly); + dynamic_cast<TLB *>(tc->getDTBPtr())->insert(vaddr.page(), entry); } } // namespace AlphaISA diff --git a/src/arch/sparc/faults.cc b/src/arch/sparc/faults.cc index 0b6a28927..0f042b4ae 100644 --- a/src/arch/sparc/faults.cc +++ b/src/arch/sparc/faults.cc @@ -35,6 +35,7 @@ #include "arch/sparc/isa_traits.hh" #include "arch/sparc/process.hh" +#include "arch/sparc/tlb.hh" #include "arch/sparc/types.hh" #include "base/bitfield.hh" #include "base/trace.hh" @@ -629,8 +630,8 @@ FastInstructionAccessMMUMiss::invoke(ThreadContext *tc, } Process *p = tc->getProcessPtr(); - TlbEntry *entry = p->pTable->lookup(vaddr); - panic_if(!entry, "Tried to execute unmapped address %#x.\n", vaddr); + const EmulationPageTable::Entry *pte = p->pTable->lookup(vaddr); + panic_if(!pte, "Tried to execute unmapped address %#x.\n", vaddr); Addr alignedvaddr = p->pTable->pageAlign(vaddr); @@ -662,13 +663,17 @@ FastInstructionAccessMMUMiss::invoke(ThreadContext *tc, // the logic works out to the following for the context. int context_id = (is_real_address || trapped) ? 0 : primary_context; + TlbEntry entry(p->pTable->pid(), alignedvaddr, pte->paddr, + pte->flags & EmulationPageTable::Uncacheable, + pte->flags & EmulationPageTable::ReadOnly); + // Insert the TLB entry. // The entry specifying whether the address is "real" is set to // false for syscall emulation mode regardless of whether the // address is real in preceding code. Not sure sure that this is // correct, but also not sure if it matters at all. dynamic_cast<TLB *>(tc->getITBPtr())-> - insert(alignedvaddr, partition_id, context_id, false, entry->pte); + insert(alignedvaddr, partition_id, context_id, false, entry.pte); } void @@ -680,10 +685,10 @@ FastDataAccessMMUMiss::invoke(ThreadContext *tc, const StaticInstPtr &inst) } Process *p = tc->getProcessPtr(); - TlbEntry *entry = p->pTable->lookup(vaddr); - if (!entry && p->fixupStackFault(vaddr)) - entry = p->pTable->lookup(vaddr); - panic_if(!entry, "Tried to access unmapped address %#x.\n", vaddr); + const EmulationPageTable::Entry *pte = p->pTable->lookup(vaddr); + if (!pte && p->fixupStackFault(vaddr)) + pte = p->pTable->lookup(vaddr); + panic_if(!pte, "Tried to access unmapped address %#x.\n", vaddr); Addr alignedvaddr = p->pTable->pageAlign(vaddr); @@ -745,13 +750,17 @@ FastDataAccessMMUMiss::invoke(ThreadContext *tc, const StaticInstPtr &inst) // The partition id distinguishes between virtualized environments. int const partition_id = 0; + TlbEntry entry(p->pTable->pid(), alignedvaddr, pte->paddr, + pte->flags & EmulationPageTable::Uncacheable, + pte->flags & EmulationPageTable::ReadOnly); + // Insert the TLB entry. // The entry specifying whether the address is "real" is set to // false for syscall emulation mode regardless of whether the // address is real in preceding code. Not sure sure that this is // correct, but also not sure if it matters at all. dynamic_cast<TLB *>(tc->getDTBPtr())-> - insert(alignedvaddr, partition_id, context_id, false, entry->pte); + insert(alignedvaddr, partition_id, context_id, false, entry.pte); } void diff --git a/src/arch/x86/tlb.cc b/src/arch/x86/tlb.cc index 93369494d..a3aec1676 100644 --- a/src/arch/x86/tlb.cc +++ b/src/arch/x86/tlb.cc @@ -357,22 +357,26 @@ TLB::translate(RequestPtr req, ThreadContext *tc, Translation *translation, assert(entry); } else { Process *p = tc->getProcessPtr(); - TlbEntry *newEntry = p->pTable->lookup(vaddr); - if (!newEntry && mode != Execute) { + const EmulationPageTable::Entry *pte = + p->pTable->lookup(vaddr); + if (!pte && mode != Execute) { // Check if we just need to grow the stack. if (p->fixupStackFault(vaddr)) { // If we did, lookup the entry for the new page. - newEntry = p->pTable->lookup(vaddr); + pte = p->pTable->lookup(vaddr); } } - if (!newEntry) { + if (!pte) { return std::make_shared<PageFault>(vaddr, true, mode, true, false); } else { Addr alignedVaddr = p->pTable->pageAlign(vaddr); DPRINTF(TLB, "Mapping %#x to %#x\n", alignedVaddr, - newEntry->pageStart()); - entry = insert(alignedVaddr, *newEntry); + pte->paddr); + entry = insert(alignedVaddr, TlbEntry( + p->pTable->pid(), alignedVaddr, pte->paddr, + pte->flags & EmulationPageTable::Uncacheable, + pte->flags & EmulationPageTable::ReadOnly)); } DPRINTF(TLB, "Miss was serviced.\n"); } |