execute1: Don't execute ld/st instruction when taking interrupt
authorPaul Mackerras <paulus@ozlabs.org>
Wed, 22 Apr 2020 03:54:38 +0000 (13:54 +1000)
committerPaul Mackerras <paulus@ozlabs.org>
Wed, 22 Apr 2020 03:59:05 +0000 (13:59 +1000)
This fixes a bug in the logic where we would still send a load
or store instruction to loadstore1 even though we have decided
to take an asynchronous interrupt.

Reported-by: Michael Neuling <mikey@neuling.org>
Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
execute1.vhdl

index 6915a43132a9464532e5175497368672d1e6241b..2c0a558950e2e66d0b4e83013ed9366fe7cc682e 100644 (file)
@@ -248,6 +248,7 @@ begin
 
        v := r;
        v.e := Execute1ToWritebackInit;
+        lv := Execute1ToLoadstore1Init;
 
        -- XER forwarding. To avoid having to track XER hazards, we
        -- use the previously latched value.
@@ -773,6 +774,7 @@ begin
             when OP_LOAD | OP_STORE =>
                 -- loadstore/dcache has its own port to writeback
                 v.e.valid := '0';
+                lv.valid := '1';
 
             when others =>
                terminate_out <= '1';
@@ -865,10 +867,6 @@ begin
        v.e.write_enable := result_en;
 
         -- Outputs to loadstore1 (async)
-        lv := Execute1ToLoadstore1Init;
-        if e_in.valid = '1' and (e_in.insn_type = OP_LOAD or e_in.insn_type = OP_STORE) then
-            lv.valid := '1';
-        end if;
         if e_in.insn_type = OP_LOAD then
             lv.load := '1';
         end if;