From: Ali Saidi Date: Wed, 2 Jun 2010 17:58:13 +0000 (-0500) Subject: ARM: Undef instruction on invalid user CP15 access X-Git-Tag: stable_2012_02_02~1146 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=65a5177b53c53b287125cec3f207afeec648d488;p=gem5.git ARM: Undef instruction on invalid user CP15 access --- diff --git a/src/arch/arm/isa/insts/misc.isa b/src/arch/arm/isa/insts/misc.isa index 2e3fb2031..6cd4437d0 100644 --- a/src/arch/arm/isa/insts/misc.isa +++ b/src/arch/arm/isa/insts/misc.isa @@ -501,15 +501,37 @@ let {{ decoder_output += RegRegImmImmOpConstructor.subst(bfiIop) exec_output += PredOpExecute.subst(bfiIop) + mrc15code = ''' + CPSR cpsr = Cpsr; + if (cpsr.mode == MODE_USER) +#if FULL_SYSTEM + return new UndefinedInstruction; +#else + return new UndefinedInstruction(false, mnemonic); +#endif + Dest = MiscOp1; + ''' + mrc15Iop = InstObjParams("mrc", "Mrc15", "RegRegOp", - { "code": "Dest = MiscOp1;", + { "code": mrc15code, "predicate_test": predicateTest }, []) header_output += RegRegOpDeclare.subst(mrc15Iop) decoder_output += RegRegOpConstructor.subst(mrc15Iop) exec_output += PredOpExecute.subst(mrc15Iop) + + mcr15code = ''' + CPSR cpsr = Cpsr; + if (cpsr.mode == MODE_USER) +#if FULL_SYSTEM + return new UndefinedInstruction; +#else + return new UndefinedInstruction(false, mnemonic); +#endif + MiscDest = Op1; + ''' mcr15Iop = InstObjParams("mcr", "Mcr15", "RegRegOp", - { "code": "MiscDest = Op1;", + { "code": mcr15code, "predicate_test": predicateTest }, []) header_output += RegRegOpDeclare.subst(mcr15Iop) decoder_output += RegRegOpConstructor.subst(mcr15Iop)