mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00
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 */
|