|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 1/2] xen/*/nospec: Provide common versions of evaluate_nospec/block_speculation
It is daft to require all architectures to provide empty implementations of
this functionality.
Provide evaluate_nospec() and block_speculation() unconditionally in
xen/nospec.h with architectures able to opt in by providing suitable arch
variants.
Rename x86's implementation to the arch_*() variants.
No functional change.
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
CC: Jan Beulich <JBeulich@xxxxxxxx>
CC: Roger Pau Monné <roger.pau@xxxxxxxxxx>
CC: Wei Liu <wl@xxxxxxx>
CC: Stefano Stabellini <sstabellini@xxxxxxxxxx>
CC: Julien Grall <julien@xxxxxxx>
CC: Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx>
CC: Bertrand Marquis <bertrand.marquis@xxxxxxx>
CC: Michal Orzel <michal.orzel@xxxxxxx>
CC: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx>
CC: Shawn Anastasio <sanastasio@xxxxxxxxxxxxxxxxxxxxx>
---
xen/arch/arm/include/asm/nospec.h | 9 ---------
xen/arch/ppc/include/asm/nospec.h | 9 ---------
xen/arch/riscv/include/asm/nospec.h | 9 ---------
xen/arch/x86/include/asm/nospec.h | 8 ++++----
xen/include/xen/nospec.h | 23 +++++++++++++++++++++++
5 files changed, 27 insertions(+), 31 deletions(-)
diff --git a/xen/arch/arm/include/asm/nospec.h
b/xen/arch/arm/include/asm/nospec.h
index efac51fc03be..05df096faab0 100644
--- a/xen/arch/arm/include/asm/nospec.h
+++ b/xen/arch/arm/include/asm/nospec.h
@@ -12,15 +12,6 @@
# error "unknown ARM variant"
#endif
-static inline bool evaluate_nospec(bool condition)
-{
- return condition;
-}
-
-static inline void block_speculation(void)
-{
-}
-
#endif /* _ASM_ARM_NOSPEC_H */
/*
diff --git a/xen/arch/ppc/include/asm/nospec.h
b/xen/arch/ppc/include/asm/nospec.h
index b97322e48d32..9b57a7e4b24d 100644
--- a/xen/arch/ppc/include/asm/nospec.h
+++ b/xen/arch/ppc/include/asm/nospec.h
@@ -3,13 +3,4 @@
#ifndef __ASM_PPC_NOSPEC_H__
#define __ASM_PPC_NOSPEC_H__
-static inline bool evaluate_nospec(bool condition)
-{
- return condition;
-}
-
-static inline void block_speculation(void)
-{
-}
-
#endif /* __ASM_PPC_NOSPEC_H__ */
diff --git a/xen/arch/riscv/include/asm/nospec.h
b/xen/arch/riscv/include/asm/nospec.h
index e30f0a781b68..b227fc61ed8b 100644
--- a/xen/arch/riscv/include/asm/nospec.h
+++ b/xen/arch/riscv/include/asm/nospec.h
@@ -4,15 +4,6 @@
#ifndef _ASM_RISCV_NOSPEC_H
#define _ASM_RISCV_NOSPEC_H
-static inline bool evaluate_nospec(bool condition)
-{
- return condition;
-}
-
-static inline void block_speculation(void)
-{
-}
-
#endif /* _ASM_RISCV_NOSPEC_H */
/*
diff --git a/xen/arch/x86/include/asm/nospec.h
b/xen/arch/x86/include/asm/nospec.h
index 07606834c4c9..defc97707f03 100644
--- a/xen/arch/x86/include/asm/nospec.h
+++ b/xen/arch/x86/include/asm/nospec.h
@@ -23,20 +23,20 @@ static always_inline bool barrier_nospec_false(void)
return false;
}
-/* Allow to protect evaluation of conditionals with respect to speculation */
-static always_inline bool evaluate_nospec(bool condition)
+static always_inline bool arch_evaluate_nospec(bool condition)
{
if ( condition )
return barrier_nospec_true();
else
return barrier_nospec_false();
}
+#define arch_evaluate_nospec arch_evaluate_nospec
-/* Allow to block speculative execution in generic code */
-static always_inline void block_speculation(void)
+static always_inline void arch_block_speculation(void)
{
barrier_nospec_true();
}
+#define arch_block_speculation arch_block_speculation
/**
* array_index_mask_nospec() - generate a mask that is ~0UL when the
diff --git a/xen/include/xen/nospec.h b/xen/include/xen/nospec.h
index 4c250ebbd663..a4155af08770 100644
--- a/xen/include/xen/nospec.h
+++ b/xen/include/xen/nospec.h
@@ -9,6 +9,29 @@
#include <asm/nospec.h>
+/*
+ * Protect a conditional branch from bad speculation. Architectures *must*
+ * provide arch_evaluate_nospec() for this to be effective.
+ */
+static always_inline bool evaluate_nospec(bool cond)
+{
+#ifndef arch_evaluate_nospec
+#define arch_evaluate_nospec(cond) cond
+#endif
+ return arch_evaluate_nospec(cond);
+}
+
+/*
+ * Halt speculation unconditonally. Architectures *must* provide
+ * arch_block_speculation() for this to be effective.
+ */
+static always_inline void block_speculation(void)
+{
+#ifdef arch_block_speculation
+ arch_block_speculation();
+#endif
+}
+
/**
* array_index_mask_nospec() - generate a ~0 mask when index < size, 0
otherwise
* @index: array element index
--
2.30.2
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |