| .. | .. |
|---|
| 4 | 4 | |
|---|
| 5 | 5 | #include <asm/processor.h> |
|---|
| 6 | 6 | #include <asm/alternative.h> |
|---|
| 7 | +#include <linux/interrupt.h> |
|---|
| 7 | 8 | #include <uapi/asm/kvm_para.h> |
|---|
| 8 | | - |
|---|
| 9 | | -extern void kvmclock_init(void); |
|---|
| 10 | 9 | |
|---|
| 11 | 10 | #ifdef CONFIG_KVM_GUEST |
|---|
| 12 | 11 | bool kvm_check_and_clear_guest_paused(void); |
|---|
| .. | .. |
|---|
| 18 | 17 | #endif /* CONFIG_KVM_GUEST */ |
|---|
| 19 | 18 | |
|---|
| 20 | 19 | #define KVM_HYPERCALL \ |
|---|
| 21 | | - ALTERNATIVE(".byte 0x0f,0x01,0xc1", ".byte 0x0f,0x01,0xd9", X86_FEATURE_VMMCALL) |
|---|
| 20 | + ALTERNATIVE("vmcall", "vmmcall", X86_FEATURE_VMMCALL) |
|---|
| 22 | 21 | |
|---|
| 23 | 22 | /* For KVM hypercalls, a three-byte sequence of either the vmcall or the vmmcall |
|---|
| 24 | 23 | * instruction. The hypervisor may replace it with something else but only the |
|---|
| .. | .. |
|---|
| 85 | 84 | } |
|---|
| 86 | 85 | |
|---|
| 87 | 86 | #ifdef CONFIG_KVM_GUEST |
|---|
| 87 | +void kvmclock_init(void); |
|---|
| 88 | +void kvmclock_disable(void); |
|---|
| 88 | 89 | bool kvm_para_available(void); |
|---|
| 89 | 90 | unsigned int kvm_arch_para_features(void); |
|---|
| 90 | 91 | unsigned int kvm_arch_para_hints(void); |
|---|
| 91 | | -void kvm_async_pf_task_wait(u32 token, int interrupt_kernel); |
|---|
| 92 | +void kvm_async_pf_task_wait_schedule(u32 token); |
|---|
| 92 | 93 | void kvm_async_pf_task_wake(u32 token); |
|---|
| 93 | | -u32 kvm_read_and_reset_pf_reason(void); |
|---|
| 94 | | -extern void kvm_disable_steal_time(void); |
|---|
| 94 | +u32 kvm_read_and_reset_apf_flags(void); |
|---|
| 95 | +bool __kvm_handle_async_pf(struct pt_regs *regs, u32 token); |
|---|
| 96 | + |
|---|
| 97 | +DECLARE_STATIC_KEY_FALSE(kvm_async_pf_enabled); |
|---|
| 98 | + |
|---|
| 99 | +static __always_inline bool kvm_handle_async_pf(struct pt_regs *regs, u32 token) |
|---|
| 100 | +{ |
|---|
| 101 | + if (static_branch_unlikely(&kvm_async_pf_enabled)) |
|---|
| 102 | + return __kvm_handle_async_pf(regs, token); |
|---|
| 103 | + else |
|---|
| 104 | + return false; |
|---|
| 105 | +} |
|---|
| 95 | 106 | |
|---|
| 96 | 107 | #ifdef CONFIG_PARAVIRT_SPINLOCKS |
|---|
| 97 | 108 | void __init kvm_spinlock_init(void); |
|---|
| .. | .. |
|---|
| 102 | 113 | #endif /* CONFIG_PARAVIRT_SPINLOCKS */ |
|---|
| 103 | 114 | |
|---|
| 104 | 115 | #else /* CONFIG_KVM_GUEST */ |
|---|
| 105 | | -#define kvm_async_pf_task_wait(T, I) do {} while(0) |
|---|
| 116 | +#define kvm_async_pf_task_wait_schedule(T) do {} while(0) |
|---|
| 106 | 117 | #define kvm_async_pf_task_wake(T) do {} while(0) |
|---|
| 107 | 118 | |
|---|
| 108 | 119 | static inline bool kvm_para_available(void) |
|---|
| .. | .. |
|---|
| 120 | 131 | return 0; |
|---|
| 121 | 132 | } |
|---|
| 122 | 133 | |
|---|
| 123 | | -static inline u32 kvm_read_and_reset_pf_reason(void) |
|---|
| 134 | +static inline u32 kvm_read_and_reset_apf_flags(void) |
|---|
| 124 | 135 | { |
|---|
| 125 | 136 | return 0; |
|---|
| 126 | 137 | } |
|---|
| 127 | 138 | |
|---|
| 128 | | -static inline void kvm_disable_steal_time(void) |
|---|
| 139 | +static __always_inline bool kvm_handle_async_pf(struct pt_regs *regs, u32 token) |
|---|
| 129 | 140 | { |
|---|
| 130 | | - return; |
|---|
| 141 | + return false; |
|---|
| 131 | 142 | } |
|---|
| 132 | 143 | #endif |
|---|
| 133 | 144 | |
|---|