From e618d7765082d3f0df18b7f89be571600453d62c Mon Sep 17 00:00:00 2001 From: Jon Maloy Date: Mon, 3 Nov 2025 18:23:08 -0500 Subject: [PATCH] * Mon Nov 03 2025 Jon Maloy - 10.1.0-2 - kvm-arm-kvm-report-registers-we-failed-to-set.patch [RHEL-119369] - Resolves: RHEL-119369 ([rhel9] Backport "arm/kvm: report registers we failed to set") --- ...vm-report-registers-we-failed-to-set.patch | 154 ++++++++++++++++++ qemu-kvm.spec | 9 +- 2 files changed, 162 insertions(+), 1 deletion(-) create mode 100644 kvm-arm-kvm-report-registers-we-failed-to-set.patch diff --git a/kvm-arm-kvm-report-registers-we-failed-to-set.patch b/kvm-arm-kvm-report-registers-we-failed-to-set.patch new file mode 100644 index 0000000..50505c8 --- /dev/null +++ b/kvm-arm-kvm-report-registers-we-failed-to-set.patch @@ -0,0 +1,154 @@ +From 0e0943cee211f37ed1cadad872ff66225c1b4f8a Mon Sep 17 00:00:00 2001 +From: Cornelia Huck +Date: Thu, 11 Sep 2025 17:41:59 +0200 +Subject: [PATCH] arm/kvm: report registers we failed to set + +RH-Author: Eric Auger +RH-MergeRequest: 409: arm/kvm: report registers we failed to set +RH-Jira: RHEL-119369 +RH-Acked-by: Cornelia Huck +RH-Acked-by: Sebastian Ott +RH-Acked-by: Donald Dutile +RH-Acked-by: Gavin Shan +RH-Commit: [1/1] ac1c4b5105f4982453c61c94cb27c85b30c77e82 (eauger1/centos-qemu-kvm) + +If we fail migration because of a mismatch of some registers between +source and destination, the error message is not very informative: + +qemu-system-aarch64: error while loading state for instance 0x0 ofdevice 'cpu' +qemu-system-aarch64: Failed to put registers after init: Invalid argument + +At least try to give the user a hint which registers had a problem, +even if they cannot really do anything about it right now. + +Sample output: + +Could not set register op0:3 op1:0 crn:0 crm:0 op2:0 to c00fac31 (is 413fd0c1) + +We could be even more helpful once we support writable ID registers, +at which point the user might actually be able to configure something +that is migratable. + +Suggested-by: Eric Auger +Reviewed-by: Sebastian Ott +Signed-off-by: Cornelia Huck +Message-id: 20250911154159.158046-1-cohuck@redhat.com +Signed-off-by: Peter Maydell +(cherry picked from commit 19f6dcfe6b8b2a3523362812fc696ab83050d316) +Signed-off-by: Eric Auger +--- + target/arm/kvm.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 86 insertions(+) + +diff --git a/target/arm/kvm.c b/target/arm/kvm.c +index 6672344855..c1ec6654ca 100644 +--- a/target/arm/kvm.c ++++ b/target/arm/kvm.c +@@ -900,6 +900,58 @@ bool write_kvmstate_to_list(ARMCPU *cpu) + return ok; + } + ++/* pretty-print a KVM register */ ++#define CP_REG_ARM64_SYSREG_OP(_reg, _op) \ ++ ((uint8_t)((_reg & CP_REG_ARM64_SYSREG_ ## _op ## _MASK) >> \ ++ CP_REG_ARM64_SYSREG_ ## _op ## _SHIFT)) ++ ++static gchar *kvm_print_sve_register_name(uint64_t regidx) ++{ ++ uint16_t sve_reg = regidx & 0x000000000000ffff; ++ ++ if (regidx == KVM_REG_ARM64_SVE_VLS) { ++ return g_strdup_printf("SVE VLS"); ++ } ++ /* zreg, preg, ffr */ ++ switch (sve_reg & 0xfc00) { ++ case 0: ++ return g_strdup_printf("SVE zreg n:%d slice:%d", ++ (sve_reg & 0x03e0) >> 5, sve_reg & 0x001f); ++ case 0x04: ++ return g_strdup_printf("SVE preg n:%d slice:%d", ++ (sve_reg & 0x01e0) >> 5, sve_reg & 0x001f); ++ case 0x06: ++ return g_strdup_printf("SVE ffr slice:%d", sve_reg & 0x001f); ++ default: ++ return g_strdup_printf("SVE ???"); ++ } ++} ++ ++static gchar *kvm_print_register_name(uint64_t regidx) ++{ ++ switch ((regidx & KVM_REG_ARM_COPROC_MASK)) { ++ case KVM_REG_ARM_CORE: ++ return g_strdup_printf("core reg %"PRIx64, regidx); ++ case KVM_REG_ARM_DEMUX: ++ return g_strdup_printf("demuxed reg %"PRIx64, regidx); ++ case KVM_REG_ARM64_SYSREG: ++ return g_strdup_printf("op0:%d op1:%d crn:%d crm:%d op2:%d", ++ CP_REG_ARM64_SYSREG_OP(regidx, OP0), ++ CP_REG_ARM64_SYSREG_OP(regidx, OP1), ++ CP_REG_ARM64_SYSREG_OP(regidx, CRN), ++ CP_REG_ARM64_SYSREG_OP(regidx, CRM), ++ CP_REG_ARM64_SYSREG_OP(regidx, OP2)); ++ case KVM_REG_ARM_FW: ++ return g_strdup_printf("fw reg %d", (int)(regidx & 0xffff)); ++ case KVM_REG_ARM64_SVE: ++ return kvm_print_sve_register_name(regidx); ++ case KVM_REG_ARM_FW_FEAT_BMAP: ++ return g_strdup_printf("fw feat reg %d", (int)(regidx & 0xffff)); ++ default: ++ return g_strdup_printf("%"PRIx64, regidx); ++ } ++} ++ + bool write_list_to_kvmstate(ARMCPU *cpu, int level) + { + CPUState *cs = CPU(cpu); +@@ -927,11 +979,45 @@ bool write_list_to_kvmstate(ARMCPU *cpu, int level) + g_assert_not_reached(); + } + if (ret) { ++ gchar *reg_str = kvm_print_register_name(regidx); ++ + /* We might fail for "unknown register" and also for + * "you tried to set a register which is constant with + * a different value from what it actually contains". + */ + ok = false; ++ switch (ret) { ++ case -ENOENT: ++ error_report("Could not set register %s: unknown to KVM", ++ reg_str); ++ break; ++ case -EINVAL: ++ if ((regidx & KVM_REG_SIZE_MASK) == KVM_REG_SIZE_U32) { ++ if (!kvm_get_one_reg(cs, regidx, &v32)) { ++ error_report("Could not set register %s to %x (is %x)", ++ reg_str, (uint32_t)cpu->cpreg_values[i], ++ v32); ++ } else { ++ error_report("Could not set register %s to %x", ++ reg_str, (uint32_t)cpu->cpreg_values[i]); ++ } ++ } else /* U64 */ { ++ uint64_t v64; ++ ++ if (!kvm_get_one_reg(cs, regidx, &v64)) { ++ error_report("Could not set register %s to %"PRIx64" (is %"PRIx64")", ++ reg_str, cpu->cpreg_values[i], v64); ++ } else { ++ error_report("Could not set register %s to %"PRIx64, ++ reg_str, cpu->cpreg_values[i]); ++ } ++ } ++ break; ++ default: ++ error_report("Could not set register %s: %s", ++ reg_str, strerror(-ret)); ++ } ++ g_free(reg_str); + } + } + return ok; +-- +2.50.1 + diff --git a/qemu-kvm.spec b/qemu-kvm.spec index 5e36cfc..a474936 100644 --- a/qemu-kvm.spec +++ b/qemu-kvm.spec @@ -149,7 +149,7 @@ Obsoletes: %{name}-block-ssh <= %{epoch}:%{version} \ Summary: QEMU is a machine emulator and virtualizer Name: qemu-kvm Version: 10.1.0 -Release: 1%{?rcrel}%{?dist}%{?cc_suffix} +Release: 2%{?rcrel}%{?dist}%{?cc_suffix} # Epoch because we pushed a qemu-1.0 package. AIUI this can't ever be dropped # Epoch 15 used for RHEL 8 # Epoch 17 used for RHEL 9 (due to release versioning offset in RHEL 8.5) @@ -202,6 +202,8 @@ Patch27: 0027-arm-rhel-machine-type-compat-fix.patch Patch28: 0028-target-i386-add-compatibility-property-for-arch_capa.patch Patch29: 0029-target-i386-add-compatibility-property-for-pdcm-feat.patch Patch30: 0030-arm-create-new-virt-machine-type-for-rhel-9.8.patch +# For RHEL-119369 - [rhel9] Backport "arm/kvm: report registers we failed to set" +Patch31: kvm-arm-kvm-report-registers-we-failed-to-set.patch # For RHEL-11424 - [IBM 9.6 FEAT] KVM: Full boot order support - qemu part @@ -1916,6 +1918,11 @@ useradd -r -u 107 -g qemu -G kvm -d / -s /sbin/nologin \ %endif %changelog +* Mon Nov 03 2025 Jon Maloy - 10.1.0-2 +- kvm-arm-kvm-report-registers-we-failed-to-set.patch [RHEL-119369] +- Resolves: RHEL-119369 + ([rhel9] Backport "arm/kvm: report registers we failed to set") + * Wed Oct 22 2025 Miroslav Rezanina - 10.1.0-1 - Rebase to QEMU 10.1.0 - Resolves: RHEL-117664