nospec: introduce evaluate_nospec
authorNorbert Manthey <nmanthey@amazon.de>
Thu, 14 Mar 2019 12:55:00 +0000 (13:55 +0100)
committerJan Beulich <jbeulich@suse.com>
Fri, 5 Apr 2019 10:13:12 +0000 (12:13 +0200)
commitdb591d6e76ed33750039e44a75108809681ed672
tree966996d09edda394e2cd2b844eda92b0eff37604
parent3860d5534df401204ccf67cc5bbd2f7368b9bfaf
nospec: introduce evaluate_nospec

Since the L1TF vulnerability of Intel CPUs, loading hypervisor data into
L1 cache is problematic, because when hyperthreading is used as well, a
guest running on the sibling core can leak this potentially secret data.

To prevent these speculative accesses, we block speculation after
accessing the domain property field by adding lfence instructions. This
way, the CPU continues executing and loading data only once the condition
is actually evaluated.

As this protection is typically used in if statements, the lfence has to
come in a compatible way. Therefore, a function that returns true after an
lfence instruction is introduced. To protect both branches after a
conditional, an lfence instruction has to be added for the two branches.
To be able to block speculation after several evaluations, the generic
barrier macro block_speculation is also introduced.

As the L1TF vulnerability is only present on the x86 architecture, there is
no need to add protection for other architectures. Hence, the introduced
functions are defined but empty.

On the x86 architecture, by default, the lfence instruction is not present
either. Only when a L1TF vulnerable platform is detected, the lfence
instruction is patched in via alternative patching. Similarly, PV guests
are protected wrt L1TF by default, so that the protection is furthermore
disabled in case HVM is exclueded via the build configuration.

Introducing the lfence instructions catches a lot of potential leaks with
a simple unintrusive code change. During performance testing, we did not
notice performance effects.

This is part of the speculative hardening effort.

Signed-off-by: Norbert Manthey <nmanthey@amazon.de>
Acked-by: Julien Grall <julien.grall@arm.com>
Acked-by: Jan Beulich <jbeulich@suse.com>
xen/include/asm-arm/nospec.h [new file with mode: 0644]
xen/include/asm-x86/nospec.h [new file with mode: 0644]
xen/include/xen/nospec.h