[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH] 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> --- /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: + */ --- 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(v 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: --- /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: + */ --- 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(v 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: --- 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; --- 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_speculat 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 */ /* --- 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 __xad #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" ) --- 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" --- 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> /**
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |