[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 02/24] accel/kvm/kvm-all: Handle register access errors
|
From: |
Paolo Bonzini |
|
Subject: |
[PULL 02/24] accel/kvm/kvm-all: Handle register access errors |
|
Date: |
Tue, 3 Oct 2023 10:30:19 +0200 |
From: Akihiko Odaki <akihiko.odaki@daynix.com>
A register access error typically means something seriously wrong
happened so that anything bad can happen after that and recovery is
impossible.
Even failing one register access is catastorophic as
architecture-specific code are not written so that it torelates such
failures.
Make sure the VM stop and nothing worse happens if such an error occurs.
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Message-ID: <20221201102728.69751-1-akihiko.odaki@daynix.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
accel/kvm/kvm-all.c | 32 ++++++++++++++++++++++++++++----
1 file changed, 28 insertions(+), 4 deletions(-)
diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
index ff1578bb32b..72e1d1141c4 100644
--- a/accel/kvm/kvm-all.c
+++ b/accel/kvm/kvm-all.c
@@ -2851,7 +2851,13 @@ bool kvm_cpu_check_are_resettable(void)
static void do_kvm_cpu_synchronize_state(CPUState *cpu, run_on_cpu_data arg)
{
if (!cpu->vcpu_dirty) {
- kvm_arch_get_registers(cpu);
+ int ret = kvm_arch_get_registers(cpu);
+ if (ret) {
+ error_report("Failed to get registers: %s", strerror(-ret));
+ cpu_dump_state(cpu, stderr, CPU_DUMP_CODE);
+ vm_stop(RUN_STATE_INTERNAL_ERROR);
+ }
+
cpu->vcpu_dirty = true;
}
}
@@ -2865,7 +2871,13 @@ void kvm_cpu_synchronize_state(CPUState *cpu)
static void do_kvm_cpu_synchronize_post_reset(CPUState *cpu, run_on_cpu_data
arg)
{
- kvm_arch_put_registers(cpu, KVM_PUT_RESET_STATE);
+ int ret = kvm_arch_put_registers(cpu, KVM_PUT_RESET_STATE);
+ if (ret) {
+ error_report("Failed to put registers after reset: %s",
strerror(-ret));
+ cpu_dump_state(cpu, stderr, CPU_DUMP_CODE);
+ vm_stop(RUN_STATE_INTERNAL_ERROR);
+ }
+
cpu->vcpu_dirty = false;
}
@@ -2876,7 +2888,12 @@ void kvm_cpu_synchronize_post_reset(CPUState *cpu)
static void do_kvm_cpu_synchronize_post_init(CPUState *cpu, run_on_cpu_data
arg)
{
- kvm_arch_put_registers(cpu, KVM_PUT_FULL_STATE);
+ int ret = kvm_arch_put_registers(cpu, KVM_PUT_FULL_STATE);
+ if (ret) {
+ error_report("Failed to put registers after init: %s", strerror(-ret));
+ exit(1);
+ }
+
cpu->vcpu_dirty = false;
}
@@ -2969,7 +2986,14 @@ int kvm_cpu_exec(CPUState *cpu)
MemTxAttrs attrs;
if (cpu->vcpu_dirty) {
- kvm_arch_put_registers(cpu, KVM_PUT_RUNTIME_STATE);
+ ret = kvm_arch_put_registers(cpu, KVM_PUT_RUNTIME_STATE);
+ if (ret) {
+ error_report("Failed to put registers after init: %s",
+ strerror(-ret));
+ ret = -1;
+ break;
+ }
+
cpu->vcpu_dirty = false;
}
--
2.41.0
- [PULL 00/24] Audio, build system, misc fixes for 2023-10-03, Paolo Bonzini, 2023/10/03
- [PULL 01/24] optionrom: Remove build-id section, Paolo Bonzini, 2023/10/03
- [PULL 06/24] meson: clean up static_library keyword arguments, Paolo Bonzini, 2023/10/03
- [PULL 02/24] accel/kvm/kvm-all: Handle register access errors,
Paolo Bonzini <=
- [PULL 03/24] e1000: remove old compatibility code, Paolo Bonzini, 2023/10/03
- [PULL 07/24] Makefile: build plugins before running TCG tests, Paolo Bonzini, 2023/10/03
- [PULL 11/24] crypto: only include tls-cipher-suites in emulators, Paolo Bonzini, 2023/10/03
- [PULL 12/24] ui/vnc: Require audiodev= to enable audio, Paolo Bonzini, 2023/10/03
- [PULL 05/24] make-release: do not ship dtc sources, Paolo Bonzini, 2023/10/03
- [PULL 10/24] scsi-disk: ensure that FORMAT UNIT commands are terminated, Paolo Bonzini, 2023/10/03
- [PULL 21/24] hw/ppc: Support machine-default audiodev with fallback, Paolo Bonzini, 2023/10/03
- [PULL 08/24] esp: use correct type for esp_dma_enable() in sysbus_esp_gpio_demux(), Paolo Bonzini, 2023/10/03
- [PULL 15/24] audio: return Error ** from audio_state_by_name, Paolo Bonzini, 2023/10/03
- [PULL 16/24] audio: commonize voice initialization, Paolo Bonzini, 2023/10/03