diff options
author | Gabe Black <gabeblack@google.com> | 2018-01-05 15:01:00 -0800 |
---|---|---|
committer | Gabe Black <gabeblack@google.com> | 2018-01-20 08:06:56 +0000 |
commit | 2a15bfd79ced20a6d4cbf0a0a4c2fbb1444b9a44 (patch) | |
tree | d1fec5a31a00928dc9d5a3f4f05394236187d19c /src/arch/x86 | |
parent | b1ade08b2da4a0b398b69ea4eb2de35b08941826 (diff) | |
download | gem5-2a15bfd79ced20a6d4cbf0a0a4c2fbb1444b9a44.tar.xz |
arch, mem: Make the page table lookup function return a pointer.
This avoids having a copy in the lookup function itself, and the
declaration of a lot of temporary TLB entry pointers in callers. The
gpu TLB seems to have had the most dependence on the original signature
of the lookup function, partially because it was relying on a somewhat
unsafe copy to a TLB entry using a base class pointer type.
Change-Id: I8b1cf494468163deee000002d243541657faf57f
Reviewed-on: https://gem5-review.googlesource.com/7343
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>
Diffstat (limited to 'src/arch/x86')
-rw-r--r-- | src/arch/x86/remote_gdb.cc | 3 | ||||
-rw-r--r-- | src/arch/x86/tlb.cc | 15 | ||||
-rw-r--r-- | src/arch/x86/tlb.hh | 2 |
3 files changed, 9 insertions, 11 deletions
diff --git a/src/arch/x86/remote_gdb.cc b/src/arch/x86/remote_gdb.cc index 175cabba3..956459373 100644 --- a/src/arch/x86/remote_gdb.cc +++ b/src/arch/x86/remote_gdb.cc @@ -88,8 +88,7 @@ RemoteGDB::acc(Addr va, size_t len) BaseTLB::Read); return fault == NoFault; } else { - TlbEntry entry; - return context()->getProcessPtr()->pTable->lookup(va, entry); + return context()->getProcessPtr()->pTable->lookup(va) != nullptr; } } diff --git a/src/arch/x86/tlb.cc b/src/arch/x86/tlb.cc index 0b1df9e21..93369494d 100644 --- a/src/arch/x86/tlb.cc +++ b/src/arch/x86/tlb.cc @@ -94,7 +94,7 @@ TLB::evictLRU() } TlbEntry * -TLB::insert(Addr vpn, TlbEntry &entry) +TLB::insert(Addr vpn, const TlbEntry &entry) { // If somebody beat us to it, just use that existing entry. TlbEntry *newEntry = trie.lookup(vpn); @@ -357,23 +357,22 @@ TLB::translate(RequestPtr req, ThreadContext *tc, Translation *translation, assert(entry); } else { Process *p = tc->getProcessPtr(); - TlbEntry newEntry; - bool success = p->pTable->lookup(vaddr, newEntry); - if (!success && mode != Execute) { + TlbEntry *newEntry = p->pTable->lookup(vaddr); + if (!newEntry && 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. - success = p->pTable->lookup(vaddr, newEntry); + newEntry = p->pTable->lookup(vaddr); } } - if (!success) { + if (!newEntry) { 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); + newEntry->pageStart()); + entry = insert(alignedVaddr, *newEntry); } DPRINTF(TLB, "Miss was serviced.\n"); } diff --git a/src/arch/x86/tlb.hh b/src/arch/x86/tlb.hh index c3dc83bb2..08804a455 100644 --- a/src/arch/x86/tlb.hh +++ b/src/arch/x86/tlb.hh @@ -144,7 +144,7 @@ namespace X86ISA Fault finalizePhysical(RequestPtr req, ThreadContext *tc, Mode mode) const override; - TlbEntry * insert(Addr vpn, TlbEntry &entry); + TlbEntry *insert(Addr vpn, const TlbEntry &entry); /* * Function to register Stats |