提交 62122fd7 编写于 作者: B Borislav Petkov 提交者: H. Peter Anvin

x86, cpufeature: Use new CC_HAVE_ASM_GOTO

... for checking for "asm goto" compiler support. It is more explicit
this way and we cover the cases where distros have backported that
support even to gcc versions < 4.5.
Signed-off-by: NBorislav Petkov <bp@suse.de>
Link: http://lkml.kernel.org/r/1372437701-13351-1-git-send-email-bp@alien8.deSigned-off-by: NH. Peter Anvin <hpa@linux.intel.com>
上级 9f84b626
...@@ -366,9 +366,10 @@ extern bool __static_cpu_has_safe(u16 bit); ...@@ -366,9 +366,10 @@ extern bool __static_cpu_has_safe(u16 bit);
*/ */
static __always_inline __pure bool __static_cpu_has(u16 bit) static __always_inline __pure bool __static_cpu_has(u16 bit)
{ {
#if __GNUC__ > 4 || __GNUC_MINOR__ >= 5 #ifdef CC_HAVE_ASM_GOTO
#ifdef CONFIG_X86_DEBUG_STATIC_CPU_HAS #ifdef CONFIG_X86_DEBUG_STATIC_CPU_HAS
/* /*
* Catch too early usage of this before alternatives * Catch too early usage of this before alternatives
* have run. * have run.
...@@ -384,6 +385,7 @@ static __always_inline __pure bool __static_cpu_has(u16 bit) ...@@ -384,6 +385,7 @@ static __always_inline __pure bool __static_cpu_has(u16 bit)
".previous\n" ".previous\n"
/* skipping size check since replacement size = 0 */ /* skipping size check since replacement size = 0 */
: : "i" (X86_FEATURE_ALWAYS) : : t_warn); : : "i" (X86_FEATURE_ALWAYS) : : t_warn);
#endif #endif
asm goto("1: jmp %l[t_no]\n" asm goto("1: jmp %l[t_no]\n"
...@@ -406,7 +408,9 @@ static __always_inline __pure bool __static_cpu_has(u16 bit) ...@@ -406,7 +408,9 @@ static __always_inline __pure bool __static_cpu_has(u16 bit)
warn_pre_alternatives(); warn_pre_alternatives();
return false; return false;
#endif #endif
#else /* GCC_VERSION >= 40500 */
#else /* CC_HAVE_ASM_GOTO */
u8 flag; u8 flag;
/* Open-coded due to __stringify() in ALTERNATIVE() */ /* Open-coded due to __stringify() in ALTERNATIVE() */
asm volatile("1: movb $0,%0\n" asm volatile("1: movb $0,%0\n"
...@@ -427,7 +431,8 @@ static __always_inline __pure bool __static_cpu_has(u16 bit) ...@@ -427,7 +431,8 @@ static __always_inline __pure bool __static_cpu_has(u16 bit)
".previous\n" ".previous\n"
: "=qm" (flag) : "i" (bit)); : "=qm" (flag) : "i" (bit));
return flag; return flag;
#endif
#endif /* CC_HAVE_ASM_GOTO */
} }
#define static_cpu_has(bit) \ #define static_cpu_has(bit) \
...@@ -441,7 +446,7 @@ static __always_inline __pure bool __static_cpu_has(u16 bit) ...@@ -441,7 +446,7 @@ static __always_inline __pure bool __static_cpu_has(u16 bit)
static __always_inline __pure bool _static_cpu_has_safe(u16 bit) static __always_inline __pure bool _static_cpu_has_safe(u16 bit)
{ {
#if __GNUC__ > 4 || __GNUC_MINOR__ >= 5 #ifdef CC_HAVE_ASM_GOTO
/* /*
* We need to spell the jumps to the compiler because, depending on the offset, * We need to spell the jumps to the compiler because, depending on the offset,
* the replacement jump can be bigger than the original jump, and this we cannot * the replacement jump can be bigger than the original jump, and this we cannot
...@@ -475,7 +480,7 @@ static __always_inline __pure bool _static_cpu_has_safe(u16 bit) ...@@ -475,7 +480,7 @@ static __always_inline __pure bool _static_cpu_has_safe(u16 bit)
return false; return false;
t_dynamic: t_dynamic:
return __static_cpu_has_safe(bit); return __static_cpu_has_safe(bit);
#else /* GCC_VERSION >= 40500 */ #else
u8 flag; u8 flag;
/* Open-coded due to __stringify() in ALTERNATIVE() */ /* Open-coded due to __stringify() in ALTERNATIVE() */
asm volatile("1: movb $2,%0\n" asm volatile("1: movb $2,%0\n"
...@@ -511,7 +516,7 @@ static __always_inline __pure bool _static_cpu_has_safe(u16 bit) ...@@ -511,7 +516,7 @@ static __always_inline __pure bool _static_cpu_has_safe(u16 bit)
: "=qm" (flag) : "=qm" (flag)
: "i" (bit), "i" (X86_FEATURE_ALWAYS)); : "i" (bit), "i" (X86_FEATURE_ALWAYS));
return (flag == 2 ? __static_cpu_has_safe(bit) : flag); return (flag == 2 ? __static_cpu_has_safe(bit) : flag);
#endif #endif /* CC_HAVE_ASM_GOTO */
} }
#define static_cpu_has_safe(bit) \ #define static_cpu_has_safe(bit) \
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册