diff options
Diffstat (limited to 'arch/x86/include')
| -rw-r--r-- | arch/x86/include/asm/bitops.h | 6 | ||||
| -rw-r--r-- | arch/x86/include/asm/bug.h | 6 | ||||
| -rw-r--r-- | arch/x86/include/asm/cpu.h | 5 | ||||
| -rw-r--r-- | arch/x86/include/asm/cpumask.h | 18 | ||||
| -rw-r--r-- | arch/x86/include/asm/fpu/internal.h | 5 | ||||
| -rw-r--r-- | arch/x86/include/asm/idtentry.h | 65 | ||||
| -rw-r--r-- | arch/x86/include/asm/io_bitmap.h | 16 | ||||
| -rw-r--r-- | arch/x86/include/asm/iosf_mbi.h | 1 | ||||
| -rw-r--r-- | arch/x86/include/asm/kvm_host.h | 4 | ||||
| -rw-r--r-- | arch/x86/include/asm/mwait.h | 2 | ||||
| -rw-r--r-- | arch/x86/include/asm/paravirt.h | 5 | ||||
| -rw-r--r-- | arch/x86/include/asm/paravirt_types.h | 1 | ||||
| -rw-r--r-- | arch/x86/include/asm/pgtable_types.h | 2 | ||||
| -rw-r--r-- | arch/x86/include/asm/processor.h | 2 | ||||
| -rw-r--r-- | arch/x86/include/asm/ptrace.h | 4 | ||||
| -rw-r--r-- | arch/x86/include/uapi/asm/kvm.h | 5 | 
16 files changed, 95 insertions, 52 deletions
| diff --git a/arch/x86/include/asm/bitops.h b/arch/x86/include/asm/bitops.h index 35460fef39b8..0367efdc5b7a 100644 --- a/arch/x86/include/asm/bitops.h +++ b/arch/x86/include/asm/bitops.h @@ -201,12 +201,8 @@ arch_test_and_change_bit(long nr, volatile unsigned long *addr)  	return GEN_BINARY_RMWcc(LOCK_PREFIX __ASM_SIZE(btc), *addr, c, "Ir", nr);  } -static __no_kcsan_or_inline bool constant_test_bit(long nr, const volatile unsigned long *addr) +static __always_inline bool constant_test_bit(long nr, const volatile unsigned long *addr)  { -	/* -	 * Because this is a plain access, we need to disable KCSAN here to -	 * avoid double instrumentation via instrumented bitops. -	 */  	return ((1UL << (nr & (BITS_PER_LONG-1))) &  		(addr[nr >> _BITOPS_LONG_SHIFT])) != 0;  } diff --git a/arch/x86/include/asm/bug.h b/arch/x86/include/asm/bug.h index fb34ff641e0a..028189575560 100644 --- a/arch/x86/include/asm/bug.h +++ b/arch/x86/include/asm/bug.h @@ -75,6 +75,12 @@ do {								\  	unreachable();						\  } while (0) +/* + * This instrumentation_begin() is strictly speaking incorrect; but it + * suppresses the complaints from WARN()s in noinstr code. If such a WARN() + * were to trigger, we'd rather wreck the machine in an attempt to get the + * message out than not know about it. + */  #define __WARN_FLAGS(flags)					\  do {								\  	instrumentation_begin();				\ diff --git a/arch/x86/include/asm/cpu.h b/arch/x86/include/asm/cpu.h index dd17c2da1af5..da78ccbd493b 100644 --- a/arch/x86/include/asm/cpu.h +++ b/arch/x86/include/asm/cpu.h @@ -58,4 +58,9 @@ static inline bool handle_guest_split_lock(unsigned long ip)  	return false;  }  #endif +#ifdef CONFIG_IA32_FEAT_CTL +void init_ia32_feat_ctl(struct cpuinfo_x86 *c); +#else +static inline void init_ia32_feat_ctl(struct cpuinfo_x86 *c) {} +#endif  #endif /* _ASM_X86_CPU_H */ diff --git a/arch/x86/include/asm/cpumask.h b/arch/x86/include/asm/cpumask.h index 6722ffcef2e6..3afa990d756b 100644 --- a/arch/x86/include/asm/cpumask.h +++ b/arch/x86/include/asm/cpumask.h @@ -11,5 +11,23 @@ extern cpumask_var_t cpu_sibling_setup_mask;  extern void setup_cpu_local_masks(void); +/* + * NMI and MCE exceptions need cpu_is_offline() _really_ early, + * provide an arch_ special for them to avoid instrumentation. + */ +#if NR_CPUS > 1 +static __always_inline bool arch_cpu_online(int cpu) +{ +	return arch_test_bit(cpu, cpumask_bits(cpu_online_mask)); +} +#else +static __always_inline bool arch_cpu_online(int cpu) +{ +	return cpu == 0; +} +#endif + +#define arch_cpu_is_offline(cpu)	unlikely(!arch_cpu_online(cpu)) +  #endif /* __ASSEMBLY__ */  #endif /* _ASM_X86_CPUMASK_H */ diff --git a/arch/x86/include/asm/fpu/internal.h b/arch/x86/include/asm/fpu/internal.h index 42159f45bf9c..845e7481ab77 100644 --- a/arch/x86/include/asm/fpu/internal.h +++ b/arch/x86/include/asm/fpu/internal.h @@ -623,6 +623,11 @@ static inline void switch_fpu_finish(struct fpu *new_fpu)   * MXCSR and XCR definitions:   */ +static inline void ldmxcsr(u32 mxcsr) +{ +	asm volatile("ldmxcsr %0" :: "m" (mxcsr)); +} +  extern unsigned int mxcsr_feature_mask;  #define XCR_XFEATURE_ENABLED_MASK	0x00000000 diff --git a/arch/x86/include/asm/idtentry.h b/arch/x86/include/asm/idtentry.h index cf51c50eb356..80d3b30d3ee3 100644 --- a/arch/x86/include/asm/idtentry.h +++ b/arch/x86/include/asm/idtentry.h @@ -353,10 +353,6 @@ static __always_inline void __##func(struct pt_regs *regs)  #else	/* CONFIG_X86_64 */ -/* Maps to a regular IDTENTRY on 32bit for now */ -# define DECLARE_IDTENTRY_IST		DECLARE_IDTENTRY -# define DEFINE_IDTENTRY_IST		DEFINE_IDTENTRY -  /**   * DECLARE_IDTENTRY_DF - Declare functions for double fault 32bit variant   * @vector:	Vector number (ignored for C) @@ -387,28 +383,18 @@ __visible noinstr void func(struct pt_regs *regs,			\  #endif	/* !CONFIG_X86_64 */  /* C-Code mapping */ +#define DECLARE_IDTENTRY_NMI		DECLARE_IDTENTRY_RAW +#define DEFINE_IDTENTRY_NMI		DEFINE_IDTENTRY_RAW + +#ifdef CONFIG_X86_64  #define DECLARE_IDTENTRY_MCE		DECLARE_IDTENTRY_IST  #define DEFINE_IDTENTRY_MCE		DEFINE_IDTENTRY_IST  #define DEFINE_IDTENTRY_MCE_USER	DEFINE_IDTENTRY_NOIST -#define DECLARE_IDTENTRY_NMI		DECLARE_IDTENTRY_RAW -#define DEFINE_IDTENTRY_NMI		DEFINE_IDTENTRY_RAW -  #define DECLARE_IDTENTRY_DEBUG		DECLARE_IDTENTRY_IST  #define DEFINE_IDTENTRY_DEBUG		DEFINE_IDTENTRY_IST  #define DEFINE_IDTENTRY_DEBUG_USER	DEFINE_IDTENTRY_NOIST - -/** - * DECLARE_IDTENTRY_XEN - Declare functions for XEN redirect IDT entry points - * @vector:	Vector number (ignored for C) - * @func:	Function name of the entry point - * - * Used for xennmi and xendebug redirections. No DEFINE as this is all ASM - * indirection magic. - */ -#define DECLARE_IDTENTRY_XEN(vector, func)				\ -	asmlinkage void xen_asm_exc_xen##func(void);			\ -	asmlinkage void asm_exc_xen##func(void) +#endif  #else /* !__ASSEMBLY__ */ @@ -455,9 +441,6 @@ __visible noinstr void func(struct pt_regs *regs,			\  # define DECLARE_IDTENTRY_MCE(vector, func)				\  	DECLARE_IDTENTRY(vector, func) -# define DECLARE_IDTENTRY_DEBUG(vector, func)				\ -	DECLARE_IDTENTRY(vector, func) -  /* No ASM emitted for DF as this goes through a C shim */  # define DECLARE_IDTENTRY_DF(vector, func) @@ -469,10 +452,6 @@ __visible noinstr void func(struct pt_regs *regs,			\  /* No ASM code emitted for NMI */  #define DECLARE_IDTENTRY_NMI(vector, func) -/* XEN NMI and DB wrapper */ -#define DECLARE_IDTENTRY_XEN(vector, func)				\ -	idtentry vector asm_exc_xen##func exc_##func has_error_code=0 -  /*   * ASM code to emit the common vector entry stubs where each stub is   * packed into 8 bytes. @@ -490,16 +469,15 @@ __visible noinstr void func(struct pt_regs *regs,			\  	.align 8  SYM_CODE_START(irq_entries_start)      vector=FIRST_EXTERNAL_VECTOR -    pos = .      .rept (FIRST_SYSTEM_VECTOR - FIRST_EXTERNAL_VECTOR)  	UNWIND_HINT_IRET_REGS +0 :  	.byte	0x6a, vector  	jmp	asm_common_interrupt  	nop  	/* Ensure that the above is 8 bytes max */ -	. = pos + 8 -    pos=pos+8 -    vector=vector+1 +	. = 0b + 8 +	vector = vector+1      .endr  SYM_CODE_END(irq_entries_start) @@ -507,16 +485,15 @@ SYM_CODE_END(irq_entries_start)  	.align 8  SYM_CODE_START(spurious_entries_start)      vector=FIRST_SYSTEM_VECTOR -    pos = .      .rept (NR_VECTORS - FIRST_SYSTEM_VECTOR)  	UNWIND_HINT_IRET_REGS +0 :  	.byte	0x6a, vector  	jmp	asm_spurious_interrupt  	nop  	/* Ensure that the above is 8 bytes max */ -	. = pos + 8 -    pos=pos+8 -    vector=vector+1 +	. = 0b + 8 +	vector = vector+1      .endr  SYM_CODE_END(spurious_entries_start)  #endif @@ -565,16 +542,28 @@ DECLARE_IDTENTRY_RAW(X86_TRAP_BP,		exc_int3);  DECLARE_IDTENTRY_RAW_ERRORCODE(X86_TRAP_PF,	exc_page_fault);  #ifdef CONFIG_X86_MCE +#ifdef CONFIG_X86_64  DECLARE_IDTENTRY_MCE(X86_TRAP_MC,	exc_machine_check); +#else +DECLARE_IDTENTRY_RAW(X86_TRAP_MC,	exc_machine_check); +#endif  #endif  /* NMI */  DECLARE_IDTENTRY_NMI(X86_TRAP_NMI,	exc_nmi); -DECLARE_IDTENTRY_XEN(X86_TRAP_NMI,	nmi); +#if defined(CONFIG_XEN_PV) && defined(CONFIG_X86_64) +DECLARE_IDTENTRY_RAW(X86_TRAP_NMI,	xenpv_exc_nmi); +#endif  /* #DB */ +#ifdef CONFIG_X86_64  DECLARE_IDTENTRY_DEBUG(X86_TRAP_DB,	exc_debug); -DECLARE_IDTENTRY_XEN(X86_TRAP_DB,	debug); +#else +DECLARE_IDTENTRY_RAW(X86_TRAP_DB,	exc_debug); +#endif +#if defined(CONFIG_XEN_PV) && defined(CONFIG_X86_64) +DECLARE_IDTENTRY_RAW(X86_TRAP_DB,	xenpv_exc_debug); +#endif  /* #DF */  DECLARE_IDTENTRY_DF(X86_TRAP_DF,	exc_double_fault); @@ -635,8 +624,8 @@ DECLARE_IDTENTRY_SYSVEC(POSTED_INTR_NESTED_VECTOR,	sysvec_kvm_posted_intr_nested  #if IS_ENABLED(CONFIG_HYPERV)  DECLARE_IDTENTRY_SYSVEC(HYPERVISOR_CALLBACK_VECTOR,	sysvec_hyperv_callback); -DECLARE_IDTENTRY_SYSVEC(HYPERVISOR_REENLIGHTENMENT_VECTOR,	sysvec_hyperv_reenlightenment); -DECLARE_IDTENTRY_SYSVEC(HYPERVISOR_STIMER0_VECTOR,	sysvec_hyperv_stimer0); +DECLARE_IDTENTRY_SYSVEC(HYPERV_REENLIGHTENMENT_VECTOR,	sysvec_hyperv_reenlightenment); +DECLARE_IDTENTRY_SYSVEC(HYPERV_STIMER0_VECTOR,	sysvec_hyperv_stimer0);  #endif  #if IS_ENABLED(CONFIG_ACRN_GUEST) diff --git a/arch/x86/include/asm/io_bitmap.h b/arch/x86/include/asm/io_bitmap.h index ac1a99ffbd8d..7f080f5c7def 100644 --- a/arch/x86/include/asm/io_bitmap.h +++ b/arch/x86/include/asm/io_bitmap.h @@ -19,12 +19,28 @@ struct task_struct;  void io_bitmap_share(struct task_struct *tsk);  void io_bitmap_exit(struct task_struct *tsk); +static inline void native_tss_invalidate_io_bitmap(void) +{ +	/* +	 * Invalidate the I/O bitmap by moving io_bitmap_base outside the +	 * TSS limit so any subsequent I/O access from user space will +	 * trigger a #GP. +	 * +	 * This is correct even when VMEXIT rewrites the TSS limit +	 * to 0x67 as the only requirement is that the base points +	 * outside the limit. +	 */ +	this_cpu_write(cpu_tss_rw.x86_tss.io_bitmap_base, +		       IO_BITMAP_OFFSET_INVALID); +} +  void native_tss_update_io_bitmap(void);  #ifdef CONFIG_PARAVIRT_XXL  #include <asm/paravirt.h>  #else  #define tss_update_io_bitmap native_tss_update_io_bitmap +#define tss_invalidate_io_bitmap native_tss_invalidate_io_bitmap  #endif  #else diff --git a/arch/x86/include/asm/iosf_mbi.h b/arch/x86/include/asm/iosf_mbi.h index 5270ff39b9af..a1911fea8739 100644 --- a/arch/x86/include/asm/iosf_mbi.h +++ b/arch/x86/include/asm/iosf_mbi.h @@ -39,6 +39,7 @@  #define BT_MBI_UNIT_PMC		0x04  #define BT_MBI_UNIT_GFX		0x06  #define BT_MBI_UNIT_SMI		0x0C +#define BT_MBI_UNIT_CCK		0x14  #define BT_MBI_UNIT_USB		0x43  #define BT_MBI_UNIT_SATA	0xA3  #define BT_MBI_UNIT_PCIE	0xA6 diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index f8998e97457f..be5363b21540 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -943,7 +943,7 @@ struct kvm_arch {  	atomic_t vapics_in_nmi_mode;  	struct mutex apic_map_lock;  	struct kvm_apic_map *apic_map; -	bool apic_map_dirty; +	atomic_t apic_map_dirty;  	bool apic_access_page_done;  	unsigned long apicv_inhibit_reasons; @@ -1220,7 +1220,7 @@ struct kvm_x86_ops {  	void (*enable_log_dirty_pt_masked)(struct kvm *kvm,  					   struct kvm_memory_slot *slot,  					   gfn_t offset, unsigned long mask); -	int (*write_log_dirty)(struct kvm_vcpu *vcpu); +	int (*write_log_dirty)(struct kvm_vcpu *vcpu, gpa_t l2_gpa);  	/* pmu operations of sub-arch */  	const struct kvm_pmu_ops *pmu_ops; diff --git a/arch/x86/include/asm/mwait.h b/arch/x86/include/asm/mwait.h index 73d997aa2966..e039a933aca3 100644 --- a/arch/x86/include/asm/mwait.h +++ b/arch/x86/include/asm/mwait.h @@ -25,8 +25,6 @@  #define TPAUSE_C01_STATE		1  #define TPAUSE_C02_STATE		0 -u32 get_umwait_control_msr(void); -  static inline void __monitor(const void *eax, unsigned long ecx,  			     unsigned long edx)  { diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h index 5ca5d297df75..3d2afecde50c 100644 --- a/arch/x86/include/asm/paravirt.h +++ b/arch/x86/include/asm/paravirt.h @@ -302,6 +302,11 @@ static inline void write_idt_entry(gate_desc *dt, int entry, const gate_desc *g)  }  #ifdef CONFIG_X86_IOPL_IOPERM +static inline void tss_invalidate_io_bitmap(void) +{ +	PVOP_VCALL0(cpu.invalidate_io_bitmap); +} +  static inline void tss_update_io_bitmap(void)  {  	PVOP_VCALL0(cpu.update_io_bitmap); diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h index 732f62e04ddb..8dfcb2508e6d 100644 --- a/arch/x86/include/asm/paravirt_types.h +++ b/arch/x86/include/asm/paravirt_types.h @@ -141,6 +141,7 @@ struct pv_cpu_ops {  	void (*load_sp0)(unsigned long sp0);  #ifdef CONFIG_X86_IOPL_IOPERM +	void (*invalidate_io_bitmap)(void);  	void (*update_io_bitmap)(void);  #endif diff --git a/arch/x86/include/asm/pgtable_types.h b/arch/x86/include/asm/pgtable_types.h index 2da1f95b88d7..816b31c68550 100644 --- a/arch/x86/include/asm/pgtable_types.h +++ b/arch/x86/include/asm/pgtable_types.h @@ -194,6 +194,7 @@ enum page_cache_mode {  #define _PAGE_TABLE_NOENC	 (__PP|__RW|_USR|___A|   0|___D|   0|   0)  #define _PAGE_TABLE		 (__PP|__RW|_USR|___A|   0|___D|   0|   0| _ENC)  #define __PAGE_KERNEL_RO	 (__PP|   0|   0|___A|__NX|___D|   0|___G) +#define __PAGE_KERNEL_ROX	 (__PP|   0|   0|___A|   0|___D|   0|___G)  #define __PAGE_KERNEL_NOCACHE	 (__PP|__RW|   0|___A|__NX|___D|   0|___G| __NC)  #define __PAGE_KERNEL_VVAR	 (__PP|   0|_USR|___A|__NX|___D|   0|___G)  #define __PAGE_KERNEL_LARGE	 (__PP|__RW|   0|___A|__NX|___D|_PSE|___G) @@ -219,6 +220,7 @@ enum page_cache_mode {  #define PAGE_KERNEL_RO		__pgprot_mask(__PAGE_KERNEL_RO         | _ENC)  #define PAGE_KERNEL_EXEC	__pgprot_mask(__PAGE_KERNEL_EXEC       | _ENC)  #define PAGE_KERNEL_EXEC_NOENC	__pgprot_mask(__PAGE_KERNEL_EXEC       |    0) +#define PAGE_KERNEL_ROX		__pgprot_mask(__PAGE_KERNEL_ROX        | _ENC)  #define PAGE_KERNEL_NOCACHE	__pgprot_mask(__PAGE_KERNEL_NOCACHE    | _ENC)  #define PAGE_KERNEL_LARGE	__pgprot_mask(__PAGE_KERNEL_LARGE      | _ENC)  #define PAGE_KERNEL_LARGE_EXEC	__pgprot_mask(__PAGE_KERNEL_LARGE_EXEC | _ENC) diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index 42cd333616c4..03b7c4ca425a 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h @@ -370,7 +370,7 @@ struct x86_hw_tss {  #define IO_BITMAP_OFFSET_INVALID	(__KERNEL_TSS_LIMIT + 1)  struct entry_stack { -	unsigned long		words[64]; +	char	stack[PAGE_SIZE];  };  struct entry_stack_page { diff --git a/arch/x86/include/asm/ptrace.h b/arch/x86/include/asm/ptrace.h index ebedeab48704..255b2dde2c1b 100644 --- a/arch/x86/include/asm/ptrace.h +++ b/arch/x86/include/asm/ptrace.h @@ -278,7 +278,7 @@ static inline unsigned long *regs_get_kernel_stack_nth_addr(struct pt_regs *regs  }  /* To avoid include hell, we can't include uaccess.h */ -extern long probe_kernel_read(void *dst, const void *src, size_t size); +extern long copy_from_kernel_nofault(void *dst, const void *src, size_t size);  /**   * regs_get_kernel_stack_nth() - get Nth entry of the stack @@ -298,7 +298,7 @@ static inline unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs,  	addr = regs_get_kernel_stack_nth_addr(regs, n);  	if (addr) { -		ret = probe_kernel_read(&val, addr, sizeof(val)); +		ret = copy_from_kernel_nofault(&val, addr, sizeof(val));  		if (!ret)  			return val;  	} diff --git a/arch/x86/include/uapi/asm/kvm.h b/arch/x86/include/uapi/asm/kvm.h index 17c5a038f42d..0780f97c1850 100644 --- a/arch/x86/include/uapi/asm/kvm.h +++ b/arch/x86/include/uapi/asm/kvm.h @@ -408,14 +408,15 @@ struct kvm_vmx_nested_state_data {  };  struct kvm_vmx_nested_state_hdr { -	__u32 flags;  	__u64 vmxon_pa;  	__u64 vmcs12_pa; -	__u64 preemption_timer_deadline;  	struct {  		__u16 flags;  	} smm; + +	__u32 flags; +	__u64 preemption_timer_deadline;  };  struct kvm_svm_nested_state_data { |