diff --git a/src/arch/arm/isa/includes.isa b/src/arch/arm/isa/includes.isa index 13b47c8e0f..6af382af2b 100644 --- a/src/arch/arm/isa/includes.isa +++ b/src/arch/arm/isa/includes.isa @@ -105,6 +105,7 @@ output exec {{ #include "arch/arm/htm.hh" #include "arch/arm/isa_traits.hh" #include "arch/arm/pauth_helpers.hh" +#include "arch/arm/reg_abi.hh" #include "arch/arm/semihosting.hh" #include "arch/arm/utility.hh" #include "arch/generic/memhelpers.hh" diff --git a/src/arch/arm/isa/insts/m5ops.isa b/src/arch/arm/isa/insts/m5ops.isa index 9b32065276..fafb44b6e4 100644 --- a/src/arch/arm/isa/insts/m5ops.isa +++ b/src/arch/arm/isa/insts/m5ops.isa @@ -38,13 +38,14 @@ let {{ gem5OpCode = ''' uint64_t ret; - bool recognized = PseudoInst::pseudoInst( - xc->tcBase(), bits(machInst, 23, 16), ret); - if (!recognized) + int func = bits(machInst, 23, 16); + auto *tc = xc->tcBase(); + if (!PseudoInst::pseudoInst<%s>(tc, func, ret)) fault = std::make_shared(machInst, true); ''' gem5OpIop = ArmInstObjParams("gem5op", "Gem5Op64", "PredOp", - { "code": gem5OpCode + 'X0 = ret;', + { "code": gem5OpCode % "RegABI64" + + 'X0 = ret;', "predicate_test": predicateTest }, [ "IsNonSpeculative", "IsUnverifiable" ]); header_output += BasicDeclare.subst(gem5OpIop) @@ -52,7 +53,7 @@ let {{ exec_output += PredOpExecute.subst(gem5OpIop) gem5OpIop = ArmInstObjParams("gem5op", "Gem5Op", "PredOp", - { "code": gem5OpCode + \ + { "code": gem5OpCode % "RegABI32" + \ 'R0 = bits(ret, 31, 0);\n' + \ 'R1 = bits(ret, 63, 32);', "predicate_test": predicateTest }, diff --git a/src/arch/arm/tlb.cc b/src/arch/arm/tlb.cc index 5d2ed902d2..91c70884e3 100644 --- a/src/arch/arm/tlb.cc +++ b/src/arch/arm/tlb.cc @@ -47,6 +47,7 @@ #include "arch/arm/faults.hh" #include "arch/arm/isa.hh" #include "arch/arm/pagetable.hh" +#include "arch/arm/reg_abi.hh" #include "arch/arm/self_debug.hh" #include "arch/arm/stage2_lookup.hh" #include "arch/arm/stage2_mmu.hh" @@ -146,9 +147,14 @@ TLB::finalizePhysical(const RequestPtr &req, [func, mode](ThreadContext *tc, PacketPtr pkt) -> Cycles { uint64_t ret; - PseudoInst::pseudoInst(tc, func, ret); + if (inAArch64(tc)) + PseudoInst::pseudoInst(tc, func, ret); + else + PseudoInst::pseudoInst(tc, func, ret); + if (mode == Read) pkt->setLE(ret); + return Cycles(1); } );