-bugfix: fix qmp command migrate-set-parameters -some bugfixs about ARM hot-plugged CPUs -hw/core/machine:Fix the missing consideration of cluster-id -test/tcg:Fix target-specific Makefile variable path for user-mode -tests:add (riscv virt) machine mapping to testenv -Make a litte improvement in curl and hw/riscv -qemu support for loongarch -hw/pvrdma: Protect against buggy or malious guest driver -hw/audio/intel-hda:fix stream reset -dsoundaudio:fix crackling audio recordings -add notify-vm-exit support for i386 -blok-backend: prevent dangling BDS pointers across aio_poll() -net:Fix uninitialized data usage -net/eth:Don't consider ESP to be an IPv6 option header -hw/net/vmxnet3:Log guest-triggerable errors using LOG_GUEST_ERROR Signed-off-by: FeiXu <xufei30@huawei.com>
157 lines
4.9 KiB
Diff
157 lines
4.9 KiB
Diff
From 752fe0479931f6ef512b6a048fb50364505ff713 Mon Sep 17 00:00:00 2001
|
|
From: Chenyi Qiang <chenyi.qiang@intel.com>
|
|
Date: Thu, 29 Sep 2022 15:20:11 +0800
|
|
Subject: [PATCH] i386: kvm: extend kvm_{get, put}_vcpu_events to support
|
|
pending triple fault
|
|
|
|
from mainline-v7.2.0-rc0
|
|
commit 12f89a39cf3c5760cba82ce68929d748961f62df
|
|
category: feature
|
|
feature: Notify VM Exit
|
|
bugzilla: https://gitee.com/openeuler/intel-qemu/issues/I6GWQE
|
|
|
|
Intel-SIG: commit 12f89a39cf3c ("i386: kvm: extend kvm_{get, put}_vcpu_events to support pending triple fault")
|
|
|
|
------------------------------------------------------------------
|
|
|
|
i386: kvm: extend kvm_{get, put}_vcpu_events to support pending triple fault
|
|
|
|
For the direct triple faults, i.e. hardware detected and KVM morphed
|
|
to VM-Exit, KVM will never lose them. But for triple faults sythesized
|
|
by KVM, e.g. the RSM path, if KVM exits to userspace before the request
|
|
is serviced, userspace could migrate the VM and lose the triple fault.
|
|
|
|
A new flag KVM_VCPUEVENT_VALID_TRIPLE_FAULT is defined to signal that
|
|
the event.triple_fault_pending field contains a valid state if the
|
|
KVM_CAP_X86_TRIPLE_FAULT_EVENT capability is enabled.
|
|
|
|
Acked-by: Peter Xu <peterx@redhat.com>
|
|
Signed-off-by: Chenyi Qiang <chenyi.qiang@intel.com>
|
|
Message-Id: <20220929072014.20705-2-chenyi.qiang@intel.com>
|
|
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
Signed-off-by: Jason Zeng <jason.zeng@intel.com>
|
|
---
|
|
target/i386/cpu.c | 1 +
|
|
target/i386/cpu.h | 1 +
|
|
target/i386/kvm/kvm.c | 20 ++++++++++++++++++++
|
|
target/i386/machine.c | 20 ++++++++++++++++++++
|
|
4 files changed, 42 insertions(+)
|
|
|
|
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
|
|
index 551b47ab1e..e3cea8397c 100644
|
|
--- a/target/i386/cpu.c
|
|
+++ b/target/i386/cpu.c
|
|
@@ -6018,6 +6018,7 @@ static void x86_cpu_reset(DeviceState *dev)
|
|
env->exception_has_payload = false;
|
|
env->exception_payload = 0;
|
|
env->nmi_injected = false;
|
|
+ env->triple_fault_pending = false;
|
|
#if !defined(CONFIG_USER_ONLY)
|
|
/* We hard-wire the BSP to the first CPU. */
|
|
apic_designate_bsp(cpu->apic_state, s->cpu_index == 0);
|
|
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
|
|
index 290f1beaea..4f7fa87b95 100644
|
|
--- a/target/i386/cpu.h
|
|
+++ b/target/i386/cpu.h
|
|
@@ -1698,6 +1698,7 @@ typedef struct CPUX86State {
|
|
uint8_t has_error_code;
|
|
uint8_t exception_has_payload;
|
|
uint64_t exception_payload;
|
|
+ uint8_t triple_fault_pending;
|
|
uint32_t ins_len;
|
|
uint32_t sipi_vector;
|
|
bool tsc_valid;
|
|
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
|
|
index 5b15e0430b..e97d967c73 100644
|
|
--- a/target/i386/kvm/kvm.c
|
|
+++ b/target/i386/kvm/kvm.c
|
|
@@ -127,6 +127,7 @@ static int has_xsave2;
|
|
static int has_xcrs;
|
|
static int has_pit_state2;
|
|
static int has_exception_payload;
|
|
+static int has_triple_fault_event;
|
|
|
|
static bool has_msr_mcg_ext_ctl;
|
|
|
|
@@ -2380,6 +2381,16 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
|
|
}
|
|
}
|
|
|
|
+ has_triple_fault_event = kvm_check_extension(s, KVM_CAP_X86_TRIPLE_FAULT_EVENT);
|
|
+ if (has_triple_fault_event) {
|
|
+ ret = kvm_vm_enable_cap(s, KVM_CAP_X86_TRIPLE_FAULT_EVENT, 0, true);
|
|
+ if (ret < 0) {
|
|
+ error_report("kvm: Failed to enable triple fault event cap: %s",
|
|
+ strerror(-ret));
|
|
+ return ret;
|
|
+ }
|
|
+ }
|
|
+
|
|
ret = kvm_get_supported_msrs(s);
|
|
if (ret < 0) {
|
|
return ret;
|
|
@@ -4004,6 +4015,11 @@ static int kvm_put_vcpu_events(X86CPU *cpu, int level)
|
|
}
|
|
}
|
|
|
|
+ if (has_triple_fault_event) {
|
|
+ events.flags |= KVM_VCPUEVENT_VALID_TRIPLE_FAULT;
|
|
+ events.triple_fault.pending = env->triple_fault_pending;
|
|
+ }
|
|
+
|
|
return kvm_vcpu_ioctl(CPU(cpu), KVM_SET_VCPU_EVENTS, &events);
|
|
}
|
|
|
|
@@ -4073,6 +4089,10 @@ static int kvm_get_vcpu_events(X86CPU *cpu)
|
|
}
|
|
}
|
|
|
|
+ if (events.flags & KVM_VCPUEVENT_VALID_TRIPLE_FAULT) {
|
|
+ env->triple_fault_pending = events.triple_fault.pending;
|
|
+ }
|
|
+
|
|
env->sipi_vector = events.sipi_vector;
|
|
|
|
return 0;
|
|
diff --git a/target/i386/machine.c b/target/i386/machine.c
|
|
index 3977e9d8f8..41cf5c0053 100644
|
|
--- a/target/i386/machine.c
|
|
+++ b/target/i386/machine.c
|
|
@@ -1497,6 +1497,25 @@ static const VMStateDescription vmstate_amx_xtile = {
|
|
};
|
|
#endif
|
|
|
|
+static bool triple_fault_needed(void *opaque)
|
|
+{
|
|
+ X86CPU *cpu = opaque;
|
|
+ CPUX86State *env = &cpu->env;
|
|
+
|
|
+ return env->triple_fault_pending;
|
|
+}
|
|
+
|
|
+static const VMStateDescription vmstate_triple_fault = {
|
|
+ .name = "cpu/triple_fault",
|
|
+ .version_id = 1,
|
|
+ .minimum_version_id = 1,
|
|
+ .needed = triple_fault_needed,
|
|
+ .fields = (VMStateField[]) {
|
|
+ VMSTATE_UINT8(env.triple_fault_pending, X86CPU),
|
|
+ VMSTATE_END_OF_LIST()
|
|
+ }
|
|
+};
|
|
+
|
|
const VMStateDescription vmstate_x86_cpu = {
|
|
.name = "cpu",
|
|
.version_id = 12,
|
|
@@ -1639,6 +1658,7 @@ const VMStateDescription vmstate_x86_cpu = {
|
|
#ifdef TARGET_X86_64
|
|
&vmstate_amx_xtile,
|
|
#endif
|
|
+ &vmstate_triple_fault,
|
|
NULL
|
|
}
|
|
};
|
|
--
|
|
2.27.0
|
|
|