Giacomo Travaglini has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/56592 )

Change subject: arch-arm: Replace mcrMrc15TrapToHyp with mcrMrc15Trap
......................................................................

arch-arm: Replace mcrMrc15TrapToHyp with mcrMrc15Trap

The mcrMrc15TrapToHyp helper is already called within mcrMrc15Trap
This achieves the following:

1) Simplifies ISA code
2) Aligns McrDc to Mcr instruction

Change-Id: I9b6bc621ad89230ad9dcf0563d8985d5757b4ae1
Signed-off-by: Giacomo Travaglini <giacomo.travagl...@arm.com>
---
M src/arch/arm/insts/misc.cc
M src/arch/arm/isa/insts/misc.isa
M src/arch/arm/utility.cc
M src/arch/arm/utility.hh
4 files changed, 42 insertions(+), 45 deletions(-)



diff --git a/src/arch/arm/insts/misc.cc b/src/arch/arm/insts/misc.cc
index 4bb02c9..8c46cb8 100644
--- a/src/arch/arm/insts/misc.cc
+++ b/src/arch/arm/insts/misc.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2012-2013, 2017-2018 ARM Limited
+ * Copyright (c) 2010, 2012-2013, 2017-2018, 2021 Arm Limited
  * Copyright (c) 2013 Advanced Micro Devices, Inc.
  * All rights reserved
  *
@@ -362,14 +362,7 @@
 Fault
McrMrcMiscInst::execute(ExecContext *xc, Trace::InstRecord *traceData) const
 {
-    bool hypTrap = mcrMrc15TrapToHyp(miscReg, xc->tcBase(), iss);
-
-    if (hypTrap) {
-        return std::make_shared<HypervisorTrap>(machInst, iss,
-                                                EC_TRAPPED_CP15_MCR_MRC);
-    } else {
-        return NoFault;
-    }
+    return mcrMrc15Trap(miscReg, machInst, xc->tcBase(), iss);
 }

 std::string
@@ -388,11 +381,9 @@
 Fault
McrMrcImplDefined::execute(ExecContext *xc, Trace::InstRecord *traceData) const
 {
-    bool hypTrap = mcrMrc15TrapToHyp(miscReg, xc->tcBase(), iss);
-
-    if (hypTrap) {
-        return std::make_shared<HypervisorTrap>(machInst, iss,
-                                                EC_TRAPPED_CP15_MCR_MRC);
+    Fault fault = mcrMrc15Trap(miscReg, machInst, xc->tcBase(), iss);
+    if (fault != NoFault) {
+        return fault;
     } else {
         return std::make_shared<UndefinedInstruction>(machInst, false,
                                                       mnemonic);
diff --git a/src/arch/arm/isa/insts/misc.isa b/src/arch/arm/isa/insts/misc.isa
index 7253f85..f61c320 100644
--- a/src/arch/arm/isa/insts/misc.isa
+++ b/src/arch/arm/isa/insts/misc.isa
@@ -1,6 +1,6 @@
 // -*- mode:c++ -*-

-// Copyright (c) 2010-2013,2017-2020 ARM Limited
+// Copyright (c) 2010-2013,2017-2021 Arm Limited
 // All rights reserved
 //
 // The license below extends only to copyright in the software and shall
@@ -1115,7 +1115,7 @@
         MiscRegIndex miscReg = (MiscRegIndex) xc->tcBase()->flattenRegId(
             RegId(MiscRegClass, preFlatDest)).index();

-        bool hypTrap = mcrMrc15TrapToHyp(miscReg, xc->tcBase(), imm);
+        Fault fault = mcrMrc15Trap(miscReg, machInst, xc->tcBase(), imm);

         auto [can_write, undefined] = canWriteCoprocReg(miscReg, Scr, Cpsr,
                                                         xc->tcBase());
@@ -1123,14 +1123,13 @@
         // if we're in non secure PL1 mode then we can trap regardless
         // of whether the register is accessible, in other modes we
         // trap if only if the register IS accessible.
-        if (undefined || (!can_write & !(hypTrap & !inUserMode(Cpsr) &
+ if (undefined || (!can_write && !(fault != NoFault && !inUserMode(Cpsr) &&
                                          !isSecure(xc->tcBase())))) {
             return std::make_shared<UndefinedInstruction>(machInst, false,
                                                           mnemonic);
         }
-        if (hypTrap) {
-            return std::make_shared<HypervisorTrap>(machInst, imm,
- EC_TRAPPED_CP15_MCR_MRC);
+        if (fault != NoFault) {
+            return fault;
         }
     '''

@@ -1209,10 +1208,8 @@

     isbCode = '''
         // If the barrier is due to a CP15 access check for hyp traps
-        if ((imm != 0) && mcrMrc15TrapToHyp(MISCREG_CP15ISB,
-            xc->tcBase(), imm)) {
-            return std::make_shared<HypervisorTrap>(machInst, imm,
-                EC_TRAPPED_CP15_MCR_MRC);
+        if (imm != 0) {
+ return mcrMrc15Trap(MISCREG_CP15ISB, machInst, xc->tcBase(), imm);
         }
     '''
     isbIop = ArmInstObjParams("isb", "Isb", "ImmOp",
@@ -1225,10 +1222,8 @@

     dsbCode = '''
         // If the barrier is due to a CP15 access check for hyp traps
-        if ((imm != 0) && mcrMrc15TrapToHyp(MISCREG_CP15DSB,
-            xc->tcBase(), imm)) {
-            return std::make_shared<HypervisorTrap>(machInst, imm,
-                EC_TRAPPED_CP15_MCR_MRC);
+        if (imm != 0) {
+ return mcrMrc15Trap(MISCREG_CP15DSB, machInst, xc->tcBase(), imm);
         }
     '''
     dsbIop = ArmInstObjParams("dsb", "Dsb", "ImmOp",
@@ -1242,10 +1237,8 @@

     dmbCode = '''
         // If the barrier is due to a CP15 access check for hyp traps
-        if ((imm != 0) && mcrMrc15TrapToHyp(MISCREG_CP15DMB,
-            xc->tcBase(), imm)) {
-            return std::make_shared<HypervisorTrap>(machInst, imm,
-                EC_TRAPPED_CP15_MCR_MRC);
+        if (imm != 0) {
+ return mcrMrc15Trap(MISCREG_CP15DMB, machInst, xc->tcBase(), imm);
         }
     '''
     dmbIop = ArmInstObjParams("dmb", "Dmb", "ImmOp",
diff --git a/src/arch/arm/utility.cc b/src/arch/arm/utility.cc
index 6852aed..6013566 100644
--- a/src/arch/arm/utility.cc
+++ b/src/arch/arm/utility.cc
@@ -508,17 +508,7 @@
     return (addr + PageBytes - 1) & ~(PageBytes - 1);
 }

-Fault
-mcrMrc15Trap(const MiscRegIndex misc_reg, ExtMachInst mach_inst,
-             ThreadContext *tc, uint32_t imm)
-{
-    ExceptionClass ec = EC_TRAPPED_CP15_MCR_MRC;
-    if (mcrMrc15TrapToHyp(misc_reg, tc, imm, &ec))
-        return std::make_shared<HypervisorTrap>(mach_inst, imm, ec);
- return AArch64AArch32SystemAccessTrap(misc_reg, mach_inst, tc, imm, ec);
-}
-
-bool
+static bool
mcrMrc15TrapToHyp(const MiscRegIndex misc_reg, ThreadContext *tc, uint32_t iss,
                   ExceptionClass *ec)
 {
@@ -672,6 +662,15 @@
     return trap_to_hyp;
 }

+Fault
+mcrMrc15Trap(const MiscRegIndex misc_reg, ExtMachInst mach_inst,
+             ThreadContext *tc, uint32_t imm)
+{
+    ExceptionClass ec = EC_TRAPPED_CP15_MCR_MRC;
+    if (mcrMrc15TrapToHyp(misc_reg, tc, imm, &ec))
+        return std::make_shared<HypervisorTrap>(mach_inst, imm, ec);
+ return AArch64AArch32SystemAccessTrap(misc_reg, mach_inst, tc, imm, ec);
+}

 bool
mcrMrc14TrapToHyp(const MiscRegIndex misc_reg, ThreadContext *tc, uint32_t iss)
diff --git a/src/arch/arm/utility.hh b/src/arch/arm/utility.hh
index 00b0acf..cff1b5c 100644
--- a/src/arch/arm/utility.hh
+++ b/src/arch/arm/utility.hh
@@ -275,8 +275,6 @@

 Fault mcrMrc15Trap(const MiscRegIndex miscReg, ExtMachInst machInst,
                    ThreadContext *tc, uint32_t imm);
-bool mcrMrc15TrapToHyp(const MiscRegIndex miscReg, ThreadContext *tc,
-                       uint32_t iss, ExceptionClass *ec=nullptr);

 bool mcrMrc14TrapToHyp(const MiscRegIndex miscReg, ThreadContext *tc,
                        uint32_t iss);

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/56592
To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I9b6bc621ad89230ad9dcf0563d8985d5757b4ae1
Gerrit-Change-Number: 56592
Gerrit-PatchSet: 1
Gerrit-Owner: Giacomo Travaglini <giacomo.travagl...@arm.com>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to