From: Cornelia Huck <cohuck@redhat.com>
To: qemu-arm@nongnu.org, qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>,
Cornelia Huck <cohuck@redhat.com>,
Eric Auger <eric.auger@redhat.com>
Subject: [PATCH RFC] arm/kvm: report registers we failed to set
Date: Mon, 21 Jul 2025 18:19:32 +0200 [thread overview]
Message-ID: <20250721161932.548668-1-cohuck@redhat.com> (raw)
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 <eric.auger@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
Notes:
- This currently prints the list of failing registers for every call to
write_list_to_kvmstate(), in particular for every cpu -- we might want
to reduce that.
- If the macros aren't too ugly (or we manage to improve them), there
might be other places where they could be useful.
---
target/arm/kvm.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 53 insertions(+)
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
index 667234485547..ac6502e0c78f 100644
--- a/target/arm/kvm.c
+++ b/target/arm/kvm.c
@@ -900,6 +900,24 @@ 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))
+
+#define PRI_CP_REG_ARM64_SYSREG(_reg) \
+ ({ \
+ char _out[32]; \
+ snprintf(_out, sizeof(_out), \
+ "op0:%d op1:%d crn:%d crm:%d op2:%d", \
+ CP_REG_ARM64_SYSREG_OP(_reg, OP0), \
+ CP_REG_ARM64_SYSREG_OP(_reg, OP1), \
+ CP_REG_ARM64_SYSREG_OP(_reg, CRN), \
+ CP_REG_ARM64_SYSREG_OP(_reg, CRM), \
+ CP_REG_ARM64_SYSREG_OP(_reg, OP2)); \
+ _out; \
+ })
+
bool write_list_to_kvmstate(ARMCPU *cpu, int level)
{
CPUState *cs = CPU(cpu);
@@ -932,6 +950,41 @@ bool write_list_to_kvmstate(ARMCPU *cpu, int level)
* a different value from what it actually contains".
*/
ok = false;
+ switch (ret) {
+ case -ENOENT:
+ error_report("Could not set register %s: unknown to KVM",
+ PRI_CP_REG_ARM64_SYSREG(regidx));
+ 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)",
+ PRI_CP_REG_ARM64_SYSREG(regidx),
+ (uint32_t)cpu->cpreg_values[i], v32);
+ } else {
+ error_report("Could not set register %s to %x",
+ PRI_CP_REG_ARM64_SYSREG(regidx),
+ (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 %lx (is %lx)",
+ PRI_CP_REG_ARM64_SYSREG(regidx),
+ cpu->cpreg_values[i], v64);
+ } else {
+ error_report("Could not set register %s to %lx",
+ PRI_CP_REG_ARM64_SYSREG(regidx),
+ cpu->cpreg_values[i]);
+ }
+ }
+ break;
+ default:
+ error_report("Could not set register %s: %s",
+ PRI_CP_REG_ARM64_SYSREG(regidx),
+ strerror(-ret));
+ }
}
}
return ok;
--
2.50.0
next reply other threads:[~2025-07-21 16:21 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-21 16:19 Cornelia Huck [this message]
2025-07-22 16:11 ` [PATCH RFC] arm/kvm: report registers we failed to set Sebastian Ott
2025-07-23 9:59 ` Cornelia Huck
2025-08-12 18:11 ` Eric Auger
2025-08-13 10:01 ` Cornelia Huck
2025-08-13 12:43 ` Eric Auger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250721161932.548668-1-cohuck@redhat.com \
--to=cohuck@redhat.com \
--cc=eric.auger@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).