xemu/target/i386
Liran Alon 79a197ab18 target/i386: kvm: Demand nested migration kernel capabilities only when vCPU may have enabled VMX
Previous to this change, a vCPU exposed with VMX running on a kernel
without KVM_CAP_NESTED_STATE or KVM_CAP_EXCEPTION_PAYLOAD resulted in
adding a migration blocker. This was because when the code was written
it was thought there is no way to reliably know if a vCPU is utilising
VMX or not at runtime. However, it turns out that this can be known to
some extent:

In order for a vCPU to enter VMX operation it must have CR4.VMXE set.
Since it was set, CR4.VMXE must remain set as long as the vCPU is in
VMX operation. This is because CR4.VMXE is one of the bits set
in MSR_IA32_VMX_CR4_FIXED1.
There is one exception to the above statement when vCPU enters SMM mode.
When a vCPU enters SMM mode, it temporarily exits VMX operation and
may also reset CR4.VMXE during execution in SMM mode.
When the vCPU exits SMM mode, vCPU state is restored to be in VMX operation
and CR4.VMXE is restored to its original state of being set.
Therefore, when the vCPU is not in SMM mode, we can infer whether
VMX is being used by examining CR4.VMXE. Otherwise, we cannot
know for certain but assume the worse that vCPU may utilise VMX.

Summaring all the above, a vCPU may have enabled VMX in case
CR4.VMXE is set or vCPU is in SMM mode.

Therefore, remove migration blocker and check before migration
(cpu_pre_save()) if the vCPU may have enabled VMX. If true, only then
require relevant kernel capabilities.

While at it, demand KVM_CAP_EXCEPTION_PAYLOAD only when the vCPU is in
guest-mode and there is a pending/injected exception. Otherwise, this
kernel capability is not required for proper migration.

Reviewed-by: Joao Martins <joao.m.martins@oracle.com>
Signed-off-by: Liran Alon <liran.alon@oracle.com>
Reviewed-by: Maran Wilson <maran.wilson@oracle.com>
Tested-by: Maran Wilson <maran.wilson@oracle.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2019-07-19 18:01:47 +02:00
..
hvf target/i386: kvm: Add support for KVM_CAP_EXCEPTION_PAYLOAD 2019-06-21 13:25:27 +02:00
arch_dump.c dump: add kernel_gs_base to QEMU CPU state 2018-07-16 16:13:34 +02:00
arch_memory_mapping.c exec,dump,i386,ppc,s390x: don't include exec/cpu-all.h explicitly 2017-09-19 18:21:33 +02:00
bpt_helper.c target/i386: Use env_cpu, env_archcpu 2019-06-10 07:03:42 -07:00
cc_helper_template.h Move target-* CPU file into a target/ folder 2016-12-20 21:52:12 +01:00
cc_helper.c target-i386: Use ctpop helper 2017-01-10 08:49:59 -08:00
cpu-param.h tcg: Split out target/arch/cpu-param.h 2019-06-10 07:03:34 -07:00
cpu-qom.h i386: Register versioned CPU models 2019-07-05 17:08:04 -03:00
cpu.c i386: Add Cascadelake-Server-v2 CPU model 2019-07-05 17:12:30 -03:00
cpu.h target/i386: kvm: Demand nested migration kernel capabilities only when vCPU may have enabled VMX 2019-07-19 18:01:47 +02:00
excp_helper.c target/i386: Use env_cpu, env_archcpu 2019-06-10 07:03:42 -07:00
fpu_helper.c target/i386: Use env_cpu, env_archcpu 2019-06-10 07:03:42 -07:00
gdbstub.c Include qemu-common.h exactly where needed 2019-06-12 13:20:20 +02:00
hax-all.c hax: Honor CPUState::halted 2019-06-21 02:29:38 +02:00
hax-i386.h Clean up ill-advised or unusual header guards 2019-05-13 08:58:55 +02:00
hax-interface.h Clean up ill-advised or unusual header guards 2019-05-13 08:58:55 +02:00
hax-mem.c qemu/queue.h: leave head structs anonymous unless necessary 2019-01-11 15:46:55 +01:00
hax-posix.c hax: Support for Linux hosts 2019-01-11 13:57:24 +01:00
hax-posix.h Clean up header guards that don't match their file name 2019-05-13 08:58:55 +02:00
hax-windows.c target: Do not include "exec/exec-all.h" if it is not necessary 2018-06-01 14:15:10 +02:00
hax-windows.h hax: Support guest RAM sizes of 4GB or more 2018-02-13 11:44:13 +01:00
helper.c qemu-common: Move tcg_enabled() etc. to sysemu/tcg.h 2019-06-11 20:22:09 +02:00
helper.h target/i386: Implement CPUID_EXT_RDRAND 2019-05-22 12:38:54 -04:00
hyperv-proto.h i386/kvm: add support for Direct Mode for Hyper-V synthetic timers 2019-06-21 02:29:39 +02:00
hyperv-stub.c target/i386: fix feature check in hyperv-stub.c 2019-07-05 22:16:46 +02:00
hyperv.c i386/kvm: convert hyperv enlightenments properties from bools to bits 2019-06-21 02:29:38 +02:00
hyperv.h hyperv: qom-ify SynIC 2018-10-19 13:44:14 +02:00
int_helper.c target/i386: Implement CPUID_EXT_RDRAND 2019-05-22 12:38:54 -04:00
kvm_i386.h target/i386: kvm: Demand nested migration kernel capabilities only when vCPU may have enabled VMX 2019-07-19 18:01:47 +02:00
kvm-stub.c Include qemu-common.h exactly where needed 2019-06-12 13:20:20 +02:00
kvm.c target/i386: kvm: Demand nested migration kernel capabilities only when vCPU may have enabled VMX 2019-07-19 18:01:47 +02:00
machine.c target/i386: kvm: Demand nested migration kernel capabilities only when vCPU may have enabled VMX 2019-07-19 18:01:47 +02:00
Makefile.objs target-i386: add kvm stubs to user-mode emulators 2019-03-11 16:33:49 +01:00
mem_helper.c cpu: Replace ENV_GET_CPU with env_cpu 2019-06-10 07:03:34 -07:00
misc_helper.c target/i386: Use env_cpu, env_archcpu 2019-06-10 07:03:42 -07:00
monitor.c hmp: Move hmp.h to include/monitor/ 2019-07-02 07:19:45 +02:00
mpx_helper.c target/i386: move cpu_sync_bndcs_hflags() function 2017-07-05 09:12:44 +02:00
ops_sse_header.h target-i386: Use ctpop helper 2017-01-10 08:49:59 -08:00
ops_sse.h target/i386: fix phminposuw in-place operation 2017-09-19 14:09:11 +02:00
seg_helper.c target/i386: Use env_cpu, env_archcpu 2019-06-10 07:03:42 -07:00
sev_i386.h qapi: Rename target.json to misc-target.json 2019-07-02 13:37:00 +02:00
sev-stub.c Include qemu-common.h exactly where needed 2019-06-12 13:20:20 +02:00
sev.c target/i386: sev: Do not unpin ram device memory region 2019-07-15 20:58:37 +02:00
shift_helper_template.h Move target-* CPU file into a target/ folder 2016-12-20 21:52:12 +01:00
smm_helper.c target/i386: Use env_cpu, env_archcpu 2019-06-10 07:03:42 -07:00
svm_helper.c target/i386: Use env_cpu, env_archcpu 2019-06-10 07:03:42 -07:00
svm.h target-i386: Add NPT support 2018-07-02 15:41:18 +02:00
TODO Move target-* CPU file into a target/ folder 2016-12-20 21:52:12 +01:00
trace-events trace-events: Shorten file names in comments 2019-03-22 16:18:07 +00:00
translate.c target/i386: Implement CPUID_EXT_RDRAND 2019-05-22 12:38:54 -04:00
whp-dispatch.h Normalize position of header guard 2019-06-12 13:20:20 +02:00
whpx-all.c Fix broken build with WHPX enabled 2019-07-15 11:20:43 +02:00
xsave_helper.c Include qemu-common.h exactly where needed 2019-06-12 13:20:20 +02:00