ARM: Undef instruction on invalid user CP15 access
authorAli Saidi <Ali.Saidi@ARM.com>
Wed, 2 Jun 2010 17:58:13 +0000 (12:58 -0500)
committerAli Saidi <Ali.Saidi@ARM.com>
Wed, 2 Jun 2010 17:58:13 +0000 (12:58 -0500)
src/arch/arm/isa/insts/misc.isa

index 2e3fb2031a443af8f7b485ea9b3055c1656c6eab..6cd4437d042108044fb55e36765aee7eb0611ab8 100644 (file)
@@ -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)