execute1: Fix bug in trace interrupt vs. ITLB miss
authorPaul Mackerras <paulus@ozlabs.org>
Sat, 3 Oct 2020 10:08:11 +0000 (20:08 +1000)
committerPaul Mackerras <paulus@ozlabs.org>
Sat, 3 Oct 2020 10:08:11 +0000 (20:08 +1000)
If an instruction fetch results in an instruction TLB miss, an
OP_FETCH_FAILED instruction is sent down the pipe.  If the MSR[TE]
field is set for instruction tracing, the core currently considers
that executing the OP_FETCH_FAILED counts as having executed one
instruction and so generates a trace interrupt on the next valid
instruction, meaning that the trace interrupt happens before the
desired instruction rather than after it.

Fix this by not tracing OP_FETCH_FAILED instructions.

Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
execute1.vhdl

index 29713b262f145c2c6519babe5febf709065b6bd6..b6387b9d5b3c8c339dd81dd6057892555f80ef5d 100644 (file)
@@ -1124,6 +1124,10 @@ begin
             elsif HAS_FPU and e_in.unit = FPU then
                 fv.valid := '1';
             end if;
+            -- Handling an ITLB miss doesn't count as having executed an instruction
+            if e_in.insn_type = OP_FETCH_FAILED then
+                do_trace := '0';
+            end if;
 
         elsif r.f.redirect = '1' then
             v.e.valid := '1';