arch: Use a fault to trigger system calls in SE mode.
authorGabe Black <gabeblack@google.com>
Mon, 24 Aug 2020 08:36:53 +0000 (01:36 -0700)
committerGabe Black <gabeblack@google.com>
Thu, 3 Sep 2020 10:07:15 +0000 (10:07 +0000)
commit7aa9591151b10036d77e19d098638129ca88c174
tree54723e144e415f659c38f7674ccc36b3f7dc5af7
parent13cd5b215be009de27b709117afac54753e29ed6
arch: Use a fault to trigger system calls in SE mode.

When the system call happens during the execution of the system call
instruction, it can be ambiguous what state takes precedence, the state
update from the instruction or the system call. These may be tracked
differently and found in an unpredictable order in, for example, the O3
CPU. An instruction can avoid updating any state explicitly, but
implicitly updated state (specifically the PC) will always update,
whether the instruction wants it to or not.

If the system call can be deferred by using a Fault object, then it's no
longer ambiguous. The PC update will be discarded, and the system call
can set the PC however it likes. Because there is no implicit PC update,
the PC needs to be walked forward, either to what it would have been
anyway, or to what the system call set in NPC.

In addition, because of the existing semantics around handling Faults,
the instruction no longer needs to be marked as serializing,
non-speculative, etc.

The "normal", aka architectural, aka FS version of the system call
instructions don't return a Fault artificially.

Change-Id: I72011a16a89332b1dcfb01c79f2f0d75c55ab773
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/33281
Maintainer: Gabe Black <gabeblack@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
src/arch/mips/isa/decoder.isa
src/arch/power/isa/decoder.isa
src/arch/x86/isa/decoder/one_byte_opcodes.isa
src/arch/x86/isa/decoder/two_byte_opcodes.isa
src/sim/faults.cc
src/sim/faults.hh