On 18/8/25 06:13, Richard Henderson wrote:
Conversion between KVM system registers ids and the HVF system
register ids is trivial.
Signed-off-by: Richard Henderson <richard.hender...@linaro.org>
---
target/arm/hvf/hvf.c | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index f0e4b75e6a..2577dc1c0c 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -403,6 +403,26 @@ struct hvf_sreg_match {
uint32_t cp_idx;
};
+/*
+ * QEMU uses KVM system register ids in the migration format.
+ * Conveniently, HVF uses the same encoding of the op* and cr* parameters
+ * within the low 16 bits of the ids. Thus conversion between the
+ * formats is trivial.
+ */
+
+#define KVMID_TO_HVF(KVM) ((KVM) & 0xffff)
+#define HVF_TO_KVMID(HVF) \
+ (CP_REG_ARM64 | CP_REG_SIZE_U64 | CP_REG_ARM64_SYSREG | (HVF))
+
+/* Verify this at compile-time. */
+
+#define DEF_SYSREG(HVF_ID, ...) \
+ QEMU_BUILD_BUG_ON(HVF_ID != KVMID_TO_HVF(KVMID_AA64_SYS_REG64(__VA_ARGS__)));
Rebasing Mohamed's work I'm getting:
In file included from ../../target/arm/hvf/hvf.c:413:
../../target/arm/hvf/sysreg.c.inc:156:1: error: static assertion failed
due to requirement '!(HV_SYS_REG_MDCR_EL2 != (((((1 << 28) | (19 << 16)
| ((3) << 14) | ((4) << 11) | ((1) << 7) | ((1) << 3) | ((1) << 0)) |
13510798882111488ULL)) & 65535))': not expecting: HV_SYS_REG_MDCR_EL2 !=
KVMID_TO_HVF(KVMID_AA64_SYS_REG64(1, 1, 3, 4, 1))
156 | DEF_SYSREG(HV_SYS_REG_MDCR_EL2, 1, 1, 3, 4, 1)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Having in <Hypervisor.h> -> <Hypervisor/hv_vcpu_types.h>:
// Exception Level 2 (EL2) registers.
// These registers are only available if EL2 was enabled in the VM
configuration.
HV_SYS_REG_CNTHCTL_EL2 = 0xe708,
HV_SYS_REG_CNTHP_CTL_EL2 = 0xe711,
HV_SYS_REG_CNTHP_CVAL_EL2 = 0xe712,
HV_SYS_REG_CNTHP_TVAL_EL2 = 0xe710,
HV_SYS_REG_CNTVOFF_EL2 = 0xe703,
HV_SYS_REG_CPTR_EL2 = 0xe08a,
HV_SYS_REG_ELR_EL2 = 0xe201,
HV_SYS_REG_ESR_EL2 = 0xe290,
HV_SYS_REG_FAR_EL2 = 0xe300,
HV_SYS_REG_HCR_EL2 = 0xe088,
HV_SYS_REG_HPFAR_EL2 = 0xe304,
HV_SYS_REG_MAIR_EL2 = 0xe510,
HV_SYS_REG_MDCR_EL2 = 0xe019, <----
HV_SYS_REG_SCTLR_EL2 = 0xe080,
HV_SYS_REG_SPSR_EL2 = 0xe200,
HV_SYS_REG_SP_EL2 = 0xf208,
HV_SYS_REG_TCR_EL2 = 0xe102,
HV_SYS_REG_TPIDR_EL2 = 0xe682,
HV_SYS_REG_TTBR0_EL2 = 0xe100,
HV_SYS_REG_TTBR1_EL2 = 0xe101,
HV_SYS_REG_VBAR_EL2 = 0xe600,
HV_SYS_REG_VMPIDR_EL2 = 0xe005,
HV_SYS_REG_VPIDR_EL2 = 0xe000,
HV_SYS_REG_VTCR_EL2 = 0xe10a,
HV_SYS_REG_VTTBR_EL2 = 0xe108,
+
+#include "sysreg.c.inc"
+
+#undef DEF_SYSREG
+
#define DEF_SYSREG(HVF_ID, crn, crm, op0, op1, op2) \
{ HVF_ID, HVF_SYSREG(crn, crm, op0, op1, op2) },