diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig index 278f08194ec8..e0fb460b6d37 100644 --- a/arch/x86/kvm/Kconfig +++ b/arch/x86/kvm/Kconfig @@ -93,10 +93,14 @@ config KVM_SW_PROTECTED_VM If unsure, say "N". +config KVM_APX + bool + config KVM_INTEL tristate "KVM for Intel (and compatible) processors support" depends on KVM && IA32_FEAT_CTL select X86_FRED if X86_64 + select KVM_APX if x86_64 help Provides support for KVM on processors equipped with Intel's VT extensions, a.k.a. Virtual Machine Extensions (VMX). diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 603057ea7421..5060afc8b4f8 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -1259,6 +1259,38 @@ static inline u64 kvm_guest_supported_xfd(struct kvm_vcpu *vcpu) } #endif +#ifdef CONFIG_KVM_APX +unsigned long kvm_gpr_read_raw(struct kvm_vcpu *vcpu, int reg) +{ + switch (reg) { + case VCPU_REGS_RAX ... VCPU_REGS_R15: + return kvm_register_read_raw(vcpu, reg); + case VCPU_XREG_R16 ... VCPU_XREG_R31: + return kvm_read_egpr(reg); + default: + WARN_ON_ONCE(1); + } + + return 0; +} +EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_gpr_read_raw); + +void kvm_gpr_write_raw(struct kvm_vcpu *vcpu, int reg, unsigned long val) +{ + switch (reg) { + case VCPU_REGS_RAX ... VCPU_REGS_R15: + kvm_register_write_raw(vcpu, reg, val); + break; + case VCPU_XREG_R16 ... VCPU_XREG_R31: + kvm_write_egpr(reg, val); + break; + default: + WARN_ON_ONCE(1); + } +} +EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_gpr_write_raw); +#endif + int __kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr) { u64 xcr0 = xcr; diff --git a/arch/x86/kvm/x86.h b/arch/x86/kvm/x86.h index 74ae8f12b5a1..4e23c915f855 100644 --- a/arch/x86/kvm/x86.h +++ b/arch/x86/kvm/x86.h @@ -400,41 +400,16 @@ static inline bool vcpu_match_mmio_gpa(struct kvm_vcpu *vcpu, gpa_t gpa) return false; } -#ifdef CONFIG_X86_64 -static inline unsigned long _kvm_gpr_read(struct kvm_vcpu *vcpu, int reg) -{ - switch (reg) { - case VCPU_REGS_RAX ... VCPU_REGS_R15: - return kvm_register_read_raw(vcpu, reg); - case VCPU_XREG_R16 ... VCPU_XREG_R31: - return kvm_read_egpr(reg); - default: - WARN_ON_ONCE(1); - } - - return 0; -} - -static inline void _kvm_gpr_write(struct kvm_vcpu *vcpu, int reg, unsigned long val) -{ - switch (reg) { - case VCPU_REGS_RAX ... VCPU_REGS_R15: - kvm_register_write_raw(vcpu, reg, val); - break; - case VCPU_XREG_R16 ... VCPU_XREG_R31: - kvm_write_egpr(reg, val); - break; - default: - WARN_ON_ONCE(1); - } -} +#ifdef CONFIG_KVM_APX +unsigned long kvm_gpr_read_raw(struct kvm_vcpu *vcpu, int reg); +void kvm_gpr_write_raw(struct kvm_vcpu *vcpu, int reg, unsigned long val); #else -static inline unsigned long _kvm_gpr_read(struct kvm_vcpu *vcpu, int reg) +static inline unsigned long kvm_gpr_read_raw(struct kvm_vcpu *vcpu, int reg) { return kvm_register_read_raw(vcpu, reg); } -static inline void _kvm_gpr_write(struct kvm_vcpu *vcpu, int reg, unsigned long val) +static inline void kvm_gpr_write_raw(struct kvm_vcpu *vcpu, int reg, unsigned long val) { kvm_register_write_raw(vcpu, reg, val); } @@ -442,7 +417,7 @@ static inline void _kvm_gpr_write(struct kvm_vcpu *vcpu, int reg, unsigned long static inline unsigned long kvm_gpr_read(struct kvm_vcpu *vcpu, int reg) { - unsigned long val = _kvm_gpr_read(vcpu, reg); + unsigned long val = kvm_gpr_read_raw(vcpu, reg); return is_64_bit_mode(vcpu) ? val : (u32)val; } @@ -451,7 +426,7 @@ static inline void kvm_gpr_write(struct kvm_vcpu *vcpu, int reg, unsigned long v { if (!is_64_bit_mode(vcpu)) val = (u32)val; - _kvm_gpr_write(vcpu, reg, val); + kvm_gpr_write_raw(vcpu, reg, val); } static inline bool kvm_check_has_quirk(struct kvm *kvm, u64 quirk)