[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH SpectreV1+L1TF v6 5/9] 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 the macros are 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 macros 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. Signed-off-by: Norbert Manthey <nmanthey@xxxxxxxxx> --- Notes: v6: Introduce asm nospec.h files Check CONFIG_HVM consistently Extend commit message to explain CONFIG_HVM and new files Fix typos in commit message xen/include/asm-arm/nospec.h | 20 ++++++++++++++++++++ xen/include/asm-x86/nospec.h | 39 +++++++++++++++++++++++++++++++++++++++ xen/include/xen/nospec.h | 1 + 3 files changed, 60 insertions(+) create mode 100644 xen/include/asm-arm/nospec.h create mode 100644 xen/include/asm-x86/nospec.h diff --git a/xen/include/asm-arm/nospec.h b/xen/include/asm-arm/nospec.h new file mode 100644 --- /dev/null +++ b/xen/include/asm-arm/nospec.h @@ -0,0 +1,20 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. */ + +#ifndef _ASM_ARM_NOSPEC_H +#define _ASM_ARM_NOSPEC_H + +#define evaluate_nospec(condition) (condition) + +#define block_speculation() + +#endif /* _ASM_ARM_NOSPEC_H */ + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/include/asm-x86/nospec.h b/xen/include/asm-x86/nospec.h new file mode 100644 --- /dev/null +++ b/xen/include/asm-x86/nospec.h @@ -0,0 +1,39 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. */ + +#ifndef _ASM_X86_NOSPEC_H +#define _ASM_X86_NOSPEC_H + +#include <asm/alternative.h> +#include <asm/system.h> + +/* Allow to insert a read memory barrier into conditionals */ +static always_inline bool arch_barrier_nospec_true(void) +{ +#if defined(CONFIG_HVM) + alternative("", "lfence", X86_FEATURE_SC_L1TF_VULN); +#endif + return true; +} + +/* Allow to protect evaluation of conditionaasl with respect to speculation */ +#if defined(CONFIG_HVM) +#define evaluate_nospec(condition) \ + ((condition) ? arch_barrier_nospec_true() : !arch_barrier_nospec_true()) +#else +#define evaluate_nospec(condition) (condition) +#endif + +/* Allow to block speculative execution in generic code */ +#define block_speculation() (void)arch_barrier_nospec_true() + +#endif /* _ASM_X86_NOSPEC_H */ + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/include/xen/nospec.h b/xen/include/xen/nospec.h --- a/xen/include/xen/nospec.h +++ b/xen/include/xen/nospec.h @@ -8,6 +8,7 @@ #define XEN_NOSPEC_H #include <asm/system.h> +#include <asm/nospec.h> /** * array_index_mask_nospec() - generate a ~0 mask when index < size, 0 otherwise -- 2.7.4 Amazon Development Center Germany GmbH Krausenstr. 38 10117 Berlin Geschaeftsfuehrer: Christian Schlaeger, Ralf Herbrich Ust-ID: DE 289 237 879 Eingetragen am Amtsgericht Charlottenburg HRB 149173 B _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |