[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] arch: move array_index_mask_nospec()
commit 9174674c3b4ad5f4a0a0401da25cb27e343b2b38 Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Mon Mar 4 10:45:10 2024 +0100 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Mon Mar 4 10:45:10 2024 +0100 arch: move array_index_mask_nospec() At the time they were introduced, there were no asm/nospec.h yet, so they were placed in system.h. Move them to nospec.h and drop xen/nospec.h's including of asm/system.h; there's one unrelated #include that needs adding in exchange, on x86. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Acked-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Acked-by: Julien Grall <jgrall@xxxxxxxxxx> --- xen/arch/arm/include/asm/arm32/nospec.h | 31 +++++++++++++++++++++++++++++ xen/arch/arm/include/asm/arm32/system.h | 18 ----------------- xen/arch/arm/include/asm/arm64/nospec.h | 35 +++++++++++++++++++++++++++++++++ xen/arch/arm/include/asm/arm64/system.h | 22 --------------------- xen/arch/arm/include/asm/nospec.h | 8 ++++++++ xen/arch/x86/include/asm/nospec.h | 24 ++++++++++++++++++++++ xen/arch/x86/include/asm/system.h | 24 ---------------------- xen/arch/x86/include/asm/x86_emulate.h | 1 + xen/include/xen/nospec.h | 1 - 9 files changed, 99 insertions(+), 65 deletions(-) diff --git a/xen/arch/arm/include/asm/arm32/nospec.h b/xen/arch/arm/include/asm/arm32/nospec.h new file mode 100644 index 0000000000..be3c7712c8 --- /dev/null +++ b/xen/arch/arm/include/asm/arm32/nospec.h @@ -0,0 +1,31 @@ +/* Portions taken from Linux arch arm */ +#ifndef __ASM_ARM32_NOSPEC_H +#define __ASM_ARM32_NOSPEC_H + +#define CSDB ".inst 0xe320f014" + +static inline unsigned long array_index_mask_nospec(unsigned long idx, + unsigned long sz) +{ + unsigned long mask; + + asm volatile( "cmp %1, %2\n" + "sbc %0, %1, %1\n" + CSDB + : "=r" (mask) + : "r" (idx), "Ir" (sz) + : "cc" ); + + return mask; +} +#define array_index_mask_nospec array_index_mask_nospec + +#endif /* __ASM_ARM32_NOSPEC_H */ +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/arch/arm/include/asm/arm32/system.h b/xen/arch/arm/include/asm/arm32/system.h index ab57abfbc5..c617b40438 100644 --- a/xen/arch/arm/include/asm/arm32/system.h +++ b/xen/arch/arm/include/asm/arm32/system.h @@ -48,24 +48,6 @@ static inline int local_fiq_is_enabled(void) return !(flags & PSR_FIQ_MASK); } -#define CSDB ".inst 0xe320f014" - -static inline unsigned long array_index_mask_nospec(unsigned long idx, - unsigned long sz) -{ - unsigned long mask; - - asm volatile( "cmp %1, %2\n" - "sbc %0, %1, %1\n" - CSDB - : "=r" (mask) - : "r" (idx), "Ir" (sz) - : "cc" ); - - return mask; -} -#define array_index_mask_nospec array_index_mask_nospec - #endif /* * Local variables: diff --git a/xen/arch/arm/include/asm/arm64/nospec.h b/xen/arch/arm/include/asm/arm64/nospec.h new file mode 100644 index 0000000000..2364ca692b --- /dev/null +++ b/xen/arch/arm/include/asm/arm64/nospec.h @@ -0,0 +1,35 @@ +/* Portions taken from Linux arch arm64 */ +#ifndef __ASM_ARM64_NOSPEC_H +#define __ASM_ARM64_NOSPEC_H + +#define csdb() asm volatile ( "hint #20" : : : "memory" ) + +/* + * Generate a mask for array_index__nospec() that is ~0UL when 0 <= idx < sz + * and 0 otherwise. + */ +static inline unsigned long array_index_mask_nospec(unsigned long idx, + unsigned long sz) +{ + unsigned long mask; + + asm volatile ( "cmp %1, %2\n" + "sbc %0, xzr, xzr\n" + : "=r" (mask) + : "r" (idx), "Ir" (sz) + : "cc" ); + csdb(); + + return mask; +} +#define array_index_mask_nospec array_index_mask_nospec + +#endif /* __ASM_ARM64_NOSPEC_H */ +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/arch/arm/include/asm/arm64/system.h b/xen/arch/arm/include/asm/arm64/system.h index 2e36573ac6..2e2ee212a1 100644 --- a/xen/arch/arm/include/asm/arm64/system.h +++ b/xen/arch/arm/include/asm/arm64/system.h @@ -58,28 +58,6 @@ static inline int local_fiq_is_enabled(void) return !(flags & PSR_FIQ_MASK); } -#define csdb() asm volatile ( "hint #20" : : : "memory" ) - -/* - * Generate a mask for array_index__nospec() that is ~0UL when 0 <= idx < sz - * and 0 otherwise. - */ -static inline unsigned long array_index_mask_nospec(unsigned long idx, - unsigned long sz) -{ - unsigned long mask; - - asm volatile ( "cmp %1, %2\n" - "sbc %0, xzr, xzr\n" - : "=r" (mask) - : "r" (idx), "Ir" (sz) - : "cc" ); - csdb(); - - return mask; -} -#define array_index_mask_nospec array_index_mask_nospec - #endif /* * Local variables: diff --git a/xen/arch/arm/include/asm/nospec.h b/xen/arch/arm/include/asm/nospec.h index 51c7aea4f4..efac51fc03 100644 --- a/xen/arch/arm/include/asm/nospec.h +++ b/xen/arch/arm/include/asm/nospec.h @@ -4,6 +4,14 @@ #ifndef _ASM_ARM_NOSPEC_H #define _ASM_ARM_NOSPEC_H +#if defined(CONFIG_ARM_32) +# include <asm/arm32/nospec.h> +#elif defined(CONFIG_ARM_64) +# include <asm/arm64/nospec.h> +#else +# error "unknown ARM variant" +#endif + static inline bool evaluate_nospec(bool condition) { return condition; diff --git a/xen/arch/x86/include/asm/nospec.h b/xen/arch/x86/include/asm/nospec.h index 7150e76b87..07606834c4 100644 --- a/xen/arch/x86/include/asm/nospec.h +++ b/xen/arch/x86/include/asm/nospec.h @@ -38,6 +38,30 @@ static always_inline void block_speculation(void) barrier_nospec_true(); } +/** + * array_index_mask_nospec() - generate a mask that is ~0UL when the + * bounds check succeeds and 0 otherwise + * @index: array element index + * @size: number of elements in array + * + * Returns: + * 0 - (index < size) + */ +static inline unsigned long array_index_mask_nospec(unsigned long index, + unsigned long size) +{ + unsigned long mask; + + asm volatile ( "cmp %[size], %[index]; sbb %[mask], %[mask];" + : [mask] "=r" (mask) + : [size] "g" (size), [index] "r" (index) ); + + return mask; +} + +/* Override default implementation in nospec.h. */ +#define array_index_mask_nospec array_index_mask_nospec + #endif /* _ASM_X86_NOSPEC_H */ /* diff --git a/xen/arch/x86/include/asm/system.h b/xen/arch/x86/include/asm/system.h index debf6bfa17..73cb16ca68 100644 --- a/xen/arch/x86/include/asm/system.h +++ b/xen/arch/x86/include/asm/system.h @@ -224,30 +224,6 @@ static always_inline unsigned long __xadd( #define smp_mb__before_atomic() do { } while (0) #define smp_mb__after_atomic() do { } while (0) -/** - * array_index_mask_nospec() - generate a mask that is ~0UL when the - * bounds check succeeds and 0 otherwise - * @index: array element index - * @size: number of elements in array - * - * Returns: - * 0 - (index < size) - */ -static inline unsigned long array_index_mask_nospec(unsigned long index, - unsigned long size) -{ - unsigned long mask; - - asm volatile ( "cmp %[size], %[index]; sbb %[mask], %[mask];" - : [mask] "=r" (mask) - : [size] "g" (size), [index] "r" (index) ); - - return mask; -} - -/* Override default implementation in nospec.h. */ -#define array_index_mask_nospec array_index_mask_nospec - #define local_irq_disable() asm volatile ( "cli" : : : "memory" ) #define local_irq_enable() asm volatile ( "sti" : : : "memory" ) diff --git a/xen/arch/x86/include/asm/x86_emulate.h b/xen/arch/x86/include/asm/x86_emulate.h index c184c0053c..2b75f7f8e2 100644 --- a/xen/arch/x86/include/asm/x86_emulate.h +++ b/xen/arch/x86/include/asm/x86_emulate.h @@ -15,6 +15,7 @@ #include <xen/types.h> #include <xen/lib.h> #include <asm/regs.h> +#include <asm/x86-defns.h> #include "../../x86_emulate/x86_emulate.h" diff --git a/xen/include/xen/nospec.h b/xen/include/xen/nospec.h index 76255bc46e..4c250ebbd6 100644 --- a/xen/include/xen/nospec.h +++ b/xen/include/xen/nospec.h @@ -7,7 +7,6 @@ #ifndef XEN_NOSPEC_H #define XEN_NOSPEC_H -#include <asm/system.h> #include <asm/nospec.h> /** -- generated by git-patchbot for /home/xen/git/xen.git#staging
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |