i386: Allow KVM on i386 nonpae

Currently, CONFIG_X86_CMPXCHG64 both enables boot-time checking of
the cmpxchg64b feature and enables compilation of the set_64bit() family.
Since the option is dependent on PAE, and since KVM depends on set_64bit(),
this effectively disables KVM on i386 nopae.

Simplify by removing the config option altogether: the boot check is made
dependent on CONFIG_X86_PAE directly, and the set_64bit() family is exposed
without constraints. It is up to users to check for the feature flag (KVM
does not as virtualiation extensions imply its existence).

Signed-off-by: Avi Kivity <avi@qumranet.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by Avi Kivity and committed by Linus Torvalds 2d9ce177 3e1f900b

+6 -18
-5
arch/i386/Kconfig.cpu
··· 297 297 depends on !M386 298 298 default y 299 299 300 - config X86_CMPXCHG64 301 - bool 302 - depends on X86_PAE 303 - default y 304 - 305 300 config X86_ALIGNMENT_16 306 301 bool 307 302 depends on MWINCHIP3D || MWINCHIP2 || MWINCHIPC6 || MCYRIXIII || X86_ELAN || MK6 || M586MMX || M586TSC || M586 || M486 || MVIAC3_2 || MGEODEGX1
-1
arch/i386/defconfig
··· 166 166 CONFIG_X86_INVLPG=y 167 167 CONFIG_X86_BSWAP=y 168 168 CONFIG_X86_POPAD_OK=y 169 - CONFIG_X86_CMPXCHG64=y 170 169 CONFIG_X86_GOOD_APIC=y 171 170 CONFIG_X86_INTEL_USERCOPY=y 172 171 CONFIG_X86_USE_PPRO_CHECKSUM=y
-1
arch/um/defconfig
··· 52 52 CONFIG_X86_INVLPG=y 53 53 CONFIG_X86_BSWAP=y 54 54 CONFIG_X86_POPAD_OK=y 55 - CONFIG_X86_CMPXCHG64=y 56 55 CONFIG_X86_GOOD_APIC=y 57 56 CONFIG_X86_USE_PPRO_CHECKSUM=y 58 57 CONFIG_X86_TSC=y
-1
drivers/kvm/Kconfig
··· 11 11 config KVM 12 12 tristate "Kernel-based Virtual Machine (KVM) support" 13 13 depends on X86 && EXPERIMENTAL 14 - depends on X86_CMPXCHG64 || 64BIT 15 14 ---help--- 16 15 Support hosting fully virtualized guest machines using hardware 17 16 virtualization extensions. You will need a fairly recent
+5 -9
include/asm-i386/cmpxchg.h
··· 3 3 4 4 #include <linux/bitops.h> /* for LOCK_PREFIX */ 5 5 6 + /* 7 + * Note: if you use set64_bit(), __cmpxchg64(), or their variants, you 8 + * you need to test for the feature in boot_cpu_data. 9 + */ 10 + 6 11 #define xchg(ptr,v) ((__typeof__(*(ptr)))__xchg((unsigned long)(v),(ptr),sizeof(*(ptr)))) 7 12 8 13 struct __xchg_dummy { unsigned long a[100]; }; 9 14 #define __xg(x) ((struct __xchg_dummy *)(x)) 10 - 11 - 12 - #ifdef CONFIG_X86_CMPXCHG64 13 15 14 16 /* 15 17 * The semantics of XCHGCMP8B are a bit strange, this is why ··· 66 64 (__builtin_constant_p(value) ? \ 67 65 __set_64bit(ptr, (unsigned int)(value), (unsigned int)((value)>>32ULL) ) : \ 68 66 __set_64bit(ptr, ll_low(value), ll_high(value)) ) 69 - 70 - #endif 71 67 72 68 /* 73 69 * Note: no "lock" prefix even on SMP: xchg always implies lock anyway ··· 252 252 }) 253 253 #endif 254 254 255 - #ifdef CONFIG_X86_CMPXCHG64 256 - 257 255 static inline unsigned long long __cmpxchg64(volatile void *ptr, unsigned long long old, 258 256 unsigned long long new) 259 257 { ··· 286 288 #define cmpxchg64_local(ptr,o,n)\ 287 289 ((__typeof__(*(ptr)))__cmpxchg64_local((ptr),(unsigned long long)(o),\ 288 290 (unsigned long long)(n))) 289 - #endif 290 - 291 291 #endif
+1 -1
include/asm-i386/required-features.h
··· 29 29 # define NEED_CMOV 0 30 30 #endif 31 31 32 - #ifdef CONFIG_X86_CMPXCHG64 32 + #ifdef CONFIG_X86_PAE 33 33 # define NEED_CX8 (1<<(X86_FEATURE_CX8 & 31)) 34 34 #else 35 35 # define NEED_CX8 0