- tests: bump QOS_PATH_MAX_ELEMENT_SIZE again - softmmu/physmem: fix memory leak in dirty_memory_extend() - crypto: run qcrypto_pbkdf2_count_iters in a new thread - hw/audio/virtio-sound: fix heap buffer overflow - hw/intc/arm_gic: fix spurious level triggered interrupts - ui/sdl2: set swap interval explicitly when OpenGL is enabled - target/riscv/kvm: tolerate KVM disable ext errors - virtio: remove virtio_tswap16s() call in vring_packed_event_read() - block: fix -Werror=maybe-uninitialized false-positive - hw/remote/vfio-user: Fix config space access byte order - hw/loongarch/virt: Fix memory leak - hw/intc/riscv_aplic: APLICs should add child earlier than realize - stdvga: fix screen blanking - ui/gtk: Draw guest frame at refresh cycle - target/i386: fix size of EBP writeback in gen_enter() - virtio-net: drop too short packets early - target/ppc: Fix lxv/stxv MSR facility check - target/ppc: Fix lxvx/stxvx facility check - virtio-snd: add max size bounds check in input cb(CVE-2024-7730) Signed-off-by: Jiabo Feng <fengjiabo1@huawei.com> (cherry picked from commit e2eb79f1867bb8d8d870e758f06d2a32b3a4fc8a)
70 lines
3.1 KiB
Diff
70 lines
3.1 KiB
Diff
From 33d8e65f37caa34bf0c18a3ecbaa48d3b706564b Mon Sep 17 00:00:00 2001
|
|
From: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
|
|
Date: Mon, 22 Apr 2024 14:14:25 -0300
|
|
Subject: [PATCH] target/riscv/kvm: tolerate KVM disable ext errors
|
|
|
|
Running a KVM guest using a 6.9-rc3 kernel, in a 6.8 host that has zkr
|
|
enabled, will fail with a kernel oops SIGILL right at the start. The
|
|
reason is that we can't expose zkr without implementing the SEED CSR.
|
|
Disabling zkr in the guest would be a workaround, but if the KVM doesn't
|
|
allow it we'll error out and never boot.
|
|
|
|
In hindsight this is too strict. If we keep proceeding, despite not
|
|
disabling the extension in the KVM vcpu, we'll not add the extension in
|
|
the riscv,isa. The guest kernel will be unaware of the extension, i.e.
|
|
it doesn't matter if the KVM vcpu has it enabled underneath or not. So
|
|
it's ok to keep booting in this case.
|
|
|
|
Change our current logic to not error out if we fail to disable an
|
|
extension in kvm_set_one_reg(), but show a warning and keep booting. It
|
|
is important to throw a warning because we must make the user aware that
|
|
the extension is still available in the vcpu, meaning that an
|
|
ill-behaved guest can ignore the riscv,isa settings and use the
|
|
extension.
|
|
|
|
The case we're handling happens with an EINVAL error code. If we fail to
|
|
disable the extension in KVM for any other reason, error out.
|
|
|
|
We'll also keep erroring out when we fail to enable an extension in KVM,
|
|
since adding the extension in riscv,isa at this point will cause a guest
|
|
malfunction because the extension isn't enabled in the vcpu.
|
|
|
|
Suggested-by: Andrew Jones <ajones@ventanamicro.com>
|
|
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
|
|
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
|
|
Cc: qemu-stable <qemu-stable@nongnu.org>
|
|
Message-ID: <20240422171425.333037-2-dbarboza@ventanamicro.com>
|
|
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
|
|
(cherry picked from commit 1215d45b2aa97512a2867e401aa59f3d0c23cb23)
|
|
Signed-off-by: zhujun2 <zhujun2_yewu@cmss.chinamobile.com>
|
|
---
|
|
target/riscv/kvm/kvm-cpu.c | 12 ++++++++----
|
|
1 file changed, 8 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/target/riscv/kvm/kvm-cpu.c b/target/riscv/kvm/kvm-cpu.c
|
|
index 45b6cf1cfa..b3dc2070f9 100644
|
|
--- a/target/riscv/kvm/kvm-cpu.c
|
|
+++ b/target/riscv/kvm/kvm-cpu.c
|
|
@@ -369,10 +369,14 @@ static void kvm_riscv_update_cpu_cfg_isa_ext(RISCVCPU *cpu, CPUState *cs)
|
|
reg = kvm_cpu_cfg_get(cpu, multi_ext_cfg);
|
|
ret = kvm_set_one_reg(cs, id, ®);
|
|
if (ret != 0) {
|
|
- error_report("Unable to %s extension %s in KVM, error %d",
|
|
- reg ? "enable" : "disable",
|
|
- multi_ext_cfg->name, ret);
|
|
- exit(EXIT_FAILURE);
|
|
+ if (!reg && ret == -EINVAL) {
|
|
+ warn_report("KVM cannot disable extension %s",
|
|
+ multi_ext_cfg->name);
|
|
+ } else {
|
|
+ error_report("Unable to enable extension %s in KVM, error %d",
|
|
+ multi_ext_cfg->name, ret);
|
|
+ exit(EXIT_FAILURE);
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
--
|
|
2.41.0.windows.1
|
|
|