arch-x86: Make LFENCE a serializing instruction
authorIsaac Richter <isaac.richter@rochester.edu>
Fri, 30 Mar 2018 14:01:11 +0000 (10:01 -0400)
committerJason Lowe-Power <jason@lowepower.com>
Tue, 15 Oct 2019 16:02:46 +0000 (16:02 +0000)
According to the Intel SDM, no instruction following an LFENCE can begin
execution until after the LFENCE has executed. (This is
less strict than an actual serializing instruction, such as CPUID.)

Serializing instructions (per intel SDM Volume 3A Chapter 8.3) ensure
that no future instruction is fetched until after the serializing
instruction is completed.

By contrast, LFENCE (and other memory-ordering instructions) allows
future instructions to have been fetched; it just prohibits them from
being executed.

Change-Id: If89fcb552192326ab69a581f57d71c95cf5d90e7
Signed-off-by: Isaac Richter <isaac.richter@rochester.edu>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/10321
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Maintainer: Jason Lowe-Power <jason@lowepower.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/arch/x86/isa/decoder/two_byte_opcodes.isa

index dfb748efbc7815aa362a22e094b7f3c7b92364f8..1e0924382cbcffbf0faccc9108078ab51796e760 100644 (file)
             0x6: decode MODRM_MOD {
                 0x3: decode MODRM_REG {
                     0x5: BasicOperate::LFENCE(
-                                 {{/*Nothing*/}}, IsReadBarrier);
+                                 {{/*Nothing*/}}, IsReadBarrier,
+                                 IsSerializeAfter);
                     0x6: BasicOperate::MFENCE(
                                  {{/*Nothing*/}}, IsMemBarrier);
                     0x7: BasicOperate::SFENCE(