x86: Implement translateFunctional.
authorGabe Black <gabeblack@google.com>
Sat, 7 Mar 2020 00:38:22 +0000 (16:38 -0800)
committerGabe Black <gabeblack@google.com>
Tue, 17 Mar 2020 01:08:01 +0000 (01:08 +0000)
This function is based off of vtophys in the full system case, and off
of the page table fill mechanism used in SE mode. It ignores what's
already in the TLB, and also ignores protection mechanisms.

This may need to be reworked in the future if, for instance, pages
still resident in the TLB but not in the page tables need to be
considered, but it should work at least for the time being.

Change-Id: If21701ca36a30805f4199312933a8afc91f20501
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/26405
Reviewed-by: Matthew Poremba <matthew.poremba@amd.com>
Maintainer: Gabe Black <gabeblack@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/arch/x86/tlb.cc
src/arch/x86/tlb.hh

index 15c431c50cb58fee497bd7b8f9e534dc3ce82868..740b6bc9685c512144e5258cb108fe7a49c5e649 100644 (file)
@@ -469,6 +469,40 @@ TLB::translateAtomic(const RequestPtr &req, ThreadContext *tc, Mode mode)
     return TLB::translate(req, tc, NULL, mode, delayedResponse, false);
 }
 
+Fault
+TLB::translateFunctional(const RequestPtr &req, ThreadContext *tc, Mode mode)
+{
+    unsigned logBytes;
+    const Addr vaddr = req->getVaddr();
+    Addr addr = vaddr;
+    Addr paddr = 0;
+    if (FullSystem) {
+        Fault fault = walker->startFunctional(tc, addr, logBytes, mode);
+        if (fault != NoFault)
+            return fault;
+        paddr = insertBits(addr, logBytes, 0, vaddr);
+    } else {
+        Process *process = tc->getProcessPtr();
+        const auto *pte = process->pTable->lookup(vaddr);
+
+        if (!pte && mode != Execute) {
+            // Check if we just need to grow the stack.
+            if (process->fixupStackFault(vaddr)) {
+                // If we did, lookup the entry for the new page.
+                pte = process->pTable->lookup(vaddr);
+            }
+        }
+
+        if (!pte)
+            return std::make_shared<PageFault>(vaddr, true, mode, true, false);
+
+        paddr = pte->paddr | process->pTable->pageOffset(vaddr);
+    }
+    DPRINTF(TLB, "Translated (functional) %#x -> %#x.\n", vaddr, paddr);
+    req->setPaddr(paddr);
+    return NoFault;
+}
+
 void
 TLB::translateTiming(const RequestPtr &req, ThreadContext *tc,
         Translation *translation, Mode mode)
index e5ae567046f02d8673cb0cd37309fe69f58bec84..f0a671f391a7a907109d26677ea6c8bd5d919683 100644 (file)
@@ -124,6 +124,8 @@ namespace X86ISA
 
         Fault translateAtomic(
             const RequestPtr &req, ThreadContext *tc, Mode mode) override;
+        Fault translateFunctional(
+            const RequestPtr &req, ThreadContext *tc, Mode mode) override;
         void translateTiming(
             const RequestPtr &req, ThreadContext *tc,
             Translation *translation, Mode mode) override;