diff --git a/src/arch/arm/isa/formats/aarch64.isa b/src/arch/arm/isa/formats/aarch64.isa index c7339c6e50..9574012090 100644 --- a/src/arch/arm/isa/formats/aarch64.isa +++ b/src/arch/arm/isa/formats/aarch64.isa @@ -407,7 +407,8 @@ namespace Aarch64 case 0x0: // OuterShareable case 0x2: // InnerShareable case 0x3: // FullSystem - return new Dsb64Shareable(machInst); + return new Dsb64Shareable( + machInst, dec.dvmEnabled); default: GEM5_UNREACHABLE; } diff --git a/src/arch/arm/isa/insts/misc64.isa b/src/arch/arm/isa/insts/misc64.isa index 9151b886b8..f98d8949b0 100644 --- a/src/arch/arm/isa/insts/misc64.isa +++ b/src/arch/arm/isa/insts/misc64.isa @@ -179,12 +179,29 @@ let {{ decoder_output += BasicConstructor64.subst(dsbLocalIop) exec_output += BasicExecute.subst(dsbLocalIop) - dsbShareableIop = ArmInstObjParams("dsb", "Dsb64Shareable", "ArmStaticInst", "", + dvmCode = ''' + if (dvmEnabled) { + Request::Flags memAccessFlags = + Request::STRICT_ORDER|Request::TLBI_SYNC; + + if (!PendingDvm) { + memAccessFlags = memAccessFlags | Request::NO_ACCESS; + } + + fault = xc->initiateSpecialMemCmd(memAccessFlags); + + PendingDvm = false; + } + ''' + dsbShareableIop = ArmInstObjParams("dsb", "Dsb64Shareable", "ArmStaticInst", + { "code" : "", "dvm_code" : dvmCode }, ['IsReadBarrier', 'IsWriteBarrier', - 'IsSerializeAfter']) - header_output += BasicDeclare.subst(dsbShareableIop) - decoder_output += BasicConstructor64.subst(dsbShareableIop) + 'IsSerializeAfter']) + header_output += DvmDeclare.subst(dsbShareableIop) + decoder_output += DvmConstructor.subst(dsbShareableIop) exec_output += BasicExecute.subst(dsbShareableIop) + exec_output += DvmInitiateAcc.subst(dsbShareableIop) + exec_output += DvmCompleteAcc.subst(dsbShareableIop) dmbIop = ArmInstObjParams("dmb", "Dmb64", "ArmStaticInst", "", ['IsReadBarrier', 'IsWriteBarrier'])