mirror of
https://github.com/torvalds/linux.git
synced 2024-12-26 04:42:12 +00:00
0d1e8b8d2b
ARM: - Improved guest IPA space support (32 to 52 bits) - RAS event delivery for 32bit - PMU fixes - Guest entry hardening - Various cleanups - Port of dirty_log_test selftest PPC: - Nested HV KVM support for radix guests on POWER9. The performance is much better than with PR KVM. Migration and arbitrary level of nesting is supported. - Disable nested HV-KVM on early POWER9 chips that need a particular hardware bug workaround - One VM per core mode to prevent potential data leaks - PCI pass-through optimization - merge ppc-kvm topic branch and kvm-ppc-fixes to get a better base s390: - Initial version of AP crypto virtualization via vfio-mdev - Improvement for vfio-ap - Set the host program identifier - Optimize page table locking x86: - Enable nested virtualization by default - Implement Hyper-V IPI hypercalls - Improve #PF and #DB handling - Allow guests to use Enlightened VMCS - Add migration selftests for VMCS and Enlightened VMCS - Allow coalesced PIO accesses - Add an option to perform nested VMCS host state consistency check through hardware - Automatic tuning of lapic_timer_advance_ns - Many fixes, minor improvements, and cleanups -----BEGIN PGP SIGNATURE----- iQEcBAABCAAGBQJb0FINAAoJEED/6hsPKofoI60IAJRS3vOAQ9Fav8cJsO1oBHcX 3+NexfnBke1bzrjIR3SUcHKGZbdnVPNZc+Q4JjIbPpPmmOMU5jc9BC1dmd5f4Vzh BMnQ0yCvgFv3A3fy/Icx1Z8NJppxosdmqdQLrQrNo8aD3cjnqY2yQixdXrAfzLzw XEgKdIFCCz8oVN/C9TT4wwJn6l9OE7BM5bMKGFy5VNXzMu7t64UDOLbbjZxNgi1g teYvfVGdt5mH0N7b2GPPWRbJmgnz5ygVVpVNQUEFrdKZoCm6r5u9d19N+RRXAwan ZYFj10W2T8pJOUf3tryev4V33X7MRQitfJBo4tP5hZfi9uRX89np5zP1CFE7AtY= =yEPW -----END PGP SIGNATURE----- Merge tag 'kvm-4.20-1' of git://git.kernel.org/pub/scm/virt/kvm/kvm Pull KVM updates from Radim Krčmář: "ARM: - Improved guest IPA space support (32 to 52 bits) - RAS event delivery for 32bit - PMU fixes - Guest entry hardening - Various cleanups - Port of dirty_log_test selftest PPC: - Nested HV KVM support for radix guests on POWER9. The performance is much better than with PR KVM. Migration and arbitrary level of nesting is supported. - Disable nested HV-KVM on early POWER9 chips that need a particular hardware bug workaround - One VM per core mode to prevent potential data leaks - PCI pass-through optimization - merge ppc-kvm topic branch and kvm-ppc-fixes to get a better base s390: - Initial version of AP crypto virtualization via vfio-mdev - Improvement for vfio-ap - Set the host program identifier - Optimize page table locking x86: - Enable nested virtualization by default - Implement Hyper-V IPI hypercalls - Improve #PF and #DB handling - Allow guests to use Enlightened VMCS - Add migration selftests for VMCS and Enlightened VMCS - Allow coalesced PIO accesses - Add an option to perform nested VMCS host state consistency check through hardware - Automatic tuning of lapic_timer_advance_ns - Many fixes, minor improvements, and cleanups" * tag 'kvm-4.20-1' of git://git.kernel.org/pub/scm/virt/kvm/kvm: (204 commits) KVM/nVMX: Do not validate that posted_intr_desc_addr is page aligned Revert "kvm: x86: optimize dr6 restore" KVM: PPC: Optimize clearing TCEs for sparse tables x86/kvm/nVMX: tweak shadow fields selftests/kvm: add missing executables to .gitignore KVM: arm64: Safety check PSTATE when entering guest and handle IL KVM: PPC: Book3S HV: Don't use streamlined entry path on early POWER9 chips arm/arm64: KVM: Enable 32 bits kvm vcpu events support arm/arm64: KVM: Rename function kvm_arch_dev_ioctl_check_extension() KVM: arm64: Fix caching of host MDCR_EL2 value KVM: VMX: enable nested virtualization by default KVM/x86: Use 32bit xor to clear registers in svm.c kvm: x86: Introduce KVM_CAP_EXCEPTION_PAYLOAD kvm: vmx: Defer setting of DR6 until #DB delivery kvm: x86: Defer setting of CR2 until #PF delivery kvm: x86: Add payload operands to kvm_multiple_exception kvm: x86: Add exception payload fields to kvm_vcpu_events kvm: x86: Add has_payload and payload to kvm_queued_exception KVM: Documentation: Fix omission in struct kvm_vcpu_events KVM: selftests: add Enlightened VMCS test ...
130 lines
2.7 KiB
C
130 lines
2.7 KiB
C
/* CPU virtualization extensions handling
|
|
*
|
|
* This should carry the code for handling CPU virtualization extensions
|
|
* that needs to live in the kernel core.
|
|
*
|
|
* Author: Eduardo Habkost <ehabkost@redhat.com>
|
|
*
|
|
* Copyright (C) 2008, Red Hat Inc.
|
|
*
|
|
* Contains code from KVM, Copyright (C) 2006 Qumranet, Inc.
|
|
*
|
|
* This work is licensed under the terms of the GNU GPL, version 2. See
|
|
* the COPYING file in the top-level directory.
|
|
*/
|
|
#ifndef _ASM_X86_VIRTEX_H
|
|
#define _ASM_X86_VIRTEX_H
|
|
|
|
#include <asm/processor.h>
|
|
|
|
#include <asm/vmx.h>
|
|
#include <asm/svm.h>
|
|
#include <asm/tlbflush.h>
|
|
|
|
/*
|
|
* VMX functions:
|
|
*/
|
|
|
|
static inline int cpu_has_vmx(void)
|
|
{
|
|
unsigned long ecx = cpuid_ecx(1);
|
|
return test_bit(5, &ecx); /* CPUID.1:ECX.VMX[bit 5] -> VT */
|
|
}
|
|
|
|
|
|
/** Disable VMX on the current CPU
|
|
*
|
|
* vmxoff causes a undefined-opcode exception if vmxon was not run
|
|
* on the CPU previously. Only call this function if you know VMX
|
|
* is enabled.
|
|
*/
|
|
static inline void cpu_vmxoff(void)
|
|
{
|
|
asm volatile ("vmxoff");
|
|
cr4_clear_bits(X86_CR4_VMXE);
|
|
}
|
|
|
|
static inline int cpu_vmx_enabled(void)
|
|
{
|
|
return __read_cr4() & X86_CR4_VMXE;
|
|
}
|
|
|
|
/** Disable VMX if it is enabled on the current CPU
|
|
*
|
|
* You shouldn't call this if cpu_has_vmx() returns 0.
|
|
*/
|
|
static inline void __cpu_emergency_vmxoff(void)
|
|
{
|
|
if (cpu_vmx_enabled())
|
|
cpu_vmxoff();
|
|
}
|
|
|
|
/** Disable VMX if it is supported and enabled on the current CPU
|
|
*/
|
|
static inline void cpu_emergency_vmxoff(void)
|
|
{
|
|
if (cpu_has_vmx())
|
|
__cpu_emergency_vmxoff();
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
* SVM functions:
|
|
*/
|
|
|
|
/** Check if the CPU has SVM support
|
|
*
|
|
* You can use the 'msg' arg to get a message describing the problem,
|
|
* if the function returns zero. Simply pass NULL if you are not interested
|
|
* on the messages; gcc should take care of not generating code for
|
|
* the messages on this case.
|
|
*/
|
|
static inline int cpu_has_svm(const char **msg)
|
|
{
|
|
if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD &&
|
|
boot_cpu_data.x86_vendor != X86_VENDOR_HYGON) {
|
|
if (msg)
|
|
*msg = "not amd or hygon";
|
|
return 0;
|
|
}
|
|
|
|
if (boot_cpu_data.extended_cpuid_level < SVM_CPUID_FUNC) {
|
|
if (msg)
|
|
*msg = "can't execute cpuid_8000000a";
|
|
return 0;
|
|
}
|
|
|
|
if (!boot_cpu_has(X86_FEATURE_SVM)) {
|
|
if (msg)
|
|
*msg = "svm not available";
|
|
return 0;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
|
|
/** Disable SVM on the current CPU
|
|
*
|
|
* You should call this only if cpu_has_svm() returned true.
|
|
*/
|
|
static inline void cpu_svm_disable(void)
|
|
{
|
|
uint64_t efer;
|
|
|
|
wrmsrl(MSR_VM_HSAVE_PA, 0);
|
|
rdmsrl(MSR_EFER, efer);
|
|
wrmsrl(MSR_EFER, efer & ~EFER_SVME);
|
|
}
|
|
|
|
/** Makes sure SVM is disabled, if it is supported on the CPU
|
|
*/
|
|
static inline void cpu_emergency_svm_disable(void)
|
|
{
|
|
if (cpu_has_svm(NULL))
|
|
cpu_svm_disable();
|
|
}
|
|
|
|
#endif /* _ASM_X86_VIRTEX_H */
|