add "instr_is_privileged" to power_decoder2 (untested)
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Mon, 8 Jun 2020 22:30:57 +0000 (23:30 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Mon, 8 Jun 2020 22:30:57 +0000 (23:30 +0100)
src/soc/decoder/power_decoder2.py

index 535ce65a3f8740d9fbd56181c86cd91731897597..27cd5fa310b56eb4614af9b19a0b6d162bfd32a5 100644 (file)
@@ -18,6 +18,24 @@ from soc.decoder.power_enums import (InternalOp, CryIn, Function,
 
 from soc.regfile.regfiles import FastRegs
 
+
+def instr_is_privileged(m, op, insn):
+    """determines if the instruction is privileged or not
+    """
+    comb = m.d.comb
+    Signal = is_priv_insn(reset_less=True)
+    with m.Switch(op):
+        with m.Case(InternalOp.OP_ATTN)  : comb += is_priv_insn.eq(1)
+        with m.Case(InternalOp.OP_MFMSR) : comb += is_priv_insn.eq(1)
+        with m.Case(InternalOp.OP_MTMSRD): comb += is_priv_insn.eq(1)
+        with m.Case(InternalOp.OP_RFID)  : comb += is_priv_insn.eq(1)
+        with m.Case(InternalOp.OP_TLBIE) : comb += is_priv_insn.eq(1)
+    with m.If(op == OP_MFSPR | op == OP_MTSPR):
+        with m.If(insn[20]): # field XFX.spr[-1] i think
+            comb += is_priv_insn.eq(1)
+    return is_priv_insn
+
+
 class DecodeA(Elaboratable):
     """DecodeA from instruction