Skip to content

5. Faults travel with the instruction and are taken at commit

Context. An instruction that faulted at execute marked its ROB entry and squashed everything younger from execute; commit then flushed again when it took the trap. On O3 a trap-carrying result from a non-memory unit completed its ROB entry without faulting it, so debug-trigger breakpoints were lost.

Decision. A fault raised at execute (illegal instruction, ECALL, a debug trigger, or a trap carried from fetch or decode) travels on the execute result. Writeback records it on the ROB entry, and commit takes it and flushes everything younger once, as a real core and gem5 do. The same holds for both backends.

Consequences. Instructions younger than a fault may execute before it is taken; they never retire. A fault costs one flush instead of two. Regression tests: tests/integration/execute_trigger.rs, fault_precedence.rs, trap_latency.rs.