arch-arm: Add Check for AddressSize Fault
authorJordi Vaquero <jordi.vaquero@metempsy.com>
Tue, 23 Jun 2020 09:27:35 +0000 (11:27 +0200)
committerJordi Vaquero <jordi.vaquero@metempsy.com>
Mon, 6 Jul 2020 14:20:28 +0000 (14:20 +0000)
This patch add a check for AddressSize Fault during translation when
MMU is disabled.

Change-Id: Iff3a1543df010b086813869b4b6c4fe776e74499
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/30619
Maintainer: Giacomo Travaglini <giacomo.travaglini@arm.com>
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
src/arch/arm/tlb.cc
src/arch/arm/utility.hh

index f92f8e00d365dfbd2d84f315c03f019a2d6884a0..f007f9317917c0c902662fe56a1f6ca28ac06a44 100644 (file)
@@ -1011,12 +1011,30 @@ TLB::translateMmuOff(ThreadContext *tc, const RequestPtr &req, Mode mode,
         TLB::ArmTranslationType tranType, Addr vaddr, bool long_desc_format)
 {
     bool is_fetch  = (mode == Execute);
+    bool is_atomic = req->isAtomic();
     req->setPaddr(vaddr);
     // When the MMU is off the security attribute corresponds to the
     // security state of the processor
     if (isSecure)
         req->setFlags(Request::SECURE);
 
+    bool selbit = bits(vaddr, 55);
+    TCR tcr1 = tc->readMiscReg(MISCREG_TCR_EL1);
+    int topbit = computeAddrTop(tc, selbit, is_fetch, tcr1, currEL(tc));
+    int addr_sz = bits(vaddr, topbit, MaxPhysAddrRange);
+    if (addr_sz != 0){
+        Fault f;
+        if (is_fetch)
+            f = std::make_shared<PrefetchAbort>(vaddr,
+                ArmFault::AddressSizeLL, isStage2, ArmFault::LpaeTran);
+        else
+            f = std::make_shared<DataAbort>( vaddr,
+                TlbEntry::DomainType::NoAccess,
+                is_atomic ? false : mode==Write,
+                ArmFault::AddressSizeLL, isStage2, ArmFault::LpaeTran);
+        return f;
+    }
+
     // @todo: double check this (ARM ARM issue C B3.2.1)
     if (long_desc_format || sctlr.tre == 0 || nmrr.ir0 == 0 ||
         nmrr.or0 == 0 || prrr.tr0 != 0x2) {
index 04403fc5fb0695a4a4b747527f8794ff47979107..b61fc2020270d0e4eebc6969ce9f25d6fcc8fcda 100644 (file)
@@ -237,7 +237,7 @@ Addr purifyTaggedAddr(Addr addr, ThreadContext *tc, ExceptionLevel el,
 Addr purifyTaggedAddr(Addr addr, ThreadContext *tc, ExceptionLevel el,
                       bool isInstr);
 int computeAddrTop(ThreadContext *tc, bool selbit, bool isInstr,
-               TTBCR tcr, ExceptionLevel el);
+               TCR tcr, ExceptionLevel el);
 
 static inline bool
 inSecureState(SCR scr, CPSR cpsr)