diff options
Diffstat (limited to 'arch/x86/include/asm/paravirt.h')
| -rw-r--r-- | arch/x86/include/asm/paravirt.h | 139 | 
1 files changed, 56 insertions, 83 deletions
diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h index 18e3b8a8709..cd6e1610e29 100644 --- a/arch/x86/include/asm/paravirt.h +++ b/arch/x86/include/asm/paravirt.h @@ -10,6 +10,7 @@  #include <asm/paravirt_types.h>  #ifndef __ASSEMBLY__ +#include <linux/bug.h>  #include <linux/types.h>  #include <linux/cpumask.h> @@ -112,7 +113,7 @@ static inline void arch_safe_halt(void)  static inline void halt(void)  { -	PVOP_VCALL0(pv_irq_ops.safe_halt); +	PVOP_VCALL0(pv_irq_ops.halt);  }  static inline void wbinvd(void) @@ -127,21 +128,11 @@ static inline u64 paravirt_read_msr(unsigned msr, int *err)  	return PVOP_CALL2(u64, pv_cpu_ops.read_msr, msr, err);  } -static inline int paravirt_rdmsr_regs(u32 *regs) -{ -	return PVOP_CALL1(int, pv_cpu_ops.rdmsr_regs, regs); -} -  static inline int paravirt_write_msr(unsigned msr, unsigned low, unsigned high)  {  	return PVOP_CALL3(int, pv_cpu_ops.write_msr, msr, low, high);  } -static inline int paravirt_wrmsr_regs(u32 *regs) -{ -	return PVOP_CALL1(int, pv_cpu_ops.wrmsr_regs, regs); -} -  /* These should all do BUG_ON(_err), but our headers are too tangled. */  #define rdmsr(msr, val1, val2)			\  do {						\ @@ -175,9 +166,6 @@ do {						\  	_err;					\  }) -#define rdmsr_safe_regs(regs)	paravirt_rdmsr_regs(regs) -#define wrmsr_safe_regs(regs)	paravirt_wrmsr_regs(regs) -  static inline int rdmsrl_safe(unsigned msr, unsigned long long *p)  {  	int err; @@ -185,32 +173,6 @@ static inline int rdmsrl_safe(unsigned msr, unsigned long long *p)  	*p = paravirt_read_msr(msr, &err);  	return err;  } -static inline int rdmsrl_amd_safe(unsigned msr, unsigned long long *p) -{ -	u32 gprs[8] = { 0 }; -	int err; - -	gprs[1] = msr; -	gprs[7] = 0x9c5a203a; - -	err = paravirt_rdmsr_regs(gprs); - -	*p = gprs[0] | ((u64)gprs[2] << 32); - -	return err; -} - -static inline int wrmsrl_amd_safe(unsigned msr, unsigned long long val) -{ -	u32 gprs[8] = { 0 }; - -	gprs[0] = (u32)val; -	gprs[1] = msr; -	gprs[2] = val >> 32; -	gprs[7] = 0x9c5a203a; - -	return paravirt_wrmsr_regs(gprs); -}  static inline u64 paravirt_read_tsc(void)  { @@ -230,6 +192,15 @@ static inline unsigned long long paravirt_sched_clock(void)  	return PVOP_CALL0(unsigned long long, pv_time_ops.sched_clock);  } +struct static_key; +extern struct static_key paravirt_steal_enabled; +extern struct static_key paravirt_steal_rq_enabled; + +static inline u64 paravirt_steal_clock(int cpu) +{ +	return PVOP_CALL1(u64, pv_time_ops.steal_clock, cpu); +} +  static inline unsigned long long paravirt_read_pmc(int counter)  {  	return PVOP_CALL1(u64, pv_cpu_ops.read_pmc, counter); @@ -242,6 +213,8 @@ do {						\  	high = _l >> 32;			\  } while (0) +#define rdpmcl(counter, val) ((val) = paravirt_read_pmc(counter)) +  static inline unsigned long long paravirt_rdtscp(unsigned int *aux)  {  	return PVOP_CALL1(u64, pv_cpu_ops.read_tscp, aux); @@ -289,10 +262,6 @@ static inline void set_ldt(const void *addr, unsigned entries)  {  	PVOP_VCALL2(pv_cpu_ops.set_ldt, addr, entries);  } -static inline void store_gdt(struct desc_ptr *dtr) -{ -	PVOP_VCALL1(pv_cpu_ops.store_gdt, dtr); -}  static inline void store_idt(struct desc_ptr *dtr)  {  	PVOP_VCALL1(pv_cpu_ops.store_idt, dtr); @@ -387,9 +356,10 @@ static inline void __flush_tlb_single(unsigned long addr)  static inline void flush_tlb_others(const struct cpumask *cpumask,  				    struct mm_struct *mm, -				    unsigned long va) +				    unsigned long start, +				    unsigned long end)  { -	PVOP_VCALL3(pv_mmu_ops.flush_tlb_others, cpumask, mm, va); +	PVOP_VCALL4(pv_mmu_ops.flush_tlb_others, cpumask, mm, start, end);  }  static inline int paravirt_pgd_alloc(struct mm_struct *mm) @@ -435,6 +405,11 @@ static inline void pte_update(struct mm_struct *mm, unsigned long addr,  {  	PVOP_VCALL3(pv_mmu_ops.pte_update, mm, addr, ptep);  } +static inline void pmd_update(struct mm_struct *mm, unsigned long addr, +			      pmd_t *pmdp) +{ +	PVOP_VCALL3(pv_mmu_ops.pmd_update, mm, addr, pmdp); +}  static inline void pte_update_defer(struct mm_struct *mm, unsigned long addr,  				    pte_t *ptep) @@ -442,6 +417,12 @@ static inline void pte_update_defer(struct mm_struct *mm, unsigned long addr,  	PVOP_VCALL3(pv_mmu_ops.pte_update_defer, mm, addr, ptep);  } +static inline void pmd_update_defer(struct mm_struct *mm, unsigned long addr, +				    pmd_t *pmdp) +{ +	PVOP_VCALL3(pv_mmu_ops.pmd_update_defer, mm, addr, pmdp); +} +  static inline pte_t __pte(pteval_t val)  {  	pteval_t ret; @@ -543,6 +524,17 @@ static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,  		PVOP_VCALL4(pv_mmu_ops.set_pte_at, mm, addr, ptep, pte.pte);  } +static inline void set_pmd_at(struct mm_struct *mm, unsigned long addr, +			      pmd_t *pmdp, pmd_t pmd) +{ +	if (sizeof(pmdval_t) > sizeof(long)) +		/* 5 arg words */ +		pv_mmu_ops.set_pmd_at(mm, addr, pmdp, pmd); +	else +		PVOP_VCALL4(pv_mmu_ops.set_pmd_at, mm, addr, pmdp, +			    native_pmd_val(pmd)); +} +  static inline void set_pmd(pmd_t *pmdp, pmd_t pmd)  {  	pmdval_t val = native_pmd_val(pmd); @@ -707,7 +699,10 @@ static inline void arch_leave_lazy_mmu_mode(void)  	PVOP_VCALL0(pv_mmu_ops.lazy_mode.leave);  } -void arch_flush_lazy_mmu_mode(void); +static inline void arch_flush_lazy_mmu_mode(void) +{ +	PVOP_VCALL0(pv_mmu_ops.lazy_mode.flush); +}  static inline void __set_fixmap(unsigned /* enum fixed_addresses */ idx,  				phys_addr_t phys, pgprot_t flags) @@ -717,36 +712,16 @@ static inline void __set_fixmap(unsigned /* enum fixed_addresses */ idx,  #if defined(CONFIG_SMP) && defined(CONFIG_PARAVIRT_SPINLOCKS) -static inline int arch_spin_is_locked(struct arch_spinlock *lock) -{ -	return PVOP_CALL1(int, pv_lock_ops.spin_is_locked, lock); -} - -static inline int arch_spin_is_contended(struct arch_spinlock *lock) -{ -	return PVOP_CALL1(int, pv_lock_ops.spin_is_contended, lock); -} -#define arch_spin_is_contended	arch_spin_is_contended - -static __always_inline void arch_spin_lock(struct arch_spinlock *lock) -{ -	PVOP_VCALL1(pv_lock_ops.spin_lock, lock); -} - -static __always_inline void arch_spin_lock_flags(struct arch_spinlock *lock, -						  unsigned long flags) -{ -	PVOP_VCALL2(pv_lock_ops.spin_lock_flags, lock, flags); -} - -static __always_inline int arch_spin_trylock(struct arch_spinlock *lock) +static __always_inline void __ticket_lock_spinning(struct arch_spinlock *lock, +							__ticket_t ticket)  { -	return PVOP_CALL1(int, pv_lock_ops.spin_trylock, lock); +	PVOP_VCALLEE2(pv_lock_ops.lock_spinning, lock, ticket);  } -static __always_inline void arch_spin_unlock(struct arch_spinlock *lock) +static __always_inline void __ticket_unlock_kick(struct arch_spinlock *lock, +							__ticket_t ticket)  { -	PVOP_VCALL1(pv_lock_ops.spin_unlock, lock); +	PVOP_VCALL2(pv_lock_ops.unlock_kick, lock, ticket);  }  #endif @@ -806,9 +781,9 @@ static __always_inline void arch_spin_unlock(struct arch_spinlock *lock)   */  #define PV_CALLEE_SAVE_REGS_THUNK(func)					\  	extern typeof(func) __raw_callee_save_##func;			\ -	static void *__##func##__ __used = func;			\  									\  	asm(".pushsection .text;"					\ +	    ".globl __raw_callee_save_" #func " ; "			\  	    "__raw_callee_save_" #func ": "				\  	    PV_SAVE_ALL_CALLER_REGS					\  	    "call " #func ";"						\ @@ -824,27 +799,27 @@ static __always_inline void arch_spin_unlock(struct arch_spinlock *lock)  #define __PV_IS_CALLEE_SAVE(func)			\  	((struct paravirt_callee_save) { func }) -static inline unsigned long arch_local_save_flags(void) +static inline notrace unsigned long arch_local_save_flags(void)  {  	return PVOP_CALLEE0(unsigned long, pv_irq_ops.save_fl);  } -static inline void arch_local_irq_restore(unsigned long f) +static inline notrace void arch_local_irq_restore(unsigned long f)  {  	PVOP_VCALLEE1(pv_irq_ops.restore_fl, f);  } -static inline void arch_local_irq_disable(void) +static inline notrace void arch_local_irq_disable(void)  {  	PVOP_VCALLEE0(pv_irq_ops.irq_disable);  } -static inline void arch_local_irq_enable(void) +static inline notrace void arch_local_irq_enable(void)  {  	PVOP_VCALLEE0(pv_irq_ops.irq_enable);  } -static inline unsigned long arch_local_irq_save(void) +static inline notrace unsigned long arch_local_irq_save(void)  {  	unsigned long f; @@ -989,10 +964,8 @@ extern void default_banner(void);  		  call PARA_INDIRECT(pv_cpu_ops+PV_CPU_swapgs)		\  		 ) -#define GET_CR2_INTO_RCX				\ -	call PARA_INDIRECT(pv_mmu_ops+PV_MMU_read_cr2);	\ -	movq %rax, %rcx;				\ -	xorq %rax, %rax; +#define GET_CR2_INTO_RAX				\ +	call PARA_INDIRECT(pv_mmu_ops+PV_MMU_read_cr2)  #define PARAVIRT_ADJUST_EXCEPTION_FRAME					\  	PARA_SITE(PARA_PATCH(pv_irq_ops, PV_IRQ_adjust_exception_frame), \  | 
