mirror of https://github.com/xemu-project/xemu.git
accel/kvm/kvm-all: Handle register access errors
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>
This commit is contained in:
parent
35ed01ba54
commit
7191f24c7f
|
@ -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)
|
static void do_kvm_cpu_synchronize_state(CPUState *cpu, run_on_cpu_data arg)
|
||||||
{
|
{
|
||||||
if (!cpu->vcpu_dirty) {
|
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;
|
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)
|
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;
|
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)
|
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;
|
cpu->vcpu_dirty = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2969,7 +2986,14 @@ int kvm_cpu_exec(CPUState *cpu)
|
||||||
MemTxAttrs attrs;
|
MemTxAttrs attrs;
|
||||||
|
|
||||||
if (cpu->vcpu_dirty) {
|
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;
|
cpu->vcpu_dirty = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue