Used the Priv and new HPriv instruction formats, which have been tweaked to let some...
authorGabe Black <gblack@eecs.umich.edu>
Mon, 29 May 2006 03:49:29 +0000 (23:49 -0400)
committerGabe Black <gblack@eecs.umich.edu>
Mon, 29 May 2006 03:49:29 +0000 (23:49 -0400)
--HG--
extra : convert_revision : efee709cbab706bdb8ef7010ce153cd75a0a2ec6

src/arch/sparc/isa/decoder.isa
src/arch/sparc/isa/formats/priv.isa

index fa883292010b40c9ecb2fc1016168fff30b0b31b..788e455d8126347d5bc65b1034696a21942f76a6 100644 (file)
@@ -325,12 +325,12 @@ decode OP default Unknown::unknown()
             0x28: rdasr({{
                 Rd = xc->readMiscRegWithEffect(RS1 + AsrStart, fault);
             }});
-            0x29: rdhpr({{
+            0x29: HPriv::rdhpr({{
                 // XXX Need to protect with format that traps non-priv/priv
                 // access
                 Rd = xc->readMiscRegWithEffect(RS1 + HprStart, fault);
             }});
-            0x2A: rdpr({{
+            0x2A: Priv::rdpr({{
                 // XXX Need to protect with format that traps non-priv
                 // access
                 Rd = xc->readMiscRegWithEffect(RS1 + PrStart, fault);
@@ -397,15 +397,15 @@ decode OP default Unknown::unknown()
                 0x0: BasicOperate::saved({{/*Boogy Boogy*/}});
                 0x1: BasicOperate::restored({{/*Boogy Boogy*/}});
             }
-            0x32: wrpr({{
+            0x32: Priv::wrpr({{
                 // XXX Need to protect with format that traps non-priv
                 // access
-                xc->setMiscRegWithEffect(RD + PrStart, Rs1 ^ Rs2_or_imm13);
+                fault = xc->setMiscRegWithEffect(RD + PrStart, Rs1 ^ Rs2_or_imm13);
             }});
-            0x33: wrhpr({{
+            0x33: HPriv::wrhpr({{
                 // XXX Need to protect with format that traps non-priv/priv
                 // access
-                xc->setMiscRegWithEffect(RD + HprStart, Rs1 ^ Rs2_or_imm13);
+                fault = xc->setMiscRegWithEffect(RD + HprStart, Rs1 ^ Rs2_or_imm13);
             }});
             0x34: Trap::fpop1({{fault = new FpDisabled;}});
             0x35: Trap::fpop2({{fault = new FpDisabled;}});
@@ -549,7 +549,7 @@ decode OP default Unknown::unknown()
                     NNPC = Tnpc + 4;
                     Tl = Tl - 1;
                 }});
-                0x1: BasicOperate::retry({{
+                0x1: Priv::retry({{
                     if(Tl == 0)
                         return new IllegalInstruction;
                     Cwp = Tstate<4:0>;
index 7df59d736eefd58f5b67681bfa05dc1fc626ca91..56b78833ac8936dab408a72c32c6afc750397d11 100644 (file)
@@ -87,9 +87,10 @@ def template PrivExecute {{
         if(%(check)s)
             return new PrivilegedAction;
 
+        Fault fault = NoFault;
         %(code)s;
         %(op_wb)s;
-        return NoFault;
+        return fault;
     }
 }};
 
@@ -116,10 +117,17 @@ let {{
 
 // Primary format for integer operate instructions:
 def format Priv(code, *opt_flags) {{
-        checkCode = "((xc->readMiscReg(PrStart + MISCREG_PSTATE))<2:2>)"
+        checkCode = '''((xc->readMiscReg(PrStart + MISCREG_PSTATE))<2:2>) ||
+                        ((xc->readMiscReg(HprStart + MISCREG_HPSTATE))<2:2>)'''
         (header_output, decoder_output,
          exec_output, decode_block) = doPrivFormat(code,
              checkCode, name, Name, opt_flags)
 }};
 
+def format HPriv(code, *opt_flags) {{
+        checkCode = "((xc->readMiscReg(HprStart + MISCREG_HPSTATE))<2:2>)"
+        (header_output, decoder_output,
+         exec_output, decode_block) = doPrivFormat(code,
+             checkCode, name, Name, opt_flags)
+}};