x86/asm changes for v4.7
Subsystems (31)
Linus,
Please pull the latest x86-asm-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86-asm-for-linus
# HEAD: 4afd0565552c87f23834db9121dd9cf6955d0b43 x86/arch_prctl/64: Restore accidentally removed put_cpu() in ARCH_SET_GS
The main changes in this cycle were:
- MSR access API fixes and enhancements (Andy Lutomirski)
- early exception handling improvements (Andy Lutomirski)
- user-space FS/GS prctl usage fixes and improvements (Andy Lutomirski)
- Remove the cpu_has_*() APIs and replace them with equivalents (Borislav Petkov)
- task switch micro-optimization (Brian Gerst)
- 32-bit entry code simplification (Denys Vlasenko)
- enhance PAT handling in enumated CPUs (Toshi Kani)
- ... and lots of other cleanups/fixlets.
out-of-topic modifications in x86-asm-for-linus:
--------------------------------------------------
arch/ia64/include/asm/iommu.h # 62436a4d36c9: x86/cpufeature: Remove cpu_h drivers/cpufreq/longhaul.c # 93984fbd4e33: x86/cpufeature: Replace cpu_ drivers/gpu/drm/drm_cache.c # 906bf7fda2c9: x86/cpufeature: Remove cpu_h drivers/gpu/drm/i915/i915_gem.c # 568a58e5dfbc: x86/mm/pat, x86/cpufeature: drivers/gpu/drm/i915/i915_gem_execbuffer.c# 906bf7fda2c9: x86/cpufeature: Remove cpu_h drivers/input/joystick/analog.c # 59e21e3d00e6: x86/cpufeature: Replace cpu_ drivers/iommu/irq_remapping.c # 93984fbd4e33: x86/cpufeature: Replace cpu_ drivers/lguest/x86/core.c # c109bf95992b: x86/cpufeature: Remove cpu_h drivers/net/hamradio/baycom_epp.c # 59e21e3d00e6: x86/cpufeature: Replace cpu_
drivers/staging/unisys/visorbus/visorchipset.c# 0c9f3536cc71: x86/cpufeature: Remove cpu_h include/asm-generic/vmlinux.lds.h # 91ed140d6c1e: x86/asm: Make sure verify_cp tools/testing/selftests/x86/Makefile# 0051202f6ad5: selftests/x86: Test the FSBA tools/testing/selftests/x86/fsgsbase.c# 0051202f6ad5: selftests/x86: Test the FSBA tools/testing/selftests/x86/ldt_gdt.c# d63f4b5269e9: selftests/x86/ldt_gdt: Test
Thanks,
Ingo
------------------>
Andy Lutomirski (24):
selftests/x86: Test the FSBASE/GSBASE API and context switching x86/arch_prctl: Fix ARCH_GET_FS and ARCH_GET_GS
x86/cpu: Probe the behavior of nulling out a segment at boot time x86/asm, sched/x86: Rewrite the FS and GS context switch code x86/cpu: Move X86_BUG_ESPFIX initialization to generic_identify() x86/vdso: Remove direct HPET access through the vDSO
x86/head: Pass a real pt_regs and trapnr to early_fixup_exception() x86/head: Move the early NMI fixup into C
x86/head: Move early exception panic code into early_fixup_exception() x86/traps: Enable all exception handler callbacks early x86/paravirt: Add _safe to the read_ms()r and write_msr() PV callbacks x86/msr: Carry on after a non-"safe" MSR access fails x86/paravirt: Add paravirt_{read,write}_msr()
x86/paravirt: Make "unsafe" MSR accesses unsafe even if PARAVIRT=y x86/msr: Set the return value to zero when native_rdmsr_safe() fails x86/extable: Add a comment about early exception handlers x86/asm: Stop depending on ptrace.h in alternative.h
x86/asm: Make asm/alternative.h safe from assembly x86/segments/64: When loadsegment(fs, ...) fails, clear the base x86/segments/64: When load_gs_index fails, clear the base x86/arch_prctl/64: Remove FSBASE/GSBASE < 4G optimization x86/asm/64: Rename thread_struct's fs and gs to fsbase and gsbase x86/tls: Synchronize segment registers in set_thread_area() selftests/x86/ldt_gdt: Test set_thread_area() deletion of an active segment
Borislav Petkov (30):
x86/cpu: Do the feature test first in enable_sep_cpu() x86/mm/pat, x86/cpufeature: Remove cpu_has_pat x86/cpufeature: Remove cpu_has_arch_perfmon x86/cpufeature: Remove cpu_has_hypervisor x86/cpufeature: Remove cpu_has_osxsave
x86/cpufeature: Remove cpu_has_x2apic
x86/cpufeature: Remove cpu_has_gbpages
x86/cpufeature: Remove cpu_has_clflush
x86/cpufeature: Remove cpu_has_xmm2
x86/cpufeature: Remove cpu_has_pge
x86/cpufeature: Remove cpu_has_pse
x86/cpu: Add Erratum 88 detection on AMD
x86/entry/64: Make gs_change a local label x86/cpufeature: Replace cpu_has_avx2 with boot_cpu_has() usage x86/cpufeature: Replace cpu_has_aes with boot_cpu_has() usage x86/cpufeature: Replace cpu_has_avx with boot_cpu_has() usage x86/cpufeature: Replace cpu_has_xmm with boot_cpu_has() usage x86/cpufeature: Replace cpu_has_fpu with boot_cpu_has() usage x86/cpufeature: Replace cpu_has_tsc with boot_cpu_has() usage x86/cpufeature: Replace cpu_has_apic with boot_cpu_has() usage x86/cpufeature: Replace cpu_has_fxsr with boot_cpu_has() usage x86/cpufeature: Replace cpu_has_xsave with boot_cpu_has() usage x86/cpufeature: Replace cpu_has_xsaves with boot_cpu_has() usage x86/fpu/regset: Replace static_cpu_has() usage with boot_cpu_has() x86/cpu: Simplify extended APIC ID detection on AMD x86/tsc: Do not check X86_FEATURE_CONSTANT_TSC in notifier call x86/tsc: Save an indentation level in recalibrate_cpu_khz() x86/fpu: Remove check_fpu() indirection
x86/fpu: Get rid of x87 math exception helpers x86/asm: Make sure verify_cpu() has a good stack
Brian Gerst (3):
x86/entry, sched/x86: Don't save/restore EFLAGS on task switch x86/entry/32: Remove GET_THREAD_INFO() from entry code x86/entry/32: Remove asmlinkage_protect()
Christoph Hellwig (1):
x86/syscalls: Wire up compat readv2/writev2 syscalls
Denys Vlasenko (1):
x86/asm/entry/32: Simplify pushes of zeroed pt_regs->REGs
Dmitry Safonov (1):
x86/entry: Rename is_{ia32,x32}_task() to in_{ia32,x32}_syscall()Ingo Molnar (1):
x86/cpufeature: Fix build bug caused by merge artifact with the removal of cpu_has_hypervisor
Mateusz Guzik (1):
x86/arch_prctl/64: Restore accidentally removed put_cpu() in ARCH_SET_GS
Toshi Kani (8):
x86/mm/pat: Add support of non-default PAT MSR setting x86/mm/pat: Add pat_disable() interface x86/mm/pat: Replace cpu_has_pat with boot_cpu_has() x86/mtrr: Fix Xorg crashes in Qemu sessions x86/mtrr: Fix PAT init handling when MTRR is disabled x86/xen, pat: Remove PAT table init code from Xen x86/pat: Document the PAT initialization sequence x86/mm/pat: Fix BUG_ON() in mmap_mem() on QEMU/i386
Documentation/x86/pat.txt | 32 ++ arch/ia64/include/asm/iommu.h | 1 - arch/x86/crypto/aesni-intel_glue.c | 2 +- arch/x86/crypto/camellia_aesni_avx2_glue.c | 5 +- arch/x86/crypto/camellia_aesni_avx_glue.c | 4 +- arch/x86/crypto/chacha20_glue.c | 3 +- arch/x86/crypto/poly1305_glue.c | 5 +- arch/x86/crypto/serpent_avx2_glue.c | 2 +- arch/x86/crypto/serpent_sse2_glue.c | 2 +- arch/x86/crypto/sha1_ssse3_glue.c | 2 +- arch/x86/crypto/sha256_ssse3_glue.c | 2 +- arch/x86/crypto/sha512_ssse3_glue.c | 2 +- arch/x86/entry/common.c | 2 +- arch/x86/entry/entry_32.S | 7 - arch/x86/entry/entry_64.S | 21 +- arch/x86/entry/entry_64_compat.S | 45 ++- arch/x86/entry/syscalls/syscall_32.tbl | 4 +- arch/x86/entry/syscalls/syscall_64.tbl | 2 + arch/x86/entry/vdso/vclock_gettime.c | 15 - arch/x86/entry/vdso/vdso-layout.lds.S | 5 +- arch/x86/entry/vdso/vma.c | 11 - arch/x86/events/core.c | 2 +- arch/x86/events/intel/cstate.c | 2 +- arch/x86/events/intel/uncore.c | 2 +- arch/x86/ia32/ia32_signal.c | 2 +- arch/x86/include/asm/alternative.h | 35 +-- arch/x86/include/asm/apic.h | 4 +- arch/x86/include/asm/clocksource.h | 9 +- arch/x86/include/asm/compat.h | 4 +- arch/x86/include/asm/cpufeature.h | 25 -- arch/x86/include/asm/cpufeatures.h | 3 + arch/x86/include/asm/elf.h | 6 +- arch/x86/include/asm/hugetlb.h | 2 +- arch/x86/include/asm/irq_work.h | 2 +- arch/x86/include/asm/kgdb.h | 2 + arch/x86/include/asm/linkage.h | 34 --- arch/x86/include/asm/msr.h | 20 +- arch/x86/include/asm/mtrr.h | 6 +- arch/x86/include/asm/paravirt.h | 45 +-- arch/x86/include/asm/paravirt_types.h | 14 +- arch/x86/include/asm/pat.h | 2 +- arch/x86/include/asm/pgtable.h | 2 +- arch/x86/include/asm/processor.h | 11 +- arch/x86/include/asm/segment.h | 49 ++- arch/x86/include/asm/setup.h | 1 + arch/x86/include/asm/switch_to.h | 4 +- arch/x86/include/asm/text-patching.h | 40 +++ arch/x86/include/asm/thread_info.h | 2 +- arch/x86/include/asm/tlbflush.h | 2 +- arch/x86/include/asm/tsc.h | 2 +- arch/x86/include/asm/uaccess.h | 2 +- arch/x86/include/asm/xor_32.h | 2 +- arch/x86/include/asm/xor_avx.h | 4 +- arch/x86/kernel/acpi/boot.c | 8 +- arch/x86/kernel/alternative.c | 1 + arch/x86/kernel/apic/apic.c | 32 +- arch/x86/kernel/apic/apic_noop.c | 4 +- arch/x86/kernel/apic/io_apic.c | 2 +- arch/x86/kernel/apic/ipi.c | 2 +- arch/x86/kernel/apic/vector.c | 2 +- arch/x86/kernel/cpu/amd.c | 20 +- arch/x86/kernel/cpu/common.c | 82 +++-- arch/x86/kernel/cpu/cyrix.c | 2 +- arch/x86/kernel/cpu/intel.c | 12 +- arch/x86/kernel/cpu/mcheck/mce_intel.c | 2 +- arch/x86/kernel/cpu/mcheck/therm_throt.c | 2 +- arch/x86/kernel/cpu/mtrr/cyrix.c | 4 +- arch/x86/kernel/cpu/mtrr/generic.c | 28 +- arch/x86/kernel/cpu/mtrr/main.c | 13 +- arch/x86/kernel/cpu/mtrr/mtrr.h | 1 + arch/x86/kernel/cpu/vmware.c | 2 +- arch/x86/kernel/devicetree.c | 2 +- arch/x86/kernel/fpu/bugs.c | 16 +- arch/x86/kernel/fpu/core.c | 50 +--- arch/x86/kernel/fpu/init.c | 16 +- arch/x86/kernel/fpu/regset.c | 25 +- arch/x86/kernel/fpu/xstate.c | 18 +- arch/x86/kernel/head_32.S | 116 +++---- arch/x86/kernel/head_64.S | 103 +++---- arch/x86/kernel/hpet.c | 1 - arch/x86/kernel/jump_label.c | 1 + arch/x86/kernel/kgdb.c | 1 + arch/x86/kernel/kprobes/core.c | 1 + arch/x86/kernel/kprobes/opt.c | 1 + arch/x86/kernel/kvm.c | 2 +- arch/x86/kernel/module.c | 1 + arch/x86/kernel/paravirt.c | 6 +- arch/x86/kernel/process_64.c | 241 +++++++-------- arch/x86/kernel/ptrace.c | 50 +--- arch/x86/kernel/signal.c | 6 +- arch/x86/kernel/smpboot.c | 2 +- arch/x86/kernel/tce_64.c | 2 +- arch/x86/kernel/tls.c | 42 +++ arch/x86/kernel/traps.c | 1 + arch/x86/kernel/tsc.c | 33 +- arch/x86/kernel/uprobes.c | 2 +- arch/x86/kvm/cpuid.c | 2 +- arch/x86/kvm/mmu.c | 3 +- arch/x86/kvm/svm.c | 2 +- arch/x86/kvm/trace.h | 3 +- arch/x86/kvm/vmx.c | 2 +- arch/x86/kvm/x86.c | 16 +- arch/x86/lib/usercopy_32.c | 4 +- arch/x86/mm/extable.c | 96 ++++-- arch/x86/mm/hugetlbpage.c | 4 +- arch/x86/mm/init.c | 8 +- arch/x86/mm/init_32.c | 2 +- arch/x86/mm/init_64.c | 4 +- arch/x86/mm/ioremap.c | 4 +- arch/x86/mm/pageattr.c | 4 +- arch/x86/mm/pat.c | 109 ++++--- arch/x86/oprofile/nmi_int.c | 6 +- arch/x86/oprofile/op_model_ppro.c | 2 +- arch/x86/pci/xen.c | 2 +- arch/x86/power/hibernate_32.c | 2 +- arch/x86/xen/enlighten.c | 40 ++- drivers/cpufreq/longhaul.c | 2 +- drivers/gpu/drm/drm_cache.c | 6 +- drivers/gpu/drm/i915/i915_gem.c | 2 +- drivers/gpu/drm/i915/i915_gem_execbuffer.c | 2 +- drivers/input/joystick/analog.c | 6 +- drivers/iommu/irq_remapping.c | 2 +- drivers/lguest/x86/core.c | 2 +- drivers/net/hamradio/baycom_epp.c | 8 +- drivers/staging/unisys/visorbus/visorchipset.c | 2 +- include/asm-generic/vmlinux.lds.h | 4 +- tools/testing/selftests/x86/Makefile | 1 + tools/testing/selftests/x86/fsgsbase.c | 398 +++++++++++++++++++++++++ tools/testing/selftests/x86/ldt_gdt.c | 250 ++++++++++++++++ 129 files changed, 1614 insertions(+), 860 deletions(-) create mode 100644 arch/x86/include/asm/text-patching.h create mode 100644 tools/testing/selftests/x86/fsgsbase.c
Documentation/x86/pat.txt +32 -0
@@ -196,3 +196,35 @@ Another, more verbose way of getting PAT related debug messages is with "debugpat" boot parameter. With this parameter, various debug messages are printed to dmesg log. +PAT Initialization +------------------ + +The following table describes how PAT is initialized under various +configurations. The PAT MSR must be updated by Linux in order to support WC +and WT attributes. Otherwise, the PAT MSR has the value programmed in it +by the firmware. Note, Xen enables WC attribute in the PAT MSR for guests. + + MTRR PAT Call Sequence PAT State PAT MSR + ========================================================= + E E MTRR -> PAT init Enabled OS + E D MTRR -> PAT init Disabled - + D E MTRR -> PAT disable Disabled BIOS + D D MTRR -> PAT disable Disabled - + - np/E PAT -> PAT disable Disabled BIOS + - np/D PAT -> PAT disable Disabled - + E !P/E MTRR -> PAT init Disabled BIOS + D !P/E MTRR -> PAT disable Disabled BIOS + !M !P/E MTRR stub -> PAT disable Disabled BIOS + + Legend + ------------------------------------------------ + E Feature enabled in CPU + D Feature disabled/unsupported in CPU + np "nopat" boot option specified + !P CONFIG_X86_PAT option unset + !M CONFIG_MTRR option unset + Enabled PAT state set to enabled + Disabled PAT state set to disabled + OS PAT initializes PAT MSR with OS setting + BIOS PAT keeps PAT MSR with BIOS setting +
arch/ia64/include/asm/iommu.h +0 -1
@@ -1,7 +1,6 @@#ifndef _ASM_IA64_IOMMU_H#define _ASM_IA64_IOMMU_H 1 -#define cpu_has_x2apic 0/* 10 seconds */ #define DMAR_OPERATION_TIMEOUT (((cycles_t) local_cpu_data->itc_freq)*10)
arch/x86/crypto/aesni-intel_glue.c +1 -1
@@ -1477,7 +1477,7 @@ static int __init aesni_init(void) } aesni_ctr_enc_tfm = aesni_ctr_enc;#ifdef CONFIG_AS_AVX -if (cpu_has_avx) { +if (boot_cpu_has (X86_FEATURE_AVX )) {/* optimize performance of ctr mode encryption transform */ aesni_ctr_enc_tfm = aesni_ctr_enc_avx_tfm;pr_info ("AES CTR mode by8 optimization enabled\n" );
arch/x86/crypto/camellia_aesni_avx2_glue.c +4 -1
@@ -562,7 +562,10 @@ static int __init camellia_aesni_init(void) {const char *feature_name; -if (!cpu_has_avx2 || !cpu_has_avx || !cpu_has_aes || !cpu_has_osxsave) { +if (!boot_cpu_has (X86_FEATURE_AVX ) || + !boot_cpu_has (X86_FEATURE_AVX2 ) || + !boot_cpu_has (X86_FEATURE_AES ) || + !boot_cpu_has (X86_FEATURE_OSXSAVE )) {pr_info ("AVX2 or AES-NI instructions are not detected.\n" );return -ENODEV ; }
arch/x86/crypto/camellia_aesni_avx_glue.c +3 -1
@@ -554,7 +554,9 @@ static int __init camellia_aesni_init(void) {const char *feature_name; -if (!cpu_has_avx || !cpu_has_aes || !cpu_has_osxsave) { +if (!boot_cpu_has (X86_FEATURE_AVX ) || + !boot_cpu_has (X86_FEATURE_AES ) || + !boot_cpu_has (X86_FEATURE_OSXSAVE )) {pr_info ("AVX or AES-NI instructions are not detected.\n" );return -ENODEV ; }
arch/x86/crypto/chacha20_glue.c +2 -1
@@ -129,7 +129,8 @@ static int __init chacha20_simd_mod_init(void)return -ENODEV ;#ifdef CONFIG_AS_AVX2 - chacha20_use_avx2 = cpu_has_avx && cpu_has_avx2 && + chacha20_use_avx2 =boot_cpu_has (X86_FEATURE_AVX ) && +boot_cpu_has (X86_FEATURE_AVX2 ) &&cpu_has_xfeatures (XFEATURE_MASK_SSE |XFEATURE_MASK_YMM ,NULL );#endif return crypto_register_alg (&alg);
arch/x86/crypto/poly1305_glue.c +3 -2
@@ -179,11 +179,12 @@ static struct shash_alg alg = {static int __init poly1305_simd_mod_init (void ) { -if (!cpu_has_xmm2) +if (!boot_cpu_has (X86_FEATURE_XMM2 ))return -ENODEV ;#ifdef CONFIG_AS_AVX2 - poly1305_use_avx2 = cpu_has_avx && cpu_has_avx2 && + poly1305_use_avx2 =boot_cpu_has (X86_FEATURE_AVX ) && +boot_cpu_has (X86_FEATURE_AVX2 ) &&cpu_has_xfeatures (XFEATURE_MASK_SSE |XFEATURE_MASK_YMM ,NULL ); alg.descsize =sizeof (struct poly1305_simd_desc_ctx );if (poly1305_use_avx2)
arch/x86/crypto/serpent_avx2_glue.c +1 -1
@@ -538,7 +538,7 @@ static int __init init(void) {const char *feature_name; -if (!cpu_has_avx2 || !cpu_has_osxsave) { +if (!boot_cpu_has (X86_FEATURE_AVX2 ) || !boot_cpu_has (X86_FEATURE_OSXSAVE )) {pr_info ("AVX2 instructions are not detected.\n" );return -ENODEV ; }
arch/x86/crypto/serpent_sse2_glue.c +1 -1
@@ -600,7 +600,7 @@ static struct crypto_alg serpent_algs[10] = { {static int __init serpent_sse2_init (void ) { -if (!cpu_has_xmm2) { +if (!boot_cpu_has (X86_FEATURE_XMM2 )) {printk (KERN_INFO "SSE2 instructions are not detected.\n" );return -ENODEV ; }
arch/x86/crypto/sha1_ssse3_glue.c +1 -1
@@ -166,7 +166,7 @@ static struct shash_alg sha1_avx_alg = {static bool avx_usable (void ) {if (!cpu_has_xfeatures (XFEATURE_MASK_SSE |XFEATURE_MASK_YMM ,NULL )) { -if (cpu_has_avx) +if (boot_cpu_has (X86_FEATURE_AVX ))pr_info ("AVX detected but unusable.\n" );return false; }
arch/x86/crypto/sha256_ssse3_glue.c +1 -1
@@ -201,7 +201,7 @@ static struct shash_alg sha256_avx_algs[] = { {static bool avx_usable (void ) {if (!cpu_has_xfeatures (XFEATURE_MASK_SSE |XFEATURE_MASK_YMM ,NULL )) { -if (cpu_has_avx) +if (boot_cpu_has (X86_FEATURE_AVX ))pr_info ("AVX detected but unusable.\n" );return false; }
arch/x86/crypto/sha512_ssse3_glue.c +1 -1
@@ -151,7 +151,7 @@ asmlinkage void sha512_transform_avx(u64 *digest, const char *data,static bool avx_usable (void ) {if (!cpu_has_xfeatures (XFEATURE_MASK_SSE |XFEATURE_MASK_YMM ,NULL )) { -if (cpu_has_avx) +if (boot_cpu_has (X86_FEATURE_AVX ))pr_info ("AVX detected but unusable.\n" );return false; }
arch/x86/entry/common.c +1 -1
@@ -191,7 +191,7 @@ long syscall_trace_enter_phase2(struct pt_regs *regs, u32 arch,long syscall_trace_enter (struct pt_regs *regs) { -u32 arch =is_ia32_task () ?AUDIT_ARCH_I386 :AUDIT_ARCH_X86_64 ; +u32 arch =in_ia32_syscall () ?AUDIT_ARCH_I386 :AUDIT_ARCH_X86_64 ;unsigned long phase1_result =syscall_trace_enter_phase1 (regs, arch);if (phase1_result ==0 )
arch/x86/entry/entry_32.S +0 -7
@@ -207,10 +207,7 @@ ENTRY(ret_from_fork) pushl %eax call schedule_tail - GET_THREAD_INFO(%ebp) popl %eax - pushl $0x0202 # Reset kernel eflags - popfl /* When we fork, we trace the syscall return in the child, too. */ movl %esp, %eax
@@ -221,10 +218,7 @@ END(ret_from_fork) ENTRY(ret_from_kernel_thread) pushl %eax call schedule_tail - GET_THREAD_INFO(%ebp) popl %eax - pushl $0x0202 # Reset kernel eflags - popfl movl PT_EBP(%esp), %eax call *PT_EBX(%esp) movl $0, PT_EAX(%esp)
@@ -251,7 +245,6 @@ ENDPROC(ret_from_kernel_thread) ret_from_exception: preempt_stop(CLBR_ANY) ret_from_intr: - GET_THREAD_INFO(%ebp) #ifdef CONFIG_VM86 movl PT_EFLAGS(%esp), %eax # mix EFLAGS and CS movb PT_CS(%esp), %al
arch/x86/entry/entry_64.S +12 -9
@@ -372,9 +372,6 @@ END(ptregs_\func) ENTRY(ret_from_fork) LOCK ; btr $TIF_FORK, TI_flags(%r8) - pushq $0x0002 - popfq /* reset kernel eflags */ - call schedule_tail /* rdi: 'prev' task parameter */ testb $3, CS(%rsp) /* from kernel_thread? */
@@ -781,19 +778,25 @@ ENTRY(native_load_gs_index) pushfq DISABLE_INTERRUPTS(CLBR_ANY & ~CLBR_RDI) SWAPGS -gs_change: +.Lgs_change: movl %edi, %gs -2: mfence /* workaround */ +2: ALTERNATIVE "", "mfence", X86_BUG_SWAPGS_FENCE SWAPGS popfq ret END(native_load_gs_index) - _ASM_EXTABLE(gs_change, bad_gs) + _ASM_EXTABLE(.Lgs_change, bad_gs) .section .fixup, "ax" /* running with kernelgs */ bad_gs: SWAPGS /* switch back to user gs */ +.macro ZAP_GS + /* This can't be a string because the preprocessor needs to see it. */ + movl $__USER_DS, %eax + movl %eax, %gs +.endm + ALTERNATIVE "", "ZAP_GS", X86_BUG_NULL_SEG xorl %eax, %eax movl %eax, %gs jmp 2b
@@ -1019,13 +1022,13 @@ ENTRY(error_entry) movl %ecx, %eax /* zero extend */ cmpq %rax, RIP+8(%rsp) je .Lbstep_iret - cmpq $gs_change, RIP+8(%rsp) + cmpq $.Lgs_change, RIP+8(%rsp) jne .Lerror_entry_done /* - * hack: gs_change can fail with user gsbase. If this happens, fix up + * hack: .Lgs_change can fail with user gsbase. If this happens, fix up * gsbase and proceed. We'll fix up the exception and land in - * gs_change's error handler with kernel gsbase. + * .Lgs_change's error handler with kernel gsbase. */ jmp .Lerror_entry_from_usermode_swapgs
arch/x86/entry/entry_64_compat.S +21 -24
73 lines not on this page · raw message
arch/x86/entry/syscalls/syscall_32.tbl +2 -2
@@ -384,5 +384,5 @@ 375 i386 membarrier sys_membarrier 376 i386 mlock2 sys_mlock2 377 i386 copy_file_range sys_copy_file_range -378 i386 preadv2 sys_preadv2 -379 i386 pwritev2 sys_pwritev2 +378 i386 preadv2 sys_preadv2 compat_sys_preadv2 +379 i386 pwritev2 sys_pwritev2 compat_sys_pwritev2
arch/x86/entry/syscalls/syscall_64.tbl +2 -0
@@ -374,3 +374,5 @@ 543 x32 io_setup compat_sys_io_setup 544 x32 io_submit compat_sys_io_submit 545 x32 execveat compat_sys_execveat/ptregs +534 x32 preadv2 compat_sys_preadv2 +535 x32 pwritev2 compat_sys_pwritev2
arch/x86/entry/vdso/vclock_gettime.c +0 -15
@@ -13,7 +13,6 @@#include <uapi/linux/time.h> #include <asm/vgtod.h> -#include <asm/hpet.h> #include <asm/vvar.h> #include <asm/unistd.h> #include <asm/msr.h>
@@ -28,16 +27,6 @@ extern int __vdso_clock_gettime(clockid_t clock, struct timespec *ts);extern int __vdso_gettimeofday (struct timeval *tv,struct timezone *tz);extern time_t __vdso_time (time_t *t); -#ifdef CONFIG_HPET_TIMER -extern u8 hpet_page - __attribute__((visibility("hidden"))); - -static notrace cycle_t vread_hpet(void) -{ -return *(const volatile u32 *)(&hpet_page +HPET_COUNTER ); -} -#endif -#ifdef CONFIG_PARAVIRT_CLOCK extern u8 pvclock_page __attribute__((visibility("hidden")));
@@ -195,10 +184,6 @@ notrace static inline u64 vgetsns(int *mode)if (gtod->vclock_mode ==VCLOCK_TSC ) cycles =vread_tsc (); -#ifdef CONFIG_HPET_TIMER - else if (gtod->vclock_mode == VCLOCK_HPET) - cycles =vread_hpet (); -#endif #ifdef CONFIG_PARAVIRT_CLOCK else if (gtod->vclock_mode == VCLOCK_PVCLOCK) cycles =vread_pvclock (mode);
arch/x86/entry/vdso/vdso-layout.lds.S +2 -3
@@ -25,7 +25,7 @@ SECTIONS * segment. */ - vvar_start = . - 3 * PAGE_SIZE; + vvar_start = . - 2 * PAGE_SIZE; vvar_page = vvar_start; /* Place all vvars at the offsets in asm/vvar.h. */
@@ -35,8 +35,7 @@ SECTIONS #undef __VVAR_KERNEL_LDS #undef EMIT_VVAR - hpet_page = vvar_start + PAGE_SIZE; - pvclock_page = vvar_start + 2 * PAGE_SIZE; + pvclock_page = vvar_start + PAGE_SIZE; . = SIZEOF_HEADERS;
arch/x86/entry/vdso/vma.c +0 -11
@@ -18,7 +18,6 @@#include <asm/vdso.h> #include <asm/vvar.h> #include <asm/page.h> -#include <asm/hpet.h> #include <asm/desc.h> #include <asm/cpufeature.h>
@@ -129,16 +128,6 @@ static int vvar_fault(const struct vm_special_mapping *sm,if (sym_offset == image->sym_vvar_page) { ret =vm_insert_pfn (vma, (unsigned long )vmf->virtual_address,__pa_symbol (&__vvar_page) >>PAGE_SHIFT ); - }else if (sym_offset == image->sym_hpet_page) { -#ifdef CONFIG_HPET_TIMER -if (hpet_address &&vclock_was_used (VCLOCK_HPET )) { - ret =vm_insert_pfn_prot ( - vma, - (unsigned long )vmf->virtual_address, - hpet_address >>PAGE_SHIFT , -pgprot_noncached (PAGE_READONLY )); - } -#endif }else if (sym_offset == image->sym_pvclock_page) {struct pvclock_vsyscall_time_info *pvti =pvclock_pvti_cpu0_va ();
arch/x86/events/core.c +1 -1
@@ -1518,7 +1518,7 @@ x86_pmu_notifier(struct notifier_block *self, unsigned long action, void *hcpu)static void __init pmu_check_apic (void ) { -if (cpu_has_apic) +if (boot_cpu_has (X86_FEATURE_APIC ))return ; x86_pmu.apic =0 ;
arch/x86/events/intel/cstate.c +1 -1
@@ -677,7 +677,7 @@ static int __init cstate_pmu_init(void) {int err; -if (cpu_has_hypervisor) +if (boot_cpu_has (X86_FEATURE_HYPERVISOR ))return -ENODEV ; err =cstate_init ();
arch/x86/events/intel/uncore.c +1 -1
@@ -1383,7 +1383,7 @@ static int __init intel_uncore_init(void)if (boot_cpu_data.x86_vendor !=X86_VENDOR_INTEL )return -ENODEV ; -if (cpu_has_hypervisor) +if (boot_cpu_has (X86_FEATURE_HYPERVISOR ))return -ENODEV ; max_packages =topology_max_packages ();
arch/x86/ia32/ia32_signal.c +1 -1
@@ -357,7 +357,7 @@ int ia32_setup_rt_frame(int sig, struct ksignal *ksig,put_user_ex (ptr_to_compat (&frame->uc), &frame->puc);/* Create the ucontext. */ -if (cpu_has_xsave) +if (boot_cpu_has (X86_FEATURE_XSAVE ))put_user_ex (UC_FP_XSTATE , &frame->uc.uc_flags);else put_user_ex (0 , &frame->uc.uc_flags);
arch/x86/include/asm/alternative.h +3 -32
@@ -1,11 +1,12 @@#ifndef _ASM_X86_ALTERNATIVE_H#define _ASM_X86_ALTERNATIVE_H +#ifndef __ASSEMBLY__ +#include <linux/types.h> #include <linux/stddef.h> #include <linux/stringify.h> #include <asm/asm.h> -#include <asm/ptrace.h> /* * Alternative inline assembly for SMP.
@@ -233,36 +234,6 @@ static inline int alternatives_text_reserved(void *start, void *end)*/ #define ASM_NO_INPUT_CLOBBER(clbr...) "i" (0) : clbr -struct paravirt_patch_site ; -#ifdef CONFIG_PARAVIRT -void apply_paravirt (struct paravirt_patch_site *start, -struct paravirt_patch_site *end); -#else -static inline void apply_paravirt (struct paravirt_patch_site *start, -struct paravirt_patch_site *end) -{} -#define __parainstructions NULL -#define __parainstructions_end NULL -#endif - -extern void *text_poke_early (void *addr,const void *opcode,size_t len); - -/* -* Clear and restore the kernel write-protection flag on the local CPU. -* Allows the kernel to edit read-only pages. -* Side-effect: any interrupt handler running between save and restore will have -* the ability to write to read-only pages. -* -* Warning: -* Code patching in the UP case is safe if NMIs and MCE handlers are stopped and -* no thread can be preempted in the instructions being modified (no iret to an -* invalid instruction possible) or if the instructions are changed from a -* consistent state to another consistent state atomically. -* On the local CPU you need to be protected again NMI or MCE handlers seeing an -* inconsistent instruction while you patch. -*/ -extern void *text_poke (void *addr,const void *opcode,size_t len); -extern int poke_int3_handler (struct pt_regs *regs); -extern void *text_poke_bp (void *addr,const void *opcode,size_t len,void *handler); +#endif /* __ASSEMBLY__ */ #endif /* _ASM_X86_ALTERNATIVE_H */
arch/x86/include/asm/apic.h +2 -2
@@ -239,10 +239,10 @@ extern void __init check_x2apic(void);extern void x2apic_setup (void );static inline int x2apic_enabled (void ) { -return cpu_has_x2apic &&apic_is_x2apic_enabled (); +return boot_cpu_has (X86_FEATURE_X2APIC ) &&apic_is_x2apic_enabled (); } -#define x2apic_supported () (cpu_has_x2apic) +#define x2apic_supported () (boot_cpu_has(X86_FEATURE_X2APIC))#else /* !CONFIG_X86_X2APIC */ static inline void check_x2apic (void ) { }static inline void x2apic_setup (void ) { }
arch/x86/include/asm/clocksource.h +4 -5
@@ -3,11 +3,10 @@ #ifndef _ASM_X86_CLOCKSOURCE_H #define _ASM_X86_CLOCKSOURCE_H -#define VCLOCK_NONE 0 /* No vDSO clock available. */ -#define VCLOCK_TSC 1 /* vDSO should use vread_tsc. */ -#define VCLOCK_HPET 2 /* vDSO should use vread_hpet. */ -#define VCLOCK_PVCLOCK 3 /* vDSO should use vread_pvclock. */ -#define VCLOCK_MAX 3 +#define VCLOCK_NONE 0 /* No vDSO clock available. */ +#define VCLOCK_TSC 1 /* vDSO should use vread_tsc. */ +#define VCLOCK_PVCLOCK 2 /* vDSO should use vread_pvclock. */ +#define VCLOCK_MAX 2 struct arch_clocksource_data { int vclock_mode;
arch/x86/include/asm/compat.h +2 -2
@@ -307,7 +307,7 @@ static inline void __user *arch_compat_alloc_user_space(long len)return (void __user *)round_down (sp - len,16 ); } -static inline bool is_x32_task (void ) +static inline bool in_x32_syscall (void ) {#ifdef CONFIG_X86_X32_ABI if (task_pt_regs (current)->orig_ax & __X32_SYSCALL_BIT)
@@ -318,7 +318,7 @@ static inline bool is_x32_task(void)static inline bool in_compat_syscall (void ) { -return is_ia32_task () ||is_x32_task (); +return in_ia32_syscall () ||in_x32_syscall (); }#define in_compat_syscall in_compat_syscall/* override the generic impl */
arch/x86/include/asm/cpufeature.h +0 -25
@@ -118,31 +118,6 @@ extern const char * const x86_bug_flags[NBUGINTS*32];set_bit (bit, (unsigned long *)cpu_caps_set); \ } while (0) -#define cpu_has_fpu boot_cpu_has(X86_FEATURE_FPU) -#define cpu_has_pse boot_cpu_has(X86_FEATURE_PSE) -#define cpu_has_tsc boot_cpu_has(X86_FEATURE_TSC) -#define cpu_has_pge boot_cpu_has(X86_FEATURE_PGE) -#define cpu_has_apic boot_cpu_has(X86_FEATURE_APIC) -#define cpu_has_fxsr boot_cpu_has(X86_FEATURE_FXSR) -#define cpu_has_xmm boot_cpu_has(X86_FEATURE_XMM) -#define cpu_has_xmm2 boot_cpu_has(X86_FEATURE_XMM2) -#define cpu_has_aes boot_cpu_has(X86_FEATURE_AES) -#define cpu_has_avx boot_cpu_has(X86_FEATURE_AVX) -#define cpu_has_avx2 boot_cpu_has(X86_FEATURE_AVX2) -#define cpu_has_clflush boot_cpu_has(X86_FEATURE_CLFLUSH) -#define cpu_has_gbpages boot_cpu_has(X86_FEATURE_GBPAGES) -#define cpu_has_arch_perfmon boot_cpu_has(X86_FEATURE_ARCH_PERFMON) -#define cpu_has_pat boot_cpu_has(X86_FEATURE_PAT) -#define cpu_has_x2apic boot_cpu_has(X86_FEATURE_X2APIC) -#define cpu_has_xsave boot_cpu_has(X86_FEATURE_XSAVE) -#define cpu_has_xsaves boot_cpu_has(X86_FEATURE_XSAVES) -#define cpu_has_osxsave boot_cpu_has(X86_FEATURE_OSXSAVE) -#define cpu_has_hypervisor boot_cpu_has(X86_FEATURE_HYPERVISOR) -/* -* Do not add any more of those clumsy macros - use static_cpu_has() for -* fast paths and boot_cpu_has() otherwise! -*/ -#if defined(CC_HAVE_ASM_GOTO ) && defined(CONFIG_X86_FAST_FEATURE_TESTS )/* * Static testing of CPU features. Used the same as boot_cpu_has().
arch/x86/include/asm/cpufeatures.h +3 -0
@@ -294,6 +294,9 @@#define X86_BUG_FXSAVE_LEAK X86_BUG(6)/* FXSAVE leaks FOP/FIP/FOP */ #define X86_BUG_CLFLUSH_MONITOR X86_BUG(7)/* AAI65, CLFLUSH required before MONITOR */ #define X86_BUG_SYSRET_SS_ATTRS X86_BUG(8)/* SYSRET doesn't fix up SS attrs */ +#define X86_BUG_NULL_SEG X86_BUG(9)/* Nulling a selector preserves the base */ +#define X86_BUG_SWAPGS_FENCE X86_BUG(10)/* SWAPGS without input dep on GS */ +#ifdef CONFIG_X86_32 /*
arch/x86/include/asm/elf.h +3 -3
@@ -176,7 +176,7 @@ static inline void elf_common_init(struct thread_struct *t, regs->si = regs->di = regs->bp =0 ; regs->r8 = regs->r9 = regs->r10 = regs->r11 =0 ; regs->r12 = regs->r13 = regs->r14 = regs->r15 =0 ; - t->fs = t->gs =0 ; + t->fsbase = t->gsbase =0 ; t->fsindex = t->gsindex =0 ; t->ds = t->es = ds; }
@@ -226,8 +226,8 @@ do { \ (pr_reg)[18 ] = (regs)->flags; \ (pr_reg)[19 ] = (regs)->sp; \ (pr_reg)[20 ] = (regs)->ss; \ - (pr_reg)[21 ] = current->thread.fs; \ - (pr_reg)[22 ] = current->thread.gs; \ + (pr_reg)[21 ] = current->thread.fsbase; \ + (pr_reg)[22 ] = current->thread.gsbase; \ asm("movl %%ds,%0" :"=r" (v)); (pr_reg)[23 ] = v; \ asm("movl %%es,%0" :"=r" (v)); (pr_reg)[24 ] = v; \ asm("movl %%fs,%0" :"=r" (v)); (pr_reg)[25 ] = v; \
arch/x86/include/asm/hugetlb.h +1 -1
@@ -4,7 +4,7 @@#include <asm/page.h> #include <asm-generic/hugetlb.h> -#define hugepages_supported () cpu_has_pse +#define hugepages_supported () boot_cpu_has(X86_FEATURE_PSE) static inline int is_hugepage_only_range(struct mm_struct *mm, unsigned long addr,
arch/x86/include/asm/irq_work.h +1 -1
@@ -5,7 +5,7 @@static inline bool arch_irq_work_has_interrupt (void ) { -return cpu_has_apic; +return boot_cpu_has (X86_FEATURE_APIC ); }#endif /* _ASM_IRQ_WORK_H */
arch/x86/include/asm/kgdb.h +2 -0
@@ -6,6 +6,8 @@* Copyright (C) 2008 Wind River Systems, Inc. */ +#include <asm/ptrace.h> +/* * BUFMAX defines the maximum number of characters in inbound/outbound * buffers at least NUMREGBYTES*2 are needed for register packets
arch/x86/include/asm/linkage.h +0 -34
@@ -8,40 +8,6 @@#ifdef CONFIG_X86_32 #define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0))) - -/* -* Make sure the compiler doesn't do anything stupid with the -* arguments on the stack - they are owned by the *caller*, not -* the callee. This just fools gcc into not spilling into them, -* and keeps it from doing tailcall recursion and/or using the -* stack slots for temporaries, since they are live and "used" -* all the way to the end of the function. -* -* NOTE! On x86-64, all the arguments are in registers, so this -* only matters on a 32-bit kernel. -*/ -#define asmlinkage_protect(n, ret, args...) \ - __asmlinkage_protect##n(ret, ##args) -#define __asmlinkage_protect_n(ret, args...) \ - __asm__ __volatile__ ("" : "=r" (ret) : "0" (ret), ##args) -#define __asmlinkage_protect0 (ret) \ - __asmlinkage_protect_n(ret) -#define __asmlinkage_protect1 (ret, arg1) \ - __asmlinkage_protect_n(ret, "m" (arg1)) -#define __asmlinkage_protect2 (ret, arg1, arg2) \ - __asmlinkage_protect_n(ret, "m" (arg1), "m" (arg2)) -#define __asmlinkage_protect3 (ret, arg1, arg2, arg3) \ - __asmlinkage_protect_n(ret, "m" (arg1), "m" (arg2), "m" (arg3)) -#define __asmlinkage_protect4 (ret, arg1, arg2, arg3, arg4) \ - __asmlinkage_protect_n(ret, "m" (arg1), "m" (arg2), "m" (arg3), \ - "m" (arg4)) -#define __asmlinkage_protect5 (ret, arg1, arg2, arg3, arg4, arg5) \ - __asmlinkage_protect_n(ret, "m" (arg1), "m" (arg2), "m" (arg3), \ - "m" (arg4), "m" (arg5)) -#define __asmlinkage_protect6 (ret, arg1, arg2, arg3, arg4, arg5, arg6) \ - __asmlinkage_protect_n(ret, "m" (arg1), "m" (arg2), "m" (arg3), \ - "m" (arg4), "m" (arg5), "m" (arg6)) -#endif /* CONFIG_X86_32 */ #ifdef __ASSEMBLY__
arch/x86/include/asm/msr.h +15 -5
@@ -84,7 +84,10 @@ static inline unsigned long long native_read_msr(unsigned int msr) {DECLARE_ARGS (val, low, high); - asm volatile("rdmsr" : EAX_EDX_RET(val, low, high) : "c" (msr)); + asm volatile("1: rdmsr\n" + "2:\n" + _ASM_EXTABLE_HANDLE(1b, 2b, ex_handler_rdmsr_unsafe) + : EAX_EDX_RET(val, low, high) : "c" (msr));if (msr_tracepoint_active (__tracepoint_read_msr))do_trace_read_msr (msr,EAX_EDX_VAL (val, low, high),0 );return EAX_EDX_VAL (val, low, high);
@@ -98,7 +101,10 @@ static inline unsigned long long native_read_msr_safe(unsigned int msr, asmvolatile ("2: rdmsr ; xor %[err],%[err]\n" "1:\n\t" ".section .fixup,\"ax\"\n\t" -"3: mov %[fault],%[err] ; jmp 1b\n\t" +"3: mov %[fault],%[err]\n\t" +"xorl %%eax, %%eax\n\t" +"xorl %%edx, %%edx\n\t" +"jmp 1b\n\t" ".previous\n\t" _ASM_EXTABLE(2b, 3b) : [err] "=r" (*err), EAX_EDX_RET(val, low, high)
@@ -108,10 +114,14 @@ static inline unsigned long long native_read_msr_safe(unsigned int msr,return EAX_EDX_VAL (val, low, high); } -static inline void native_write_msr (unsigned int msr, -unsigned low,unsigned high) +/* Can be uninlined because referenced by paravirt */ +notrace static inline void native_write_msr(unsigned int msr, +unsigned low,unsigned high) { - asmvolatile ("wrmsr" : :"c" (msr),"a" (low),"d" (high) :"memory" ); + asm volatile("1: wrmsr\n" + "2:\n" + _ASM_EXTABLE_HANDLE(1b, 2b, ex_handler_wrmsr_unsafe) + : : "c" (msr), "a"(low), "d" (high) : "memory");if (msr_tracepoint_active (__tracepoint_read_msr))do_trace_write_msr (msr, ((u64 )high <<32 | low),0 ); }
arch/x86/include/asm/mtrr.h +5 -1
@@ -24,6 +24,7 @@#define _ASM_X86_MTRR_H#include <uapi/asm/mtrr.h> +#include <asm/pat.h> /*
@@ -83,9 +84,12 @@ static inline int mtrr_trim_uncached_memory(unsigned long end_pfn)static inline void mtrr_centaur_report_mcr (int mcr,u32 lo,u32 hi) { } +static inline void mtrr_bp_init (void ) +{ +pat_disable ("MTRRs disabled, skipping PAT initialization too." ); +}#define mtrr_ap_init () do {} while (0) -#define mtrr_bp_init () do {} while (0)#define set_mtrr_aps_delayed_init () do {} while (0)#define mtrr_aps_init () do {} while (0)#define mtrr_bp_restore () do {} while (0)
arch/x86/include/asm/paravirt.h +27 -18
79 lines not on this page · raw message
arch/x86/include/asm/paravirt_types.h +10 -4
@@ -155,10 +155,16 @@ struct pv_cpu_ops {void (*cpuid)(unsigned int *eax,unsigned int *ebx,unsigned int *ecx,unsigned int *edx); -/* MSR, PMC and TSR operations. -err = 0/-EFAULT. wrmsr returns 0/-EFAULT. */ -u64 (*read_msr)(unsigned int msr,int *err); -int (*write_msr)(unsigned int msr,unsigned low,unsigned high); +/* Unsafe MSR operations. These will warn or panic on failure. */ +u64 (*read_msr)(unsigned int msr); +void (*write_msr)(unsigned int msr,unsigned low,unsigned high); + +/* +* Safe MSR operations. +* read sets err to 0 or -EIO. write returns 0 or -EIO. +*/ +u64 (*read_msr_safe)(unsigned int msr,int *err); +int (*write_msr_safe)(unsigned int msr,unsigned low,unsigned high);u64 (*read_pmc)(int counter);
arch/x86/include/asm/pat.h +1 -1
@@ -5,8 +5,8 @@#include <asm/pgtable_types.h> bool pat_enabled (void ); +void pat_disable (const char *reason);extern void pat_init (void ); -void pat_init_cache_modes (u64 );extern int reserve_memtype (u64 start,u64 end,enum page_cache_mode req_pcm,enum page_cache_mode *ret_pcm);
arch/x86/include/asm/pgtable.h +1 -1
@@ -183,7 +183,7 @@ static inline int pmd_trans_huge(pmd_t pmd)static inline int has_transparent_hugepage (void ) { -return cpu_has_pse; +return boot_cpu_has (X86_FEATURE_PSE ); }#ifdef __HAVE_ARCH_PTE_DEVMAP
arch/x86/include/asm/processor.h +9 -2
@@ -388,9 +388,16 @@ struct thread_struct {unsigned long ip;#endif #ifdef CONFIG_X86_64 -unsigned long fs; +unsigned long fsbase; +unsigned long gsbase; +#else +/* +* XXX: this could presumably be unsigned short. Alternatively, +* 32-bit kernels could be taught to use fsindex instead. +*/ +unsigned long fs; +unsigned long gs;#endif -unsigned long gs;/* Save middle states of ptrace breakpoints */ struct perf_event *ptrace_bps[HBP_NUM ];
arch/x86/include/asm/segment.h +39 -10
74 lines not on this page · raw message
arch/x86/include/asm/setup.h +1 -0
@@ -6,6 +6,7 @@#define COMMAND_LINE_SIZE 2048#include <linux/linkage.h> +#include <asm/page_types.h> #ifdef __i386__
arch/x86/include/asm/switch_to.h +1 -3
@@ -39,8 +39,7 @@ do { \*/ \unsigned long ebx, ecx, edx, esi, edi; \ \ - asmvolatile ("pushfl\n\t" /* save flags */ \ -"pushl %%ebp\n\t" /* save EBP */ \ + asmvolatile ("pushl %%ebp\n\t" /* save EBP */ \"movl %%esp,%[prev_sp]\n\t" /* save ESP */ \"movl %[next_sp],%%esp\n\t" /* restore ESP */ \ "movl $1f,%[prev_ip]\n\t" /* save EIP */ \
@@ -49,7 +48,6 @@ do { \"jmp __switch_to\n" /* regparm call */ \"1:\t" \"popl %%ebp\n\t" /* restore EBP */ \ -"popfl\n" /* restore flags */ \ \/* output parameters */ \ : [prev_sp] "=m" (prev->thread.sp), \
arch/x86/include/asm/text-patching.h new file +40 -0
@@ -0,0 +1,40 @@ +#ifndef _ASM_X86_TEXT_PATCHING_H +#define _ASM_X86_TEXT_PATCHING_H + +#include <linux/types.h> +#include <linux/stddef.h> +#include <asm/ptrace.h> + +struct paravirt_patch_site ; +#ifdef CONFIG_PARAVIRT +void apply_paravirt (struct paravirt_patch_site *start, +struct paravirt_patch_site *end); +#else +static inline void apply_paravirt (struct paravirt_patch_site *start, +struct paravirt_patch_site *end) +{} +#define __parainstructions NULL +#define __parainstructions_end NULL +#endif + +extern void *text_poke_early (void *addr,const void *opcode,size_t len); + +/* +* Clear and restore the kernel write-protection flag on the local CPU. +* Allows the kernel to edit read-only pages. +* Side-effect: any interrupt handler running between save and restore will have +* the ability to write to read-only pages. +* +* Warning: +* Code patching in the UP case is safe if NMIs and MCE handlers are stopped and +* no thread can be preempted in the instructions being modified (no iret to an +* invalid instruction possible) or if the instructions are changed from a +* consistent state to another consistent state atomically. +* On the local CPU you need to be protected again NMI or MCE handlers seeing an +* inconsistent instruction while you patch. +*/ +extern void *text_poke (void *addr,const void *opcode,size_t len); +extern int poke_int3_handler (struct pt_regs *regs); +extern void *text_poke_bp (void *addr,const void *opcode,size_t len,void *handler); + +#endif /* _ASM_X86_TEXT_PATCHING_H */
arch/x86/include/asm/thread_info.h +1 -1
@@ -255,7 +255,7 @@ static inline bool test_and_clear_restore_sigmask(void)return true; } -static inline bool is_ia32_task (void ) +static inline bool in_ia32_syscall (void ) {#ifdef CONFIG_X86_32 return true;
arch/x86/include/asm/tlbflush.h +1 -1
@@ -181,7 +181,7 @@ static inline void __native_flush_tlb_single(unsigned long addr)static inline void __flush_tlb_all (void ) { -if (cpu_has_pge) +if (static_cpu_has (X86_FEATURE_PGE ))__flush_tlb_global ();else __flush_tlb ();
arch/x86/include/asm/tsc.h +1 -1
@@ -22,7 +22,7 @@ extern void disable_TSC(void);static inline cycles_t get_cycles (void ) {#ifndef CONFIG_X86_TSC -if (!cpu_has_tsc) +if (!boot_cpu_has (X86_FEATURE_TSC ))return 0 ;#endif
arch/x86/include/asm/uaccess.h +1 -1
@@ -110,7 +110,7 @@ struct exception_table_entry {extern int fixup_exception (struct pt_regs *regs,int trapnr);extern bool ex_has_fault_handler (unsigned long ip); -extern int early_fixup_exception (unsigned long *ip); +extern void early_fixup_exception (struct pt_regs *regs,int trapnr);/* * These are the main single-value transfer routines. They automatically
arch/x86/include/asm/xor_32.h +1 -1
@@ -550,7 +550,7 @@ static struct xor_block_template xor_block_pIII_sse = {#define XOR_TRY_TEMPLATES \ do { \ AVX_XOR_SPEED; \ - if (cpu_has_xmm) { \ + if (boot_cpu_has(X86_FEATURE_XMM)) { \ xor_speed(&xor_block_pIII_sse); \ xor_speed(&xor_block_sse_pf64); \ } else if (boot_cpu_has(X86_FEATURE_MMX)) { \
arch/x86/include/asm/xor_avx.h +2 -2
@@ -167,12 +167,12 @@ static struct xor_block_template xor_block_avx = {#define AVX_XOR_SPEED \ do { \ - if (cpu_has_avx && cpu_has_osxsave) \ + if (boot_cpu_has(X86_FEATURE_AVX) && boot_cpu_has(X86_FEATURE_OSXSAVE)) \ xor_speed(&xor_block_avx); \ } while (0)#define AVX_SELECT (FASTEST ) \ - (cpu_has_avx && cpu_has_osxsave ? &xor_block_avx : FASTEST) + (boot_cpu_has(X86_FEATURE_AVX) && boot_cpu_has(X86_FEATURE_OSXSAVE) ? &xor_block_avx : FASTEST)#else
arch/x86/kernel/acpi/boot.c +4 -4
@@ -136,7 +136,7 @@ static int __init acpi_parse_madt(struct acpi_table_header *table) {struct acpi_table_madt *madt =NULL ; -if (!cpu_has_apic) +if (!boot_cpu_has (X86_FEATURE_APIC ))return -EINVAL ; madt = (struct acpi_table_madt *)table;
@@ -951,7 +951,7 @@ static int __init early_acpi_parse_madt_lapic_addr_ovr(void) {int count; -if (!cpu_has_apic) +if (!boot_cpu_has (X86_FEATURE_APIC ))return -ENODEV ;/*
@@ -979,7 +979,7 @@ static int __init acpi_parse_madt_lapic_entries(void)int ret;struct acpi_subtable_proc madt_proc[2 ]; -if (!cpu_has_apic) +if (!boot_cpu_has (X86_FEATURE_APIC ))return -ENODEV ;/*
@@ -1125,7 +1125,7 @@ static int __init acpi_parse_madt_ioapic_entries(void)if (acpi_disabled || acpi_noirq)return -ENODEV ; -if (!cpu_has_apic) +if (!boot_cpu_has (X86_FEATURE_APIC ))return -ENODEV ;/*
arch/x86/kernel/alternative.c +1 -0
@@ -11,6 +11,7 @@#include <linux/stop_machine.h> #include <linux/slab.h> #include <linux/kdebug.h> +#include <asm/text-patching.h> #include <asm/alternative.h> #include <asm/sections.h> #include <asm/pgtable.h>
arch/x86/kernel/apic/apic.c +16 -16
@@ -607,7 +607,7 @@ static void __init lapic_cal_handler(struct clock_event_device *dev)long tapic =apic_read (APIC_TMCCT );unsigned long pm =acpi_pm_read_early (); -if (cpu_has_tsc) +if (boot_cpu_has (X86_FEATURE_TSC )) tsc =rdtsc ();switch (lapic_cal_loops++) {
@@ -668,7 +668,7 @@ calibrate_by_pmtimer(long deltapm, long *delta, long *deltatsc) *delta = (long )res;/* Correct the tsc counter value */ -if (cpu_has_tsc) { +if (boot_cpu_has (X86_FEATURE_TSC )) { res = (((u64)(*deltatsc)) * pm_100ms);do_div (res, deltapm); apic_printk(APIC_VERBOSE, "TSC delta adjusted to "
@@ -760,7 +760,7 @@ static int __init calibrate_APIC_clock(void)apic_printk (APIC_VERBOSE ,"..... calibration result: %u\n" , lapic_timer_frequency); -if (cpu_has_tsc) { +if (boot_cpu_has (X86_FEATURE_TSC )) { apic_printk(APIC_VERBOSE, "..... CPU clock speed is " "%ld.%04ld MHz.\n", (deltatsc / LAPIC_CAL_LOOPS) / (1000000 / HZ),
@@ -1085,7 +1085,7 @@ void lapic_shutdown(void) {unsigned long flags; -if (!cpu_has_apic && !apic_from_smp_config ()) +if (!boot_cpu_has (X86_FEATURE_APIC ) && !apic_from_smp_config ())return ;local_irq_save (flags);
@@ -1134,7 +1134,7 @@ void __init init_bsp_APIC(void)* Don't do the setup now if we have a SMP BIOS as the * through-I/O-APIC virtual wire mode might be active. */ -if (smp_found_config || !cpu_has_apic) +if (smp_found_config || !boot_cpu_has (X86_FEATURE_APIC ))return ;/*
@@ -1227,7 +1227,7 @@ void setup_local_APIC(void)unsigned long long tsc =0 , ntsc;long long max_loops = cpu_khz ? cpu_khz :1000000 ; -if (cpu_has_tsc) +if (boot_cpu_has (X86_FEATURE_TSC )) tsc =rdtsc ();if (disable_apic) {
@@ -1311,7 +1311,7 @@ void setup_local_APIC(void)break ; }if (queued) { -if (cpu_has_tsc && cpu_khz) { +if (boot_cpu_has (X86_FEATURE_TSC ) && cpu_khz) { ntsc =rdtsc (); max_loops = (cpu_khz <<10 ) - (ntsc - tsc); }else
@@ -1445,7 +1445,7 @@ static void __x2apic_disable(void) {u64 msr; -if (!cpu_has_apic) +if (!boot_cpu_has (X86_FEATURE_APIC ))return ;rdmsrl (MSR_IA32_APICBASE , msr);
@@ -1561,7 +1561,7 @@ void __init check_x2apic(void)pr_info ("x2apic: enabled by BIOS, switching to x2apic ops\n" ); x2apic_mode =1 ; x2apic_state =X2APIC_ON ; - }else if (!cpu_has_x2apic) { + }else if (!boot_cpu_has (X86_FEATURE_X2APIC )) { x2apic_state =X2APIC_DISABLED ; } }
@@ -1632,7 +1632,7 @@ void __init enable_IR_x2apic(void)*/ static int __init detect_init_APIC (void ) { -if (!cpu_has_apic) { +if (!boot_cpu_has (X86_FEATURE_APIC )) {pr_info ("No local APIC present\n" );return -1 ; }
@@ -1711,14 +1711,14 @@ static int __init detect_init_APIC(void) goto no_apic;case X86_VENDOR_INTEL :if (boot_cpu_data.x86 ==6 || boot_cpu_data.x86 ==15 || - (boot_cpu_data.x86 ==5 && cpu_has_apic)) + (boot_cpu_data.x86 ==5 &&boot_cpu_has (X86_FEATURE_APIC )))break ; goto no_apic;default : goto no_apic; } -if (!cpu_has_apic) { +if (!boot_cpu_has (X86_FEATURE_APIC )) {/* * Over-ride BIOS and try to enable the local APIC only if * "lapic" specified.
@@ -2233,19 +2233,19 @@ int __init APIC_init_uniprocessor(void)return -1 ; }#ifdef CONFIG_X86_64 -if (!cpu_has_apic) { +if (!boot_cpu_has (X86_FEATURE_APIC )) { disable_apic =1 ;pr_info ("Apic disabled by BIOS\n" );return -1 ; }#else -if (!smp_found_config && !cpu_has_apic) +if (!smp_found_config && !boot_cpu_has (X86_FEATURE_APIC ))return -1 ;/* * Complain if the BIOS pretends there is one. */ -if (!cpu_has_apic && +if (!boot_cpu_has (X86_FEATURE_APIC ) &&APIC_INTEGRATED (apic_version[boot_cpu_physical_apicid])) {pr_err ("BIOS bug, local APIC 0x%x not detected!...\n" , boot_cpu_physical_apicid);
@@ -2426,7 +2426,7 @@ static void apic_pm_activate(void)static int __init init_lapic_sysfs (void ) {/* XXX: remove suspend/resume procs if !apic_pm_state.active? */ -if (cpu_has_apic) +if (boot_cpu_has (X86_FEATURE_APIC ))register_syscore_ops (&lapic_syscore_ops);return 0 ;
arch/x86/kernel/apic/apic_noop.c +2 -2
@@ -100,13 +100,13 @@ static void noop_vector_allocation_domain(int cpu, struct cpumask *retmask,static u32 noop_apic_read (u32 reg) { -WARN_ON_ONCE ((cpu_has_apic && !disable_apic)); +WARN_ON_ONCE (boot_cpu_has (X86_FEATURE_APIC ) && !disable_apic);return 0 ; }static void noop_apic_write (u32 reg,u32 v) { -WARN_ON_ONCE (cpu_has_apic && !disable_apic); +WARN_ON_ONCE (boot_cpu_has (X86_FEATURE_APIC ) && !disable_apic); }struct apic apic_noop = {
arch/x86/kernel/apic/io_apic.c +1 -1
@@ -1454,7 +1454,7 @@ void native_disable_io_apic(void)ioapic_write_entry (ioapic_i8259.apic, ioapic_i8259.pin, entry); } -if (cpu_has_apic ||apic_from_smp_config ()) +if (boot_cpu_has (X86_FEATURE_APIC ) ||apic_from_smp_config ())disconnect_bsp_APIC (ioapic_i8259.pin !=-1 ); }
arch/x86/kernel/apic/ipi.c +1 -1
@@ -230,7 +230,7 @@ int safe_smp_processor_id(void) {int apicid, cpuid; -if (!cpu_has_apic) +if (!boot_cpu_has (X86_FEATURE_APIC ))return 0 ; apicid =hard_smp_processor_id ();
arch/x86/kernel/apic/vector.c +1 -1
@@ -944,7 +944,7 @@ static int __init print_ICs(void)print_PIC ();/* don't print out if apic is not there */ -if (!cpu_has_apic && !apic_from_smp_config ()) +if (!boot_cpu_has (X86_FEATURE_APIC ) && !apic_from_smp_config ())return 0 ;print_local_APICs (show_lapic);
arch/x86/kernel/cpu/amd.c +12 -8
@@ -565,14 +565,17 @@ static void early_init_amd(struct cpuinfo_x86 *c)* can safely set X86_FEATURE_EXTD_APICID unconditionally for families * after 16h. */ -if (cpu_has_apic && c->x86 >0x16 ) { -set_cpu_cap (c,X86_FEATURE_EXTD_APICID ); - }else if (cpu_has_apic && c->x86 >=0xf ) { -/* check CPU config space for extended APIC ID */ -unsigned int val; - val =read_pci_config (0 ,24 ,0 ,0x68 ); -if ((val & ((1 <<17 ) | (1 <<18 ))) == ((1 <<17 ) | (1 <<18 ))) +if (boot_cpu_has (X86_FEATURE_APIC )) { +if (c->x86 >0x16 )set_cpu_cap (c,X86_FEATURE_EXTD_APICID ); +else if (c->x86 >=0xf ) { +/* check CPU config space for extended APIC ID */ +unsigned int val; + + val =read_pci_config (0 ,24 ,0 ,0x68 ); +if ((val >>17 &0x3 ) ==0x3 ) +set_cpu_cap (c,X86_FEATURE_EXTD_APICID ); + } }#endif
@@ -628,6 +631,7 @@ static void init_amd_k8(struct cpuinfo_x86 *c)*/ msr_set_bit (MSR_K7_HWCR ,6 );#endif +set_cpu_bug (c,X86_BUG_SWAPGS_FENCE ); }static void init_amd_gh (struct cpuinfo_x86 *c)
@@ -746,7 +750,7 @@ static void init_amd(struct cpuinfo_x86 *c)if (c->x86 >=0xf )set_cpu_cap (c,X86_FEATURE_K8 ); -if (cpu_has_xmm2) { +if (cpu_has (c,X86_FEATURE_XMM2 )) {/* MFENCE stops RDTSC speculation */ set_cpu_cap (c,X86_FEATURE_MFENCE_RDTSC ); }
arch/x86/kernel/cpu/common.c +56 -26
125 lines not on this page · raw message
arch/x86/kernel/cpu/cyrix.c +1 -1
@@ -333,7 +333,7 @@ static void init_cyrix(struct cpuinfo_x86 *c)switch (dir0_lsn) {case 0xd :/* either a 486SLC or DLC w/o DEVID */ dir0_msn =0 ; - p = Cx486_name[(cpu_has_fpu ?1 :0 )]; + p = Cx486_name[!!boot_cpu_has (X86_FEATURE_FPU )];break ;case 0xe :/* a 486S A step */
arch/x86/kernel/cpu/intel.c +6 -6
@@ -152,9 +152,9 @@ static void early_init_intel(struct cpuinfo_x86 *c)* the TLB when any changes are made to any of the page table entries. * The operating system must reload CR3 to cause the TLB to be flushed" * -* As a result cpu_has_pge() in arch/x86/include/asm/tlbflush.h should -* be false so that __flush_tlb_all() causes CR3 insted of CR4.PGE -* to be modified +* As a result, boot_cpu_has(X86_FEATURE_PGE) in arch/x86/include/asm/tlbflush.h +* should be false so that __flush_tlb_all() causes CR3 insted of CR4.PGE +* to be modified. */ if (c->x86 ==5 && c->x86_model ==9 ) {pr_info ("Disabling PGE capability bit\n" );
@@ -281,7 +281,7 @@ static void intel_workarounds(struct cpuinfo_x86 *c)* integrated APIC (see 11AP erratum in "Pentium Processor * Specification Update"). */ -if (cpu_has_apic && (c->x86<<8 | c->x86_model<<4 ) ==0x520 && +if (boot_cpu_has (X86_FEATURE_APIC ) && (c->x86<<8 | c->x86_model<<4 ) ==0x520 && (c->x86_mask <0x6 || c->x86_mask ==0xb ))set_cpu_bug (c,X86_BUG_11AP );
@@ -456,7 +456,7 @@ static void init_intel(struct cpuinfo_x86 *c)set_cpu_cap (c,X86_FEATURE_ARCH_PERFMON ); } -if (cpu_has_xmm2) +if (cpu_has (c,X86_FEATURE_XMM2 ))set_cpu_cap (c,X86_FEATURE_LFENCE_RDTSC );if (boot_cpu_has (X86_FEATURE_DS )) {
@@ -468,7 +468,7 @@ static void init_intel(struct cpuinfo_x86 *c)set_cpu_cap (c,X86_FEATURE_PEBS ); } -if (c->x86 ==6 && cpu_has_clflush && +if (c->x86 ==6 &&boot_cpu_has (X86_FEATURE_CLFLUSH ) && (c->x86_model ==29 || c->x86_model ==46 || c->x86_model ==47 ))set_cpu_bug (c,X86_BUG_CLFLUSH_MONITOR );
arch/x86/kernel/cpu/mcheck/mce_intel.c +1 -1
@@ -84,7 +84,7 @@ static int cmci_supported(int *banks)*/ if (boot_cpu_data.x86_vendor !=X86_VENDOR_INTEL )return 0 ; -if (!cpu_has_apic ||lapic_get_maxlvt () <6 ) +if (!boot_cpu_has (X86_FEATURE_APIC ) ||lapic_get_maxlvt () <6 )return 0 ;rdmsrl (MSR_IA32_MCG_CAP , cap); *banks =min_t (unsigned,MAX_NR_BANKS , cap &0xff );
arch/x86/kernel/cpu/mcheck/therm_throt.c +1 -1
@@ -450,7 +450,7 @@ asmlinkage __visible void smp_trace_thermal_interrupt(struct pt_regs *regs)/* Thermal monitoring depends on APIC, ACPI and clock modulation */ static int intel_thermal_supported (struct cpuinfo_x86 *c) { -if (!cpu_has_apic) +if (!boot_cpu_has (X86_FEATURE_APIC ))return 0 ;if (!cpu_has (c,X86_FEATURE_ACPI ) || !cpu_has (c,X86_FEATURE_ACC ))return 0 ;
arch/x86/kernel/cpu/mtrr/cyrix.c +2 -2
@@ -137,7 +137,7 @@ static void prepare_set(void)u32 cr0;/* Save value of CR4 and clear Page Global Enable (bit 7) */ -if (cpu_has_pge) { +if (boot_cpu_has (X86_FEATURE_PGE )) { cr4 =__read_cr4 ();__write_cr4 (cr4 & ~X86_CR4_PGE ); }
@@ -170,7 +170,7 @@ static void post_set(void)write_cr0 (read_cr0 () & ~X86_CR0_CD );/* Restore value of CR4 */ -if (cpu_has_pge) +if (boot_cpu_has (X86_FEATURE_PGE ))__write_cr4 (cr4); }
arch/x86/kernel/cpu/mtrr/generic.c +16 -12
@@ -444,11 +444,24 @@ static void __init print_mtrr_state(void)pr_debug ("TOM2: %016llx aka %lldM\n" , mtrr_tom2, mtrr_tom2>>20 ); } +/* PAT setup for BP. We need to go through sync steps here */ +void __init mtrr_bp_pat_init (void ) +{ +unsigned long flags; + +local_irq_save (flags); +prepare_set (); + +pat_init (); + +post_set (); +local_irq_restore (flags); +} +/* Grab all of the MTRR state for this CPU into *state */ bool __init get_mtrr_state (void ) {struct mtrr_var_range *vrs; -unsigned long flags;unsigned lo, dummy;unsigned int i;
@@ -481,15 +494,6 @@ bool __init get_mtrr_state(void) mtrr_state_set =1 ; -/* PAT setup for BP. We need to go through sync steps here */ -local_irq_save (flags); -prepare_set (); - -pat_init (); - -post_set (); -local_irq_restore (flags); -return !!(mtrr_state.enabled &MTRR_STATE_MTRR_ENABLED ); }
@@ -741,7 +745,7 @@ static void prepare_set(void) __acquires(set_atomicity_lock)wbinvd ();/* Save value of CR4 and clear Page Global Enable (bit 7) */ -if (cpu_has_pge) { +if (boot_cpu_has (X86_FEATURE_PGE )) { cr4 =__read_cr4 ();__write_cr4 (cr4 & ~X86_CR4_PGE ); }
@@ -771,7 +775,7 @@ static void post_set(void) __releases(set_atomicity_lock)write_cr0 (read_cr0 () & ~X86_CR0_CD );/* Restore value of CR4 */ -if (cpu_has_pge) +if (boot_cpu_has (X86_FEATURE_PGE ))__write_cr4 (cr4);raw_spin_unlock (&set_atomicity_lock); }
arch/x86/kernel/cpu/mtrr/main.c +12 -1
@@ -752,6 +752,9 @@ void __init mtrr_bp_init(void)/* BIOS may override */ __mtrr_enabled =get_mtrr_state (); +if (mtrr_enabled ()) +mtrr_bp_pat_init (); +if (mtrr_cleanup (phys_addr)) { changed_by_mtrr_cleanup =1 ; mtrr_if->set_all ();
@@ -759,8 +762,16 @@ void __init mtrr_bp_init(void) } } -if (!mtrr_enabled ()) +if (!mtrr_enabled ()) {pr_info ("MTRR: Disabled\n" ); + +/* +* PAT initialization relies on MTRR's rendezvous handler. +* Skip PAT init until the handler can initialize both +* features independently. +*/ +pat_disable ("MTRRs disabled, skipping PAT initialization too." ); + } }void mtrr_ap_init (void )
arch/x86/kernel/cpu/mtrr/mtrr.h +1 -0
@@ -52,6 +52,7 @@ void set_mtrr_prepare_save(struct set_mtrr_context *ctxt);void fill_mtrr_var_range (unsigned int index,u32 base_lo,u32 base_hi,u32 mask_lo,u32 mask_hi);bool get_mtrr_state (void ); +void mtrr_bp_pat_init (void );extern void set_mtrr_ops (const struct mtrr_ops *ops);
arch/x86/kernel/cpu/vmware.c +1 -1
@@ -94,7 +94,7 @@ static void __init vmware_platform_setup(void)*/ static uint32_t __init vmware_platform (void ) { -if (cpu_has_hypervisor) { +if (boot_cpu_has (X86_FEATURE_HYPERVISOR )) {unsigned int eax;unsigned int hyper_vendor_id[3 ];
arch/x86/kernel/devicetree.c +1 -1
@@ -151,7 +151,7 @@ static void __init dtb_lapic_setup(void)return ;/* Did the boot loader setup the local APIC ? */ -if (!cpu_has_apic) { +if (!boot_cpu_has (X86_FEATURE_APIC )) {if (apic_force_enable (r.start))return ; }
arch/x86/kernel/fpu/bugs.c +5 -11
@@ -21,11 +21,15 @@ static double __initdata y = 3145727.0;* We should really only care about bugs here * anyway. Not features. */ -static void __init check_fpu (void ) +void __init fpu__init_check_bugs (void ) {u32 cr0_saved;s32 fdiv_bug; +/* kernel_fpu_begin/end() relies on patched alternative instructions. */ +if (!boot_cpu_has (X86_FEATURE_FPU )) +return ; +/* We might have CR0::TS set already, clear it: */ cr0_saved =read_cr0 ();write_cr0 (cr0_saved & ~X86_CR0_TS );
@@ -59,13 +63,3 @@ static void __init check_fpu(void)pr_warn ("Hmm, FPU with FDIV bug\n" ); } } - -void __init fpu__init_check_bugs (void ) -{ -/* -* kernel_fpu_begin/end() in check_fpu() relies on the patched -* alternative instructions. -*/ -if (cpu_has_fpu) -check_fpu (); -}
arch/x86/kernel/fpu/core.c +16 -34
87 lines not on this page · raw message
arch/x86/kernel/fpu/init.c +8 -8
@@ -29,22 +29,22 @@ static void fpu__init_cpu_generic(void)unsigned long cr0;unsigned long cr4_mask =0 ; -if (cpu_has_fxsr) +if (boot_cpu_has (X86_FEATURE_FXSR )) cr4_mask |=X86_CR4_OSFXSR ; -if (cpu_has_xmm) +if (boot_cpu_has (X86_FEATURE_XMM )) cr4_mask |=X86_CR4_OSXMMEXCPT ;if (cr4_mask)cr4_set_bits (cr4_mask); cr0 =read_cr0 (); cr0 &= ~(X86_CR0_TS |X86_CR0_EM );/* clear TS and EM */ -if (!cpu_has_fpu) +if (!boot_cpu_has (X86_FEATURE_FPU )) cr0 |=X86_CR0_EM ;write_cr0 (cr0);/* Flush out any pending x87 state: */ #ifdef CONFIG_MATH_EMULATION -if (!cpu_has_fpu) +if (!boot_cpu_has (X86_FEATURE_FPU ))fpstate_init_soft (¤t->thread.fpu.state.soft); else#endif
@@ -89,7 +89,7 @@ static void fpu__init_system_early_generic(struct cpuinfo_x86 *c) }#ifndef CONFIG_MATH_EMULATION -if (!cpu_has_fpu) { +if (!boot_cpu_has (X86_FEATURE_FPU )) {pr_emerg ("x86/fpu: Giving up, no FPU found and no math emulation present\n" );for (;;) asmvolatile ("hlt" );
@@ -106,7 +106,7 @@ static void __init fpu__init_system_mxcsr(void) {unsigned int mask =0 ; -if (cpu_has_fxsr) { +if (boot_cpu_has (X86_FEATURE_FXSR )) {/* Static because GCC does not get 16-byte stack alignment right: */ static struct fxregs_state fxregs__initdata ;
@@ -212,7 +212,7 @@ static void __init fpu__init_system_xstate_size_legacy(void)* fpu__init_system_xstate(). */ -if (!cpu_has_fpu) { +if (!boot_cpu_has (X86_FEATURE_FPU )) {/* * Disable xsave as we do not support it if i387 * emulation is enabled.
@@ -221,7 +221,7 @@ static void __init fpu__init_system_xstate_size_legacy(void)setup_clear_cpu_cap (X86_FEATURE_XSAVEOPT ); xstate_size =sizeof (struct swregs_state ); }else { -if (cpu_has_fxsr) +if (boot_cpu_has (X86_FEATURE_FXSR )) xstate_size =sizeof (struct fxregs_state );else xstate_size =sizeof (struct fregs_state );
arch/x86/kernel/fpu/regset.c +14 -11
@@ -21,7 +21,10 @@ int regset_xregset_fpregs_active(struct task_struct *target, const struct user_r {struct fpu *target_fpu = &target->thread.fpu; -return (cpu_has_fxsr && target_fpu->fpstate_active) ? regset->n :0 ; +if (boot_cpu_has (X86_FEATURE_FXSR ) && target_fpu->fpstate_active) +return regset->n; +else +return 0 ; } int xfpregs_get(struct task_struct *target, const struct user_regset *regset,
@@ -30,7 +33,7 @@ int xfpregs_get(struct task_struct *target, const struct user_regset *regset, {struct fpu *fpu = &target->thread.fpu; -if (!cpu_has_fxsr) +if (!boot_cpu_has (X86_FEATURE_FXSR ))return -ENODEV ;fpu__activate_fpstate_read (fpu);
@@ -47,7 +50,7 @@ int xfpregs_set(struct task_struct *target, const struct user_regset *regset,struct fpu *fpu = &target->thread.fpu;int ret; -if (!cpu_has_fxsr) +if (!boot_cpu_has (X86_FEATURE_FXSR ))return -ENODEV ;fpu__activate_fpstate_write (fpu);
@@ -65,7 +68,7 @@ int xfpregs_set(struct task_struct *target, const struct user_regset *regset,* update the header bits in the xsave header, indicating the * presence of FP and SSE state. */ -if (cpu_has_xsave) +if (boot_cpu_has (X86_FEATURE_XSAVE )) fpu->state.xsave.header.xfeatures |=XFEATURE_MASK_FPSSE ;return ret;
@@ -79,7 +82,7 @@ int xstateregs_get(struct task_struct *target, const struct user_regset *regset,struct xregs_state *xsave;int ret; -if (!cpu_has_xsave) +if (!boot_cpu_has (X86_FEATURE_XSAVE ))return -ENODEV ;fpu__activate_fpstate_read (fpu);
@@ -108,7 +111,7 @@ int xstateregs_set(struct task_struct *target, const struct user_regset *regset,struct xregs_state *xsave;int ret; -if (!cpu_has_xsave) +if (!boot_cpu_has (X86_FEATURE_XSAVE ))return -ENODEV ;fpu__activate_fpstate_write (fpu);
@@ -275,10 +278,10 @@ int fpregs_get(struct task_struct *target, const struct user_regset *regset,fpu__activate_fpstate_read (fpu); -if (!static_cpu_has (X86_FEATURE_FPU )) +if (!boot_cpu_has (X86_FEATURE_FPU ))return fpregs_soft_get (target, regset, pos, count, kbuf, ubuf); -if (!cpu_has_fxsr) +if (!boot_cpu_has (X86_FEATURE_FXSR ))return user_regset_copyout (&pos, &count, &kbuf, &ubuf, &fpu->state.fsave,0 ,-1 );
@@ -306,10 +309,10 @@ int fpregs_set(struct task_struct *target, const struct user_regset *regset,fpu__activate_fpstate_write (fpu);fpstate_sanitize_xstate (fpu); -if (!static_cpu_has (X86_FEATURE_FPU )) +if (!boot_cpu_has (X86_FEATURE_FPU ))return fpregs_soft_set (target, regset, pos, count, kbuf, ubuf); -if (!cpu_has_fxsr) +if (!boot_cpu_has (X86_FEATURE_FXSR ))return user_regset_copyin (&pos, &count, &kbuf, &ubuf, &fpu->state.fsave,0 ,-1 );
@@ -325,7 +328,7 @@ int fpregs_set(struct task_struct *target, const struct user_regset *regset,* update the header bit in the xsave header, indicating the * presence of FP. */ -if (cpu_has_xsave) +if (boot_cpu_has (X86_FEATURE_XSAVE )) fpu->state.xsave.header.xfeatures |=XFEATURE_MASK_FP ;return ret; }
arch/x86/kernel/fpu/xstate.c +9 -9
@@ -190,7 +190,7 @@ void fpstate_sanitize_xstate(struct fpu *fpu)*/ void fpu__init_cpu_xstate (void ) { -if (!cpu_has_xsave || !xfeatures_mask) +if (!boot_cpu_has (X86_FEATURE_XSAVE ) || !xfeatures_mask)return ;cr4_set_bits (X86_CR4_OSXSAVE );
@@ -280,7 +280,7 @@ static void __init setup_xstate_comp(void) xstate_comp_offsets[0 ] =0 ; xstate_comp_offsets[1 ] = offsetof(struct fxregs_state , xmm_space); -if (!cpu_has_xsaves) { +if (!boot_cpu_has (X86_FEATURE_XSAVES )) {for (i =FIRST_EXTENDED_XFEATURE ; i <XFEATURE_MAX ; i++) {if (xfeature_enabled (i)) { xstate_comp_offsets[i] = xstate_offsets[i];
@@ -316,13 +316,13 @@ static void __init setup_init_fpu_buf(void)WARN_ON_FPU (!on_boot_cpu); on_boot_cpu =0 ; -if (!cpu_has_xsave) +if (!boot_cpu_has (X86_FEATURE_XSAVE ))return ;setup_xstate_features ();print_xstate_features (); -if (cpu_has_xsaves) { +if (boot_cpu_has (X86_FEATURE_XSAVES )) { init_fpstate.xsave.header.xcomp_bv = (u64 )1 <<63 | xfeatures_mask; init_fpstate.xsave.header.xfeatures = xfeatures_mask; }
@@ -417,7 +417,7 @@ static int xfeature_size(int xfeature_nr)*/ static int using_compacted_format (void ) { -return cpu_has_xsaves; +return boot_cpu_has (X86_FEATURE_XSAVES ); }static void __xstate_dump_leaves (void )
@@ -549,7 +549,7 @@ static unsigned int __init calculate_xstate_size(void)unsigned int eax, ebx, ecx, edx;unsigned int calculated_xstate_size; -if (!cpu_has_xsaves) { +if (!boot_cpu_has (X86_FEATURE_XSAVES )) {/* * - CPUID function 0DH, sub-function 0: * EBX enumerates the size (in bytes) required by
@@ -630,7 +630,7 @@ void __init fpu__init_system_xstate(void)WARN_ON_FPU (!on_boot_cpu); on_boot_cpu =0 ; -if (!cpu_has_xsave) { +if (!boot_cpu_has (X86_FEATURE_XSAVE )) {pr_info ("x86/fpu: Legacy x87 FPU detected.\n" );return ; }
@@ -667,7 +667,7 @@ void __init fpu__init_system_xstate(void)pr_info ("x86/fpu: Enabled xstate features 0x%llx, context size is %d bytes, using '%s' format.\n" , xfeatures_mask, xstate_size, - cpu_has_xsaves ?"compacted" :"standard" ); +boot_cpu_has (X86_FEATURE_XSAVES ) ?"compacted" :"standard" ); }/*
@@ -678,7 +678,7 @@ void fpu__resume_cpu(void)/* * Restore XCR0 on xsave capable CPUs: */ -if (cpu_has_xsave) +if (boot_cpu_has (X86_FEATURE_XSAVE ))xsetbv (XCR_XFEATURE_ENABLED_MASK , xfeatures_mask); }
arch/x86/kernel/head_32.S +49 -67
140 lines not on this page · raw message
arch/x86/kernel/head_64.S +35 -68
137 lines not on this page · raw message
arch/x86/kernel/hpet.c +0 -1
@@ -773,7 +773,6 @@ static struct clocksource clocksource_hpet = { .mask = HPET_MASK, .flags = CLOCK_SOURCE_IS_CONTINUOUS, .resume = hpet_resume_counter, - .archdata = { .vclock_mode = VCLOCK_HPET }, };static int hpet_clocksource_register (void )
arch/x86/kernel/jump_label.c +1 -0
@@ -13,6 +13,7 @@#include <linux/cpu.h> #include <asm/kprobes.h> #include <asm/alternative.h> +#include <asm/text-patching.h> #ifdef HAVE_JUMP_LABEL
arch/x86/kernel/kgdb.c +1 -0
@@ -45,6 +45,7 @@#include <linux/uaccess.h> #include <linux/memory.h> +#include <asm/text-patching.h> #include <asm/debugreg.h> #include <asm/apicdef.h> #include <asm/apic.h>
arch/x86/kernel/kprobes/core.c +1 -0
@@ -51,6 +51,7 @@#include <linux/ftrace.h> #include <linux/frame.h> +#include <asm/text-patching.h> #include <asm/cacheflush.h> #include <asm/desc.h> #include <asm/pgtable.h>
arch/x86/kernel/kprobes/opt.c +1 -0
@@ -29,6 +29,7 @@#include <linux/kallsyms.h> #include <linux/ftrace.h> +#include <asm/text-patching.h> #include <asm/cacheflush.h> #include <asm/desc.h> #include <asm/pgtable.h>
arch/x86/kernel/kvm.c +1 -1
@@ -522,7 +522,7 @@ static noinline uint32_t __kvm_cpuid_base(void)if (boot_cpu_data.cpuid_level <0 )return 0 ;/* So we don't blow up on old processors */ -if (cpu_has_hypervisor) +if (boot_cpu_has (X86_FEATURE_HYPERVISOR ))return hypervisor_cpuid_base ("KVMKVMKVM\0\0\0" ,0 );return 0 ;
arch/x86/kernel/module.c +1 -0
@@ -31,6 +31,7 @@#include <linux/jump_label.h> #include <linux/random.h> +#include <asm/text-patching.h> #include <asm/page.h> #include <asm/pgtable.h> #include <asm/setup.h>
arch/x86/kernel/paravirt.c +4 -2
@@ -339,8 +339,10 @@ __visible struct pv_cpu_ops pv_cpu_ops = { .write_cr8 = native_write_cr8, #endif .wbinvd = native_wbinvd, - .read_msr = native_read_msr_safe, - .write_msr = native_write_msr_safe, + .read_msr = native_read_msr, + .write_msr = native_write_msr, + .read_msr_safe = native_read_msr_safe, + .write_msr_safe = native_write_msr_safe, .read_pmc = native_read_pmc, .load_tr_desc = native_load_tr_desc, .set_ldt = native_set_ldt,
arch/x86/kernel/process_64.c +113 -128
310 lines not on this page · raw message
arch/x86/kernel/ptrace.c +9 -41
90 lines not on this page · raw message
arch/x86/kernel/signal.c +3 -3
@@ -391,7 +391,7 @@ static int __setup_rt_frame(int sig, struct ksignal *ksig,put_user_ex (&frame->uc, &frame->puc);/* Create the ucontext. */ -if (cpu_has_xsave) +if (boot_cpu_has (X86_FEATURE_XSAVE ))put_user_ex (UC_FP_XSTATE , &frame->uc.uc_flags);else put_user_ex (0 , &frame->uc.uc_flags);
@@ -442,7 +442,7 @@ static unsigned long frame_uc_flags(struct pt_regs *regs) {unsigned long flags; -if (cpu_has_xsave) +if (boot_cpu_has (X86_FEATURE_XSAVE )) flags =UC_FP_XSTATE |UC_SIGCONTEXT_SS ;else flags =UC_SIGCONTEXT_SS ;
@@ -762,7 +762,7 @@ handle_signal(struct ksignal *ksig, struct pt_regs *regs)static inline unsigned long get_nr_restart_syscall (const struct pt_regs *regs) {#ifdef CONFIG_X86_64 -if (is_ia32_task ()) +if (in_ia32_syscall ())return __NR_ia32_restart_syscall;#endif #ifdef CONFIG_X86_X32_ABI
arch/x86/kernel/smpboot.c +1 -1
@@ -1231,7 +1231,7 @@ static int __init smp_sanity_check(unsigned max_cpus)* If we couldn't find a local APIC, then get out of here now! */ if (APIC_INTEGRATED (apic_version[boot_cpu_physical_apicid]) && - !cpu_has_apic) { + !boot_cpu_has (X86_FEATURE_APIC )) {if (!disable_apic) {pr_err ("BIOS bug, local APIC #%d not detected!...\n" , boot_cpu_physical_apicid);
arch/x86/kernel/tce_64.c +1 -1
@@ -40,7 +40,7 @@static inline void flush_tce (void * tceaddr) {/* a single tce can't cross a cache line */ -if (cpu_has_clflush) +if (boot_cpu_has (X86_FEATURE_CLFLUSH ))clflush (tceaddr);else wbinvd ();
arch/x86/kernel/tls.c +42 -0
54 lines not on this page · raw message
arch/x86/kernel/traps.c +1 -0
@@ -51,6 +51,7 @@#include <asm/processor.h> #include <asm/debugreg.h> #include <linux/atomic.h> +#include <asm/text-patching.h> #include <asm/ftrace.h> #include <asm/traps.h> #include <asm/desc.h>
arch/x86/kernel/tsc.c +15 -18
@@ -36,7 +36,7 @@ static int __read_mostly tsc_unstable;/* native_sched_clock() is called before tsc_init(), so we must start with the TSC soft disabled to prevent -erroneous rdtsc usage on !cpu_has_tsc processors */ +erroneous rdtsc usage on !boot_cpu_has(X86_FEATURE_TSC) processors */ static int __read_mostly tsc_disabled =-1 ;static DEFINE_STATIC_KEY_FALSE (__use_tsc);
@@ -834,15 +834,15 @@ int recalibrate_cpu_khz(void)#ifndef CONFIG_SMP unsigned long cpu_khz_old = cpu_khz; -if (cpu_has_tsc) { - tsc_khz = x86_platform.calibrate_tsc (); - cpu_khz = tsc_khz; -cpu_data (0 ).loops_per_jiffy = -cpufreq_scale (cpu_data (0 ).loops_per_jiffy, - cpu_khz_old, cpu_khz); -return 0 ; - }else +if (!boot_cpu_has (X86_FEATURE_TSC ))return -ENODEV ; + + tsc_khz = x86_platform.calibrate_tsc (); + cpu_khz = tsc_khz; +cpu_data (0 ).loops_per_jiffy =cpufreq_scale (cpu_data (0 ).loops_per_jiffy, + cpu_khz_old, cpu_khz); + +return 0 ;#else return -ENODEV ;#endif
@@ -922,9 +922,6 @@ static int time_cpufreq_notifier(struct notifier_block *nb, unsigned long val,struct cpufreq_freqs *freq = data;unsigned long *lpj; -if (cpu_has (&cpu_data (freq->cpu),X86_FEATURE_CONSTANT_TSC )) -return 0 ; - lpj = &boot_cpu_data.loops_per_jiffy;#ifdef CONFIG_SMP if (!(freq->flags &CPUFREQ_CONST_LOOPS ))
@@ -954,9 +951,9 @@ static struct notifier_block time_cpufreq_notifier_block = { .notifier_call = time_cpufreq_notifier }; -static int __init cpufreq_tsc (void ) +static int __init cpufreq_register_tsc_scaling (void ) { -if (!cpu_has_tsc) +if (!boot_cpu_has (X86_FEATURE_TSC ))return 0 ;if (boot_cpu_has (X86_FEATURE_CONSTANT_TSC ))return 0 ;
@@ -965,7 +962,7 @@ static int __init cpufreq_tsc(void) return 0; } -core_initcall (cpufreq_tsc); +core_initcall (cpufreq_register_tsc_scaling);#endif /* CONFIG_CPU_FREQ */
@@ -1081,7 +1078,7 @@ static void __init check_system_tsc_reliable(void)*/ int unsynchronized_tsc (void ) { -if (!cpu_has_tsc || tsc_unstable) +if (!boot_cpu_has (X86_FEATURE_TSC ) || tsc_unstable)return 1 ;#ifdef CONFIG_SMP
@@ -1205,7 +1202,7 @@ static void tsc_refine_calibration_work(struct work_struct *work)static int __init init_tsc_clocksource (void ) { -if (!cpu_has_tsc || tsc_disabled >0 || !tsc_khz) +if (!boot_cpu_has (X86_FEATURE_TSC ) || tsc_disabled >0 || !tsc_khz)return 0 ;if (tsc_clocksource_reliable)
@@ -1242,7 +1239,7 @@ void __init tsc_init(void)u64 lpj;int cpu; -if (!cpu_has_tsc) { +if (!boot_cpu_has (X86_FEATURE_TSC )) {setup_clear_cpu_cap (X86_FEATURE_TSC_DEADLINE_TIMER );return ; }
arch/x86/kernel/uprobes.c +1 -1
@@ -516,7 +516,7 @@ struct uprobe_xol_ops {static inline int sizeof_long (void ) { -return is_ia32_task () ?4 :8 ; +return in_ia32_syscall () ?4 :8 ; }static int default_pre_xol_op (struct arch_uprobe *auprobe,struct pt_regs *regs)
arch/x86/kvm/cpuid.c +1 -1
@@ -75,7 +75,7 @@ int kvm_update_cpuid(struct kvm_vcpu *vcpu)return 0 ;/* Update OSXSAVE bit */ -if (cpu_has_xsave && best->function ==0x1 ) { +if (boot_cpu_has (X86_FEATURE_XSAVE ) && best->function ==0x1 ) { best->ecx &= ~F (OSXSAVE );if (kvm_read_cr4_bits (vcpu,X86_CR4_OSXSAVE )) best->ecx |=F (OSXSAVE );
arch/x86/kvm/mmu.c +2 -1
@@ -3844,7 +3844,8 @@ reset_tdp_shadow_zero_bits_mask(struct kvm_vcpu *vcpu,__reset_rsvds_bits_mask (vcpu, &context->shadow_zero_check, boot_cpu_data.x86_phys_bits, context->shadow_root_level, false, - cpu_has_gbpages, true, true); +boot_cpu_has (X86_FEATURE_GBPAGES ), + true, true); else __reset_rsvds_bits_mask_ept(&context->shadow_zero_check, boot_cpu_data.x86_phys_bits,
arch/x86/kvm/svm.c +1 -1
@@ -1254,7 +1254,7 @@ static void svm_vcpu_put(struct kvm_vcpu *vcpu)kvm_load_ldt (svm->host.ldt);#ifdef CONFIG_X86_64 loadsegment (fs, svm->host.fs); -wrmsrl (MSR_KERNEL_GS_BASE , current->thread.gs); +wrmsrl (MSR_KERNEL_GS_BASE , current->thread.gsbase);load_gs_index (svm->host.gs);#else #ifdef CONFIG_X86_32_LAZY_GS
arch/x86/kvm/trace.h +1 -2
@@ -809,8 +809,7 @@ TRACE_EVENT(kvm_write_tsc_offset,#define host_clocks \ {VCLOCK_NONE, "none"}, \ - {VCLOCK_TSC, "tsc"}, \ - {VCLOCK_HPET, "hpet"} \ + {VCLOCK_TSC, "tsc"} \ TRACE_EVENT(kvm_update_master_clock, TP_PROTO(bool use_master_clock, unsigned int host_clock, bool offset_matched),
arch/x86/kvm/vmx.c +1 -1
@@ -3390,7 +3390,7 @@ static __init int setup_vmcs_config(struct vmcs_config *vmcs_conf) } } -if (cpu_has_xsaves) +if (boot_cpu_has (X86_FEATURE_XSAVES ))rdmsrl (MSR_IA32_XSS , host_xss);return 0 ;
arch/x86/kvm/x86.c +8 -8
@@ -2611,7 +2611,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) r =KVM_MAX_MCE_BANKS ;break ;case KVM_CAP_XCRS : - r = cpu_has_xsave; + r =boot_cpu_has (X86_FEATURE_XSAVE );break ;case KVM_CAP_TSC_CONTROL : r = kvm_has_tsc_control;
@@ -3094,7 +3094,7 @@ static void load_xsave(struct kvm_vcpu *vcpu, u8 *src)/* Set XSTATE_BV and possibly XCOMP_BV. */ xsave->header.xfeatures = xstate_bv; -if (cpu_has_xsaves) +if (boot_cpu_has (X86_FEATURE_XSAVES )) xsave->header.xcomp_bv = host_xcr0 |XSTATE_COMPACTION_ENABLED ;/*
@@ -3121,7 +3121,7 @@ static void load_xsave(struct kvm_vcpu *vcpu, u8 *src)static void kvm_vcpu_ioctl_x86_get_xsave (struct kvm_vcpu *vcpu,struct kvm_xsave *guest_xsave) { -if (cpu_has_xsave) { +if (boot_cpu_has (X86_FEATURE_XSAVE )) {memset (guest_xsave,0 ,sizeof (struct kvm_xsave ));fill_xsave ((u8 *) guest_xsave->region, vcpu); }else {
@@ -3139,7 +3139,7 @@ static int kvm_vcpu_ioctl_x86_set_xsave(struct kvm_vcpu *vcpu,u64 xstate_bv = *(u64 *)&guest_xsave->region[XSAVE_HDR_OFFSET /sizeof (u32)]; -if (cpu_has_xsave) { +if (boot_cpu_has (X86_FEATURE_XSAVE )) {/* * Here we allow setting states that are not present in * CPUID leaf 0xD, index 0, EDX:EAX. This is for compatibility
@@ -3160,7 +3160,7 @@ static int kvm_vcpu_ioctl_x86_set_xsave(struct kvm_vcpu *vcpu,static void kvm_vcpu_ioctl_x86_get_xcrs (struct kvm_vcpu *vcpu,struct kvm_xcrs *guest_xcrs) { -if (!cpu_has_xsave) { +if (!boot_cpu_has (X86_FEATURE_XSAVE )) { guest_xcrs->nr_xcrs =0 ;return ; }
@@ -3176,7 +3176,7 @@ static int kvm_vcpu_ioctl_x86_set_xcrs(struct kvm_vcpu *vcpu, {int i, r =0 ; -if (!cpu_has_xsave) +if (!boot_cpu_has (X86_FEATURE_XSAVE ))return -EINVAL ;if (guest_xcrs->nr_xcrs >KVM_MAX_XCRS || guest_xcrs->flags)
@@ -5865,7 +5865,7 @@ int kvm_arch_init(void *opaque)perf_register_guest_info_callbacks (&kvm_guest_cbs); -if (cpu_has_xsave) +if (boot_cpu_has (X86_FEATURE_XSAVE )) host_xcr0 =xgetbv (XCR_XFEATURE_ENABLED_MASK );kvm_lapic_init ();
@@ -7293,7 +7293,7 @@ int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)static void fx_init (struct kvm_vcpu *vcpu) {fpstate_init (&vcpu->arch.guest_fpu.state); -if (cpu_has_xsaves) +if (boot_cpu_has (X86_FEATURE_XSAVES )) vcpu->arch.guest_fpu.state.xsave.header.xcomp_bv = host_xcr0 |XSTATE_COMPACTION_ENABLED ;
arch/x86/lib/usercopy_32.c +2 -2
@@ -612,7 +612,7 @@ unsigned long __copy_from_user_ll_nocache(void *to, const void __user *from, {stac ();#ifdef CONFIG_X86_INTEL_USERCOPY -if (n >64 && cpu_has_xmm2) +if (n >64 &&static_cpu_has (X86_FEATURE_XMM2 )) n =__copy_user_zeroing_intel_nocache (to, from, n);else __copy_user_zeroing (to, from, n);
@@ -629,7 +629,7 @@ unsigned long __copy_from_user_ll_nocache_nozero(void *to, const void __user *fr {stac ();#ifdef CONFIG_X86_INTEL_USERCOPY -if (n >64 && cpu_has_xmm2) +if (n >64 &&static_cpu_has (X86_FEATURE_XMM2 )) n =__copy_user_intel_nocache (to, from, n);else __copy_user (to, from, n);
arch/x86/mm/extable.c +78 -18
59 lines not on this page · raw message
arch/x86/mm/pat.c +67 -42
109 lines not on this page · raw message
drivers/gpu/drm/i915/i915_gem_execbuffer.c +1 -1
Lines of this file are not shown. View the raw message.
drivers/staging/unisys/visorbus/visorchipset.c +1 -1
Lines of this file are not shown. View the raw message.
tools/testing/selftests/x86/fsgsbase.c new file +398 -0
398 lines not on this page · raw message
tools/testing/selftests/x86/ldt_gdt.c +250 -0
250 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
Part of the diff is not shown here. View the raw message.