sparc: Make translateFunctional ignore alignment and use the page tables.
authorGabe Black <gabeblack@google.com>
Wed, 18 Mar 2020 03:24:18 +0000 (20:24 -0700)
committerGabe Black <gabeblack@google.com>
Thu, 19 Mar 2020 01:38:01 +0000 (01:38 +0000)
translateFunctional might be used with unaligned addresses which should
be allowed in that context. Also, in SE mode, if the translation isn't
in the TLB itself, then it should be looked up in the SE mode fake page
tables and not in a page table resident in memory.

Change-Id: Ibb39685cfdcd4eb6cb8a0486a1de014a4e452518
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/26831
Reviewed-by: Jason Lowe-Power <power.jg@gmail.com>
Maintainer: Gabe Black <gabeblack@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/arch/sparc/tlb.cc

index 353a65c09c709739208c16b7d474ec935450f34d..e67ae9aa71699a49b4f89b8881b556c4f24ea8e3 100644 (file)
 #include "debug/IPR.hh"
 #include "debug/TLB.hh"
 #include "mem/packet_access.hh"
+#include "mem/page_table.hh"
 #include "mem/request.hh"
 #include "sim/full_system.hh"
+#include "sim/process.hh"
 #include "sim/system.hh"
 
 /* @todo remove some of the magic constants.  -- ali
@@ -861,7 +863,6 @@ TLB::translateFunctional(const RequestPtr &req, ThreadContext *tc, Mode mode)
 
     bool real = (mode == Execute) ? inst_real : data_real;
 
-    PortProxy &mem = tc->getPhysProxy();
     TlbEntry* tbe;
     PageTableEntry pte;
     Addr tsbs[4];
@@ -873,9 +874,6 @@ TLB::translateFunctional(const RequestPtr &req, ThreadContext *tc, Mode mode)
         return NoFault;
     }
 
-    if (vaddr & (size - 1))
-        return std::make_shared<MemAddressNotAligned>();
-
     if (addr_mask)
         vaddr = vaddr & VAddrAMask;
 
@@ -895,6 +893,10 @@ TLB::translateFunctional(const RequestPtr &req, ThreadContext *tc, Mode mode)
         return NoFault;
     }
 
+    if (!FullSystem)
+        return tc->getProcessPtr()->pTable->translate(req);
+
+    PortProxy &mem = tc->getPhysProxy();
     // We didn't find it in the tlbs, so lets look at the TSBs
     GetTsbPtr(tc, vaddr, ctx_zero ? 0 : pri_context, tsbs);
     va_tag = bits(vaddr, 63, 22);