x86/asm changes for v4.5
Subsystems (9)
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: 8705d603edd49f1cff165cd3b7998f4c7f098d27 x86/vsdo: Fix build on PARAVIRT_CLOCK=y, KVM_GUEST=n
The main changes in this cycle were:
- vDSO and asm entry improvements (Andy Lutomirski)
- Xen paravirt entry enhancements (Boris Ostrovsky)
- asm entry labels enhancement (Borislav Petkov)
- and other misc changes (Thomas Gleixner, me)
out-of-topic modifications in x86-asm-for-linus:
--------------------------------------------------
include/linux/context_tracking_state.h# ed11a7f1b3bd: context_tracking: Switch to
kernel/context_tracking.c # ed11a7f1b3bd: context_tracking: Switch to
Thanks,
Ingo
------------------>
Andy Lutomirski (10):
context_tracking: Switch to new static_branch API
x86/asm: Error out if asm/jump_label.h is included inappropriately x86/asm: Add asm macros for static keys/jump labels x86/entry/64: Bypass enter_from_user_mode on non-context-tracking boots x86/kvm: On KVM re-enable (e.g. after suspend), update clocks x86, vdso, pvclock: Simplify and speed up the vdso pvclock reader x86/vdso: Get pvclock data from the vvar VMA instead of the fixmap x86/vdso: Remove pvclock fixmap machinery
x86/vdso: Enable vdso pvclock access on all vdso variants x86/vsdo: Fix build on PARAVIRT_CLOCK=y, KVM_GUEST=n
Boris Ostrovsky (3):
x86/xen: Avoid fast syscall path for Xen PV guests x86/paravirt: Remove the unused irq_enable_sysexit pv op x86/entry, x86/paravirt: Remove the unused usergs_sysret32 PV op
Borislav Petkov (1):
x86/entry/64_compat: Make labels local
Ingo Molnar (1):
x86/platform/uv: Include clocksource.h for clocksource_touch_watchdog()
Thomas Gleixner (1):
Revert "x86/kvm: On KVM re-enable (e.g. after suspend), update clocks"
arch/x86/entry/calling.h | 15 ++++ arch/x86/entry/entry_32.S | 13 ++- arch/x86/entry/entry_64.S | 8 +- arch/x86/entry/entry_64_compat.S | 30 +++---- arch/x86/entry/vdso/vclock_gettime.c | 151 ++++++++++++++++----------------- arch/x86/entry/vdso/vdso-layout.lds.S | 3 +- arch/x86/entry/vdso/vdso2c.c | 3 + arch/x86/entry/vdso/vma.c | 14 +++ arch/x86/include/asm/cpufeature.h | 1 + arch/x86/include/asm/fixmap.h | 5 -- arch/x86/include/asm/jump_label.h | 63 ++++++++++++-- arch/x86/include/asm/paravirt.h | 12 --- arch/x86/include/asm/paravirt_types.h | 17 ---- arch/x86/include/asm/pvclock.h | 14 +-- arch/x86/include/asm/vdso.h | 1 + arch/x86/kernel/asm-offsets.c | 3 - arch/x86/kernel/asm-offsets_64.c | 1 - arch/x86/kernel/kvmclock.c | 11 ++- arch/x86/kernel/paravirt.c | 12 --- arch/x86/kernel/paravirt_patch_32.c | 2 - arch/x86/kernel/paravirt_patch_64.c | 3 - arch/x86/kernel/pvclock.c | 24 ------ arch/x86/platform/uv/uv_nmi.c | 1 + arch/x86/xen/enlighten.c | 7 +- arch/x86/xen/xen-asm_32.S | 14 --- arch/x86/xen/xen-asm_64.S | 19 ----- arch/x86/xen/xen-ops.h | 3 - include/linux/context_tracking_state.h | 4 +- kernel/context_tracking.c | 4 +- 29 files changed, 207 insertions(+), 251 deletions(-)
arch/x86/entry/calling.h +15 -0
@@ -1,3 +1,5 @@ +#include <linux/jump_label.h> +/* x86 function call convention, 64-bit:
@@ -232,3 +234,16 @@ For 32-bit we have the following conventions - kernel is built with#endif /* CONFIG_X86_64 */ +/* +* This does 'call enter_from_user_mode' unless we can avoid it based on +* kernel config or using the static jump infrastructure. +*/ +.macro CALL_enter_from_user_mode +#ifdef CONFIG_CONTEXT_TRACKING +#ifdef HAVE_JUMP_LABEL + STATIC_JUMP_IF_FALSE .Lafter_call_\@, context_tracking_enabled, def=0 +#endif +call enter_from_user_mode +.Lafter_call_\@: +#endif +.endm
arch/x86/entry/entry_32.S +5 -8
@@ -308,8 +308,9 @@ ENTRY(entry_SYSENTER_32) movl %esp, %eax call do_fast_syscall_32 - testl %eax, %eax - jz .Lsyscall_32_done + /* XEN PV guests always use IRET path */ + ALTERNATIVE "testl %eax, %eax; jz .Lsyscall_32_done", \ + "jmp .Lsyscall_32_done", X86_FEATURE_XENPV /* Opportunistic SYSEXIT */ TRACE_IRQS_ON /* User mode traces as IRQs on. */
@@ -328,7 +329,8 @@ ENTRY(entry_SYSENTER_32) * Return back to the vDSO, which will pop ecx and edx. * Don't bother with DS and ES (they already contain __USER_DS). */ - ENABLE_INTERRUPTS_SYSEXIT + sti + sysexit .pushsection .fixup, "ax" 2: movl $0, PT_FS(%esp)
@@ -551,11 +553,6 @@ ENTRY(native_iret) iret _ASM_EXTABLE(native_iret, iret_exc) END(native_iret) - -ENTRY(native_irq_enable_sysexit) - sti - sysexit -END(native_irq_enable_sysexit) #endif ENTRY(overflow)
arch/x86/entry/entry_64.S +2 -6
@@ -520,9 +520,7 @@ END(irq_entries_start) */ TRACE_IRQS_OFF -#ifdef CONFIG_CONTEXT_TRACKING - call enter_from_user_mode -#endif + CALL_enter_from_user_mode 1: /*
@@ -1066,9 +1064,7 @@ ENTRY(error_entry) * (which can take locks). */ TRACE_IRQS_OFF -#ifdef CONFIG_CONTEXT_TRACKING - call enter_from_user_mode -#endif + CALL_enter_from_user_mode ret .Lerror_entry_done:
arch/x86/entry/entry_64_compat.S +13 -17
@@ -18,13 +18,6 @@ .section .entry.text, "ax" -#ifdef CONFIG_PARAVIRT -ENTRY(native_usergs_sysret32) - swapgs - sysretl -ENDPROC(native_usergs_sysret32) -#endif - /* * 32-bit SYSENTER instruction entry. *
@@ -103,15 +96,15 @@ ENTRY(entry_SYSENTER_compat) * This needs to happen before enabling interrupts so that * we don't get preempted with NT set. * - * NB.: sysenter_fix_flags is a label with the code under it moved + * NB.: .Lsysenter_fix_flags is a label with the code under it moved * out-of-line as an optimization: NT is unlikely to be set in the * majority of the cases and instead of polluting the I$ unnecessarily, * we're keeping that code behind a branch which will predict as * not-taken and therefore its instructions won't be fetched. */ testl $X86_EFLAGS_NT, EFLAGS(%rsp) - jnz sysenter_fix_flags -sysenter_flags_fixed: + jnz .Lsysenter_fix_flags +.Lsysenter_flags_fixed: /* * User mode is traced as though IRQs are on, and SYSENTER
@@ -121,14 +114,15 @@ ENTRY(entry_SYSENTER_compat) movq %rsp, %rdi call do_fast_syscall_32 - testl %eax, %eax - jz .Lsyscall_32_done + /* XEN PV guests always use IRET path */ + ALTERNATIVE "testl %eax, %eax; jz .Lsyscall_32_done", \ + "jmp .Lsyscall_32_done", X86_FEATURE_XENPV jmp sysret32_from_system_call -sysenter_fix_flags: +.Lsysenter_fix_flags: pushq $X86_EFLAGS_FIXED popfq - jmp sysenter_flags_fixed + jmp .Lsysenter_flags_fixed ENDPROC(entry_SYSENTER_compat) /*
@@ -200,8 +194,9 @@ ENTRY(entry_SYSCALL_compat) movq %rsp, %rdi call do_fast_syscall_32 - testl %eax, %eax - jz .Lsyscall_32_done + /* XEN PV guests always use IRET path */ + ALTERNATIVE "testl %eax, %eax; jz .Lsyscall_32_done", \ + "jmp .Lsyscall_32_done", X86_FEATURE_XENPV /* Opportunistic SYSRET */ sysret32_from_system_call:
@@ -236,7 +231,8 @@ ENTRY(entry_SYSCALL_compat) xorq %r9, %r9 xorq %r10, %r10 movq RSP-ORIG_RAX(%rsp), %rsp - USERGS_SYSRET32 + swapgs + sysretl END(entry_SYSCALL_compat) /*
arch/x86/entry/vdso/vclock_gettime.c +73 -78
183 lines not on this page · raw message
arch/x86/entry/vdso/vdso-layout.lds.S +2 -1
@@ -25,7 +25,7 @@ SECTIONS * segment. */ - vvar_start = . - 2 * PAGE_SIZE; + vvar_start = . - 3 * PAGE_SIZE; vvar_page = vvar_start; /* Place all vvars at the offsets in asm/vvar.h. */
@@ -36,6 +36,7 @@ SECTIONS #undef EMIT_VVAR hpet_page = vvar_start + PAGE_SIZE; + pvclock_page = vvar_start + 2 * PAGE_SIZE; . = SIZEOF_HEADERS;
arch/x86/entry/vdso/vdso2c.c +3 -0
@@ -73,6 +73,7 @@ enum { sym_vvar_start, sym_vvar_page, sym_hpet_page, + sym_pvclock_page, sym_VDSO_FAKE_SECTION_TABLE_START, sym_VDSO_FAKE_SECTION_TABLE_END, };
@@ -80,6 +81,7 @@ enum {const int special_pages[] = { sym_vvar_page, sym_hpet_page, + sym_pvclock_page, };struct vdso_sym {
@@ -91,6 +93,7 @@ struct vdso_sym required_syms[] = { [sym_vvar_start] = {"vvar_start", true}, [sym_vvar_page] = {"vvar_page", true}, [sym_hpet_page] = {"hpet_page", true}, + [sym_pvclock_page] = {"pvclock_page", true}, [sym_VDSO_FAKE_SECTION_TABLE_START] = {"VDSO_FAKE_SECTION_TABLE_START" , false },
arch/x86/entry/vdso/vma.c +14 -0
@@ -12,6 +12,7 @@#include <linux/random.h> #include <linux/elf.h> #include <linux/cpu.h> +#include <asm/pvclock.h> #include <asm/vgtod.h> #include <asm/proto.h> #include <asm/vdso.h>
@@ -100,6 +101,7 @@ static int map_vdso(const struct vdso_image *image, bool calculate_addr) .name = "[vvar]", .pages = no_pages, }; +struct pvclock_vsyscall_time_info *pvti;if (calculate_addr) { addr = vdso_addr(current->mm->start_stack,
@@ -169,6 +171,18 @@ static int map_vdso(const struct vdso_image *image, bool calculate_addr) }#endif + pvti =pvclock_pvti_cpu0_va (); +if (pvti && image->sym_pvclock_page) { + ret =remap_pfn_range (vma, + text_start + image->sym_pvclock_page, +__pa (pvti) >>PAGE_SHIFT , +PAGE_SIZE , +PAGE_READONLY ); + +if (ret) + goto up_fail; + } + up_fail:if (ret) current->mm->context.vdso =NULL ;
arch/x86/include/asm/cpufeature.h +1 -0
@@ -216,6 +216,7 @@#define X86_FEATURE_PAUSEFILTER ( 8*32+13)/* AMD filtered pause intercept */ #define X86_FEATURE_PFTHRESHOLD ( 8*32+14)/* AMD pause filter threshold */ #define X86_FEATURE_VMMCALL ( 8*32+15)/* Prefer vmmcall to vmcall */ +#define X86_FEATURE_XENPV ( 8*32+16)/* "" Xen paravirtual guest */ /* Intel-defined CPU features, CPUID level 0x00000007:0 (ebx), word 9 */
arch/x86/include/asm/fixmap.h +0 -5
@@ -19,7 +19,6 @@#include <asm/acpi.h> #include <asm/apicdef.h> #include <asm/page.h> -#include <asm/pvclock.h> #ifdef CONFIG_X86_32 #include <linux/threads.h> #include <asm/kmap_types.h>
@@ -72,10 +71,6 @@ enum fixed_addresses { #ifdef CONFIG_X86_VSYSCALL_EMULATION VSYSCALL_PAGE = (FIXADDR_TOP - VSYSCALL_ADDR) >> PAGE_SHIFT, #endif -#ifdef CONFIG_PARAVIRT_CLOCK - PVCLOCK_FIXMAP_BEGIN, - PVCLOCK_FIXMAP_END = PVCLOCK_FIXMAP_BEGIN+PVCLOCK_VSYSCALL_NR_PAGES-1, -#endif #endif FIX_DBGP_BASE, FIX_EARLYCON_MEM_BASE,
arch/x86/include/asm/jump_label.h +56 -7
79 lines not on this page · raw message
arch/x86/include/asm/paravirt.h +0 -12
@@ -922,23 +922,11 @@ extern void default_banner(void); call PARA_INDIRECT(pv_irq_ops+PV_IRQ_irq_enable); \ PV_RESTORE_REGS(clobbers | CLBR_CALLEE_SAVE);) -#define USERGS_SYSRET32 \ - PARA_SITE(PARA_PATCH(pv_cpu_ops, PV_CPU_usergs_sysret32), \ - CLBR_NONE, \ - jmp PARA_INDIRECT(pv_cpu_ops+PV_CPU_usergs_sysret32)) -#ifdef CONFIG_X86_32 #define GET_CR0_INTO_EAX \ push %ecx; push %edx; \ call PARA_INDIRECT(pv_cpu_ops+PV_CPU_read_cr0); \ pop %edx; pop %ecx - -#define ENABLE_INTERRUPTS_SYSEXIT \ - PARA_SITE(PARA_PATCH(pv_cpu_ops, PV_CPU_irq_enable_sysexit), \ - CLBR_NONE, \ - jmp PARA_INDIRECT(pv_cpu_ops+PV_CPU_irq_enable_sysexit)) - -#else /* !CONFIG_X86_32 */ /*
arch/x86/include/asm/paravirt_types.h +0 -17
@@ -157,15 +157,6 @@ struct pv_cpu_ops {u64 (*read_pmc)(int counter); -#ifdef CONFIG_X86_32 -/* -* Atomically enable interrupts and return to userspace. This -* is only used in 32-bit kernels. 64-bit kernels use -* usergs_sysret32 instead. -*/ -void (*irq_enable_sysexit)(void ); -#endif -/* * Switch to usermode gs and return to 64-bit usermode using * sysret. Only used in 64-bit kernels to return to 64-bit
@@ -174,14 +165,6 @@ struct pv_cpu_ops {*/ void (*usergs_sysret64)(void ); -/* -* Switch to usermode gs and return to 32-bit usermode using -* sysret. Used to return to 32-on-64 compat processes. -* Other usermode register state, including %esp, must already -* be restored. -*/ -void (*usergs_sysret32)(void ); -/* Normal iret. Jump to this with the standard iret stack frame set up. */ void (*iret)(void );
arch/x86/include/asm/pvclock.h +9 -5
@@ -4,6 +4,15 @@#include <linux/clocksource.h> #include <asm/pvclock-abi.h> +#ifdef CONFIG_KVM_GUEST +extern struct pvclock_vsyscall_time_info *pvclock_pvti_cpu0_va (void ); +#else +static inline struct pvclock_vsyscall_time_info *pvclock_pvti_cpu0_va (void ) +{ +return NULL ; +} +#endif +/* some helper functions for xen and kvm pv clock sources */ cycle_t pvclock_clocksource_read (struct pvclock_vcpu_time_info *src);u8 pvclock_read_flags (struct pvclock_vcpu_time_info *src);
@@ -91,10 +100,5 @@ struct pvclock_vsyscall_time_info { } __attribute__((__aligned__(SMP_CACHE_BYTES)));#define PVTI_SIZE sizeof(struct pvclock_vsyscall_time_info) -#define PVCLOCK_VSYSCALL_NR_PAGES (((NR_CPUS-1)/(PAGE_SIZE/PVTI_SIZE))+1) - -int __init pvclock_init_vsyscall (struct pvclock_vsyscall_time_info *i, -int size); -struct pvclock_vcpu_time_info *pvclock_get_vsyscall_time_info (int cpu);#endif /* _ASM_X86_PVCLOCK_H */
arch/x86/include/asm/vdso.h +1 -0
@@ -22,6 +22,7 @@ struct vdso_image {long sym_vvar_page;long sym_hpet_page; +long sym_pvclock_page;long sym_VDSO32_NOTE_MASK;long sym___kernel_sigreturn;long sym___kernel_rt_sigreturn;
arch/x86/kernel/asm-offsets.c +0 -3
@@ -65,9 +65,6 @@ void common(void) {OFFSET (PV_IRQ_irq_disable, pv_irq_ops, irq_disable);OFFSET (PV_IRQ_irq_enable, pv_irq_ops, irq_enable);OFFSET (PV_CPU_iret, pv_cpu_ops, iret); -#ifdef CONFIG_X86_32 -OFFSET (PV_CPU_irq_enable_sysexit, pv_cpu_ops, irq_enable_sysexit); -#endif OFFSET (PV_CPU_read_cr0, pv_cpu_ops, read_cr0);OFFSET (PV_MMU_read_cr2, pv_mmu_ops, read_cr2);#endif
arch/x86/kernel/asm-offsets_64.c +0 -1
@@ -23,7 +23,6 @@ int main(void) {#ifdef CONFIG_PARAVIRT OFFSET (PV_IRQ_adjust_exception_frame, pv_irq_ops, adjust_exception_frame); -OFFSET (PV_CPU_usergs_sysret32, pv_cpu_ops, usergs_sysret32);OFFSET (PV_CPU_usergs_sysret64, pv_cpu_ops, usergs_sysret64);OFFSET (PV_CPU_swapgs, pv_cpu_ops, swapgs);BLANK ();
arch/x86/kernel/kvmclock.c +5 -6
@@ -45,6 +45,11 @@ early_param("no-kvmclock", parse_no_kvmclock);static struct pvclock_vsyscall_time_info *hv_clock;static struct pvclock_wall_clock wall_clock; +struct pvclock_vsyscall_time_info *pvclock_pvti_cpu0_va (void ) +{ +return hv_clock; +} +/* * The wallclock is the time of day when we booted. Since then, some time may * have elapsed since the hypervisor wrote the data. So we try to account for
@@ -305,7 +310,6 @@ int __init kvm_setup_vsyscall_timeinfo(void) {#ifdef CONFIG_X86_64 int cpu; -int ret;u8 flags;struct pvclock_vcpu_time_info *vcpu_time;unsigned int size;
@@ -325,11 +329,6 @@ int __init kvm_setup_vsyscall_timeinfo(void)return 1 ; } -if ((ret =pvclock_init_vsyscall (hv_clock, size))) { -put_cpu (); -return ret; - } -put_cpu (); kvm_clock.archdata.vclock_mode =VCLOCK_PVCLOCK ;
arch/x86/kernel/paravirt.c +0 -12
@@ -162,10 +162,6 @@ unsigned paravirt_patch_default(u8 type, u16 clobbers, void *insnbuf, ret =paravirt_patch_ident_64 (insnbuf, len); else if (type == PARAVIRT_PATCH(pv_cpu_ops.iret) || -#ifdef CONFIG_X86_32 - type == PARAVIRT_PATCH(pv_cpu_ops.irq_enable_sysexit) || -#endif - type == PARAVIRT_PATCH(pv_cpu_ops.usergs_sysret32) || type == PARAVIRT_PATCH(pv_cpu_ops.usergs_sysret64))/* If operation requires a jmp, then jmp */ ret =paravirt_patch_jmp (insnbuf, opfunc, addr, len);
@@ -220,8 +216,6 @@ static u64 native_steal_clock(int cpu)/* These are in entry.S */ extern void native_iret (void ); -extern void native_irq_enable_sysexit (void ); -extern void native_usergs_sysret32 (void );extern void native_usergs_sysret64 (void );static struct resource reserve_ioports = {
@@ -379,13 +373,7 @@ __visible struct pv_cpu_ops pv_cpu_ops = { .load_sp0 = native_load_sp0, -#if defined(CONFIG_X86_32 ) - .irq_enable_sysexit = native_irq_enable_sysexit, -#endif #ifdef CONFIG_X86_64 -#ifdef CONFIG_IA32_EMULATION - .usergs_sysret32 = native_usergs_sysret32, -#endif .usergs_sysret64 = native_usergs_sysret64, #endif .iret = native_iret,
arch/x86/kernel/paravirt_patch_32.c +0 -2
@@ -5,7 +5,6 @@ DEF_NATIVE(pv_irq_ops, irq_enable, "sti");DEF_NATIVE (pv_irq_ops, restore_fl,"push %eax; popf" );DEF_NATIVE (pv_irq_ops, save_fl,"pushf; pop %eax" );DEF_NATIVE (pv_cpu_ops, iret,"iret" ); -DEF_NATIVE (pv_cpu_ops, irq_enable_sysexit,"sti; sysexit" );DEF_NATIVE (pv_mmu_ops, read_cr2,"mov %cr2, %eax" );DEF_NATIVE (pv_mmu_ops, write_cr3,"mov %eax, %cr3" );DEF_NATIVE (pv_mmu_ops, read_cr3,"mov %cr3, %eax" );
@@ -46,7 +45,6 @@ unsigned native_patch(u8 type, u16 clobbers, void *ibuf,PATCH_SITE (pv_irq_ops, restore_fl);PATCH_SITE (pv_irq_ops, save_fl);PATCH_SITE (pv_cpu_ops, iret); -PATCH_SITE (pv_cpu_ops, irq_enable_sysexit);PATCH_SITE (pv_mmu_ops, read_cr2);PATCH_SITE (pv_mmu_ops, read_cr3);PATCH_SITE (pv_mmu_ops, write_cr3);
arch/x86/kernel/paravirt_patch_64.c +0 -3
@@ -13,9 +13,7 @@ DEF_NATIVE(pv_mmu_ops, flush_tlb_single, "invlpg (%rdi)");DEF_NATIVE (pv_cpu_ops, clts,"clts" );DEF_NATIVE (pv_cpu_ops, wbinvd,"wbinvd" ); -DEF_NATIVE (pv_cpu_ops, irq_enable_sysexit,"swapgs; sti; sysexit" );DEF_NATIVE (pv_cpu_ops, usergs_sysret64,"swapgs; sysretq" ); -DEF_NATIVE (pv_cpu_ops, usergs_sysret32,"swapgs; sysretl" );DEF_NATIVE (pv_cpu_ops, swapgs,"swapgs" ); DEF_NATIVE(, mov32, "mov %edi, %eax");
@@ -55,7 +53,6 @@ unsigned native_patch(u8 type, u16 clobbers, void *ibuf,PATCH_SITE (pv_irq_ops, save_fl);PATCH_SITE (pv_irq_ops, irq_enable);PATCH_SITE (pv_irq_ops, irq_disable); -PATCH_SITE (pv_cpu_ops, usergs_sysret32);PATCH_SITE (pv_cpu_ops, usergs_sysret64);PATCH_SITE (pv_cpu_ops, swapgs);PATCH_SITE (pv_mmu_ops, read_cr2);
arch/x86/kernel/pvclock.c +0 -24
@@ -140,27 +140,3 @@ void pvclock_read_wallclock(struct pvclock_wall_clock *wall_clock,set_normalized_timespec (ts, now.tv_sec, now.tv_nsec); } - -#ifdef CONFIG_X86_64 -/* -* Initialize the generic pvclock vsyscall state. This will allocate -* a/some page(s) for the per-vcpu pvclock information, set up a -* fixmap mapping for the page(s) -*/ - -int __init pvclock_init_vsyscall (struct pvclock_vsyscall_time_info *i, -int size) -{ -int idx; - -WARN_ON (size !=PVCLOCK_VSYSCALL_NR_PAGES *PAGE_SIZE ); - -for (idx =0 ; idx <= (PVCLOCK_FIXMAP_END -PVCLOCK_FIXMAP_BEGIN ); idx++) { -__set_fixmap (PVCLOCK_FIXMAP_BEGIN + idx, -__pa (i) + (idx*PAGE_SIZE ), -PAGE_KERNEL_VVAR ); - } - -return 0 ; -} -#endif
arch/x86/platform/uv/uv_nmi.c +1 -0
@@ -28,6 +28,7 @@#include <linux/nmi.h> #include <linux/sched.h> #include <linux/slab.h> +#include <linux/clocksource.h> #include <asm/apic.h> #include <asm/current.h>
arch/x86/xen/enlighten.c +3 -4
@@ -1229,10 +1229,7 @@ static const struct pv_cpu_ops xen_cpu_ops __initconst = { .iret = xen_iret, #ifdef CONFIG_X86_64 - .usergs_sysret32 = xen_sysret32, .usergs_sysret64 = xen_sysret64, -#else - .irq_enable_sysexit = xen_sysexit, #endif .load_tr_desc = paravirt_nop,
@@ -1886,8 +1883,10 @@ EXPORT_SYMBOL_GPL(xen_hvm_need_lapic);static void xen_set_cpu_features (struct cpuinfo_x86 *c) { -if (xen_pv_domain ()) +if (xen_pv_domain ()) {clear_cpu_bug (c,X86_BUG_SYSRET_SS_ATTRS ); +set_cpu_cap (c,X86_FEATURE_XENPV ); + } }const struct hypervisor_x86 x86_hyper_xen = {
arch/x86/xen/xen-asm_32.S +0 -14
@@ -35,20 +35,6 @@ ret /* - * We can't use sysexit directly, because we're not running in ring0. - * But we can easily fake it up using iret. Assuming xen_sysexit is - * jumped to with a standard stack frame, we can just strip it back to - * a standard iret frame and use iret. - */ -ENTRY(xen_sysexit) - movl PT_EAX(%esp), %eax /* Shouldn't be necessary? */ - orl $X86_EFLAGS_IF, PT_EFLAGS(%esp) - lea PT_EIP(%esp), %esp - - jmp xen_iret -ENDPROC(xen_sysexit) - -/* * This is run where a normal iret would be run, with the same stack setup: * 8: eflags * 4: cs
arch/x86/xen/xen-asm_64.S +0 -19
@@ -68,25 +68,6 @@ ENTRY(xen_sysret64) ENDPATCH(xen_sysret64) RELOC(xen_sysret64, 1b+1) -ENTRY(xen_sysret32) - /* - * We're already on the usermode stack at this point, but - * still with the kernel gs, so we can easily switch back - */ - movq %rsp, PER_CPU_VAR(rsp_scratch) - movq PER_CPU_VAR(cpu_current_top_of_stack), %rsp - - pushq $__USER32_DS - pushq PER_CPU_VAR(rsp_scratch) - pushq %r11 - pushq $__USER32_CS - pushq %rcx - - pushq $0 -1: jmp hypercall_iret -ENDPATCH(xen_sysret32) -RELOC(xen_sysret32, 1b+1) - /* * Xen handles syscall callbacks much like ordinary exceptions, which * means we have:
arch/x86/xen/xen-ops.h +0 -3
@@ -139,9 +139,6 @@ DECL_ASM(void, xen_restore_fl_direct, unsigned long);/* These are not functions, and cannot be called normally */ __visible void xen_iret(void); -#ifdef CONFIG_X86_32 -__visible void xen_sysexit(void); -#endif __visible void xen_sysret32(void); __visible void xen_sysret64(void); __visible void xen_adjust_exception_frame(void);
include/linux/context_tracking_state.h +2 -2
@@ -22,12 +22,12 @@ struct context_tracking { };#ifdef CONFIG_CONTEXT_TRACKING -extern struct static_key context_tracking_enabled; +extern struct static_key_false context_tracking_enabled; DECLARE_PER_CPU(struct context_tracking, context_tracking);static inline bool context_tracking_is_enabled (void ) { -return static_key_false (&context_tracking_enabled); +return static_branch_unlikely (&context_tracking_enabled); }static inline bool context_tracking_cpu_is_enabled (void )
kernel/context_tracking.c +2 -2
@@ -24,7 +24,7 @@#define CREATE_TRACE_POINTS #include <trace/events/context_tracking.h> -struct static_key context_tracking_enabled =STATIC_KEY_INIT_FALSE ; +DEFINE_STATIC_KEY_FALSE (context_tracking_enabled);EXPORT_SYMBOL_GPL (context_tracking_enabled); DEFINE_PER_CPU(struct context_tracking, context_tracking);
@@ -191,7 +191,7 @@ void __init context_tracking_cpu_set(int cpu)if (!per_cpu (context_tracking.active, cpu)) {per_cpu (context_tracking.active, cpu) = true; -static_key_slow_inc (&context_tracking_enabled); +static_branch_inc (&context_tracking_enabled); }if (initialized)