* [PATCH 0/7] target/arm/hvf cleanups
@ 2025-08-18 4:13 Richard Henderson
2025-08-18 4:13 ` [PATCH 1/7] target/arm: Introduce KVMID_AA64_SYS_REG64 Richard Henderson
` (8 more replies)
0 siblings, 9 replies; 23+ messages in thread
From: Richard Henderson @ 2025-08-18 4:13 UTC (permalink / raw)
To: qemu-devel; +Cc: mads, agraf, qemu-arm, philmd
While working on other things cpregs related, I noticed that
target/arm/hvf failed to produce a sorted cpreg_indexes[].
I wondered if that explained the migration-test failure that
we have, but no such luck. (I have no idea how to debug that
test, btw; so far it is still just a mysterious SIGSEGV.)
r~
Richard Henderson (7):
target/arm: Introduce KVMID_AA64_SYS_REG64
target/arm: Move compare_u64 to helper.c
target/arm/hvf: Split out sysreg.c.inc
target/arm/hvf: Add KVMID_TO_HVF, HVF_TO_KVMID
target/arm/hvf: Remove hvf_sreg_match.key
target/arm/hvf: Replace hvf_sreg_match with hvf_sreg_list
target/arm/hvf: Sort the cpreg_indexes array
target/arm/cpregs.h | 3 +
target/arm/kvm-consts.h | 11 ++
target/arm/helper.c | 11 ++
target/arm/hvf/hvf.c | 230 +++++++++---------------------------
target/arm/kvm.c | 11 --
target/arm/hvf/sysreg.c.inc | 146 +++++++++++++++++++++++
6 files changed, 224 insertions(+), 188 deletions(-)
create mode 100644 target/arm/hvf/sysreg.c.inc
--
2.43.0
^ permalink raw reply [flat|nested] 23+ messages in thread* [PATCH 1/7] target/arm: Introduce KVMID_AA64_SYS_REG64 2025-08-18 4:13 [PATCH 0/7] target/arm/hvf cleanups Richard Henderson @ 2025-08-18 4:13 ` Richard Henderson 2025-08-18 4:13 ` [PATCH 2/7] target/arm: Move compare_u64 to helper.c Richard Henderson ` (7 subsequent siblings) 8 siblings, 0 replies; 23+ messages in thread From: Richard Henderson @ 2025-08-18 4:13 UTC (permalink / raw) To: qemu-devel; +Cc: mads, agraf, qemu-arm, philmd Allow us to create kvm ids directly, rather than going through ENCODE_AA64_CP_REG + cpreg_to_kvm_id. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- target/arm/kvm-consts.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/target/arm/kvm-consts.h b/target/arm/kvm-consts.h index c44d23dbe7..90d792ad42 100644 --- a/target/arm/kvm-consts.h +++ b/target/arm/kvm-consts.h @@ -180,4 +180,15 @@ MISMATCH_CHECK(CP_REG_ARM64_SYSREG_OP2_SHIFT, KVM_REG_ARM64_SYSREG_OP2_SHIFT); #undef MISMATCH_CHECK +#define KVMID_AA64_SYS_REG_(crn, crm, op0, op1, op2) \ + (CP_REG_AA64_MASK | CP_REG_ARM64_SYSREG | \ + ((op0) << CP_REG_ARM64_SYSREG_OP0_SHIFT) | \ + ((op1) << CP_REG_ARM64_SYSREG_OP1_SHIFT) | \ + ((crn) << CP_REG_ARM64_SYSREG_CRN_SHIFT) | \ + ((crm) << CP_REG_ARM64_SYSREG_CRM_SHIFT) | \ + ((op2) << CP_REG_ARM64_SYSREG_OP2_SHIFT)) + +#define KVMID_AA64_SYS_REG64(crn, crm, op0, op1, op2) \ + (KVMID_AA64_SYS_REG_(crn, crm, op0, op1, op2) | CP_REG_SIZE_U64) + #endif -- 2.43.0 ^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH 2/7] target/arm: Move compare_u64 to helper.c 2025-08-18 4:13 [PATCH 0/7] target/arm/hvf cleanups Richard Henderson 2025-08-18 4:13 ` [PATCH 1/7] target/arm: Introduce KVMID_AA64_SYS_REG64 Richard Henderson @ 2025-08-18 4:13 ` Richard Henderson 2025-08-18 6:12 ` Philippe Mathieu-Daudé 2025-08-18 4:13 ` [PATCH 3/7] target/arm/hvf: Split out sysreg.c.inc Richard Henderson ` (6 subsequent siblings) 8 siblings, 1 reply; 23+ messages in thread From: Richard Henderson @ 2025-08-18 4:13 UTC (permalink / raw) To: qemu-devel; +Cc: mads, agraf, qemu-arm, philmd We will use this function beyond kvm.c. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- target/arm/cpregs.h | 3 +++ target/arm/helper.c | 11 +++++++++++ target/arm/kvm.c | 11 ----------- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/target/arm/cpregs.h b/target/arm/cpregs.h index c9506aa6d5..2854960c08 100644 --- a/target/arm/cpregs.h +++ b/target/arm/cpregs.h @@ -1189,4 +1189,7 @@ static inline bool arm_cpreg_traps_in_nv(const ARMCPRegInfo *ri) (arm_is_secure(_env) && !arm_el_is_aa64((_env), 3)), \ (_val)) +/* Compare uint64_t for qsort and bsearch. */ +int compare_u64(const void *a, const void *b); + #endif /* TARGET_ARM_CPREGS_H */ diff --git a/target/arm/helper.c b/target/arm/helper.c index 0c1299ff84..d230f9e766 100644 --- a/target/arm/helper.c +++ b/target/arm/helper.c @@ -40,6 +40,17 @@ static void switch_mode(CPUARMState *env, int mode); +int compare_u64(const void *a, const void *b) +{ + if (*(uint64_t *)a > *(uint64_t *)b) { + return 1; + } + if (*(uint64_t *)a < *(uint64_t *)b) { + return -1; + } + return 0; +} + uint64_t raw_read(CPUARMState *env, const ARMCPRegInfo *ri) { assert(ri->fieldoffset); diff --git a/target/arm/kvm.c b/target/arm/kvm.c index 6672344855..9e569eff65 100644 --- a/target/arm/kvm.c +++ b/target/arm/kvm.c @@ -718,17 +718,6 @@ void kvm_arm_register_device(MemoryRegion *mr, uint64_t devid, uint64_t group, memory_region_ref(kd->mr); } -static int compare_u64(const void *a, const void *b) -{ - if (*(uint64_t *)a > *(uint64_t *)b) { - return 1; - } - if (*(uint64_t *)a < *(uint64_t *)b) { - return -1; - } - return 0; -} - /* * cpreg_values are sorted in ascending order by KVM register ID * (see kvm_arm_init_cpreg_list). This allows us to cheaply find -- 2.43.0 ^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH 2/7] target/arm: Move compare_u64 to helper.c 2025-08-18 4:13 ` [PATCH 2/7] target/arm: Move compare_u64 to helper.c Richard Henderson @ 2025-08-18 6:12 ` Philippe Mathieu-Daudé 0 siblings, 0 replies; 23+ messages in thread From: Philippe Mathieu-Daudé @ 2025-08-18 6:12 UTC (permalink / raw) To: Richard Henderson, qemu-devel; +Cc: mads, agraf, qemu-arm On 18/8/25 06:13, Richard Henderson wrote: > We will use this function beyond kvm.c. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > target/arm/cpregs.h | 3 +++ > target/arm/helper.c | 11 +++++++++++ > target/arm/kvm.c | 11 ----------- > 3 files changed, 14 insertions(+), 11 deletions(-) Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> ^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH 3/7] target/arm/hvf: Split out sysreg.c.inc 2025-08-18 4:13 [PATCH 0/7] target/arm/hvf cleanups Richard Henderson 2025-08-18 4:13 ` [PATCH 1/7] target/arm: Introduce KVMID_AA64_SYS_REG64 Richard Henderson 2025-08-18 4:13 ` [PATCH 2/7] target/arm: Move compare_u64 to helper.c Richard Henderson @ 2025-08-18 4:13 ` Richard Henderson 2025-08-18 6:13 ` Philippe Mathieu-Daudé 2025-08-18 4:13 ` [PATCH 4/7] target/arm/hvf: Add KVMID_TO_HVF, HVF_TO_KVMID Richard Henderson ` (5 subsequent siblings) 8 siblings, 1 reply; 23+ messages in thread From: Richard Henderson @ 2025-08-18 4:13 UTC (permalink / raw) To: qemu-devel; +Cc: mads, agraf, qemu-arm, philmd Move the list of supported sysregs to a reuseable file. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- target/arm/hvf/hvf.c | 147 ++---------------------------------- target/arm/hvf/sysreg.c.inc | 146 +++++++++++++++++++++++++++++++++++ 2 files changed, 152 insertions(+), 141 deletions(-) create mode 100644 target/arm/hvf/sysreg.c.inc diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c index 47b0cd3a35..f0e4b75e6a 100644 --- a/target/arm/hvf/hvf.c +++ b/target/arm/hvf/hvf.c @@ -403,150 +403,15 @@ struct hvf_sreg_match { uint32_t cp_idx; }; +#define DEF_SYSREG(HVF_ID, crn, crm, op0, op1, op2) \ + { HVF_ID, HVF_SYSREG(crn, crm, op0, op1, op2) }, + static struct hvf_sreg_match hvf_sreg_match[] = { - { HV_SYS_REG_DBGBVR0_EL1, HVF_SYSREG(0, 0, 2, 0, 4) }, - { HV_SYS_REG_DBGBCR0_EL1, HVF_SYSREG(0, 0, 2, 0, 5) }, - { HV_SYS_REG_DBGWVR0_EL1, HVF_SYSREG(0, 0, 2, 0, 6) }, - { HV_SYS_REG_DBGWCR0_EL1, HVF_SYSREG(0, 0, 2, 0, 7) }, - - { HV_SYS_REG_DBGBVR1_EL1, HVF_SYSREG(0, 1, 2, 0, 4) }, - { HV_SYS_REG_DBGBCR1_EL1, HVF_SYSREG(0, 1, 2, 0, 5) }, - { HV_SYS_REG_DBGWVR1_EL1, HVF_SYSREG(0, 1, 2, 0, 6) }, - { HV_SYS_REG_DBGWCR1_EL1, HVF_SYSREG(0, 1, 2, 0, 7) }, - - { HV_SYS_REG_DBGBVR2_EL1, HVF_SYSREG(0, 2, 2, 0, 4) }, - { HV_SYS_REG_DBGBCR2_EL1, HVF_SYSREG(0, 2, 2, 0, 5) }, - { HV_SYS_REG_DBGWVR2_EL1, HVF_SYSREG(0, 2, 2, 0, 6) }, - { HV_SYS_REG_DBGWCR2_EL1, HVF_SYSREG(0, 2, 2, 0, 7) }, - - { HV_SYS_REG_DBGBVR3_EL1, HVF_SYSREG(0, 3, 2, 0, 4) }, - { HV_SYS_REG_DBGBCR3_EL1, HVF_SYSREG(0, 3, 2, 0, 5) }, - { HV_SYS_REG_DBGWVR3_EL1, HVF_SYSREG(0, 3, 2, 0, 6) }, - { HV_SYS_REG_DBGWCR3_EL1, HVF_SYSREG(0, 3, 2, 0, 7) }, - - { HV_SYS_REG_DBGBVR4_EL1, HVF_SYSREG(0, 4, 2, 0, 4) }, - { HV_SYS_REG_DBGBCR4_EL1, HVF_SYSREG(0, 4, 2, 0, 5) }, - { HV_SYS_REG_DBGWVR4_EL1, HVF_SYSREG(0, 4, 2, 0, 6) }, - { HV_SYS_REG_DBGWCR4_EL1, HVF_SYSREG(0, 4, 2, 0, 7) }, - - { HV_SYS_REG_DBGBVR5_EL1, HVF_SYSREG(0, 5, 2, 0, 4) }, - { HV_SYS_REG_DBGBCR5_EL1, HVF_SYSREG(0, 5, 2, 0, 5) }, - { HV_SYS_REG_DBGWVR5_EL1, HVF_SYSREG(0, 5, 2, 0, 6) }, - { HV_SYS_REG_DBGWCR5_EL1, HVF_SYSREG(0, 5, 2, 0, 7) }, - - { HV_SYS_REG_DBGBVR6_EL1, HVF_SYSREG(0, 6, 2, 0, 4) }, - { HV_SYS_REG_DBGBCR6_EL1, HVF_SYSREG(0, 6, 2, 0, 5) }, - { HV_SYS_REG_DBGWVR6_EL1, HVF_SYSREG(0, 6, 2, 0, 6) }, - { HV_SYS_REG_DBGWCR6_EL1, HVF_SYSREG(0, 6, 2, 0, 7) }, - - { HV_SYS_REG_DBGBVR7_EL1, HVF_SYSREG(0, 7, 2, 0, 4) }, - { HV_SYS_REG_DBGBCR7_EL1, HVF_SYSREG(0, 7, 2, 0, 5) }, - { HV_SYS_REG_DBGWVR7_EL1, HVF_SYSREG(0, 7, 2, 0, 6) }, - { HV_SYS_REG_DBGWCR7_EL1, HVF_SYSREG(0, 7, 2, 0, 7) }, - - { HV_SYS_REG_DBGBVR8_EL1, HVF_SYSREG(0, 8, 2, 0, 4) }, - { HV_SYS_REG_DBGBCR8_EL1, HVF_SYSREG(0, 8, 2, 0, 5) }, - { HV_SYS_REG_DBGWVR8_EL1, HVF_SYSREG(0, 8, 2, 0, 6) }, - { HV_SYS_REG_DBGWCR8_EL1, HVF_SYSREG(0, 8, 2, 0, 7) }, - - { HV_SYS_REG_DBGBVR9_EL1, HVF_SYSREG(0, 9, 2, 0, 4) }, - { HV_SYS_REG_DBGBCR9_EL1, HVF_SYSREG(0, 9, 2, 0, 5) }, - { HV_SYS_REG_DBGWVR9_EL1, HVF_SYSREG(0, 9, 2, 0, 6) }, - { HV_SYS_REG_DBGWCR9_EL1, HVF_SYSREG(0, 9, 2, 0, 7) }, - - { HV_SYS_REG_DBGBVR10_EL1, HVF_SYSREG(0, 10, 2, 0, 4) }, - { HV_SYS_REG_DBGBCR10_EL1, HVF_SYSREG(0, 10, 2, 0, 5) }, - { HV_SYS_REG_DBGWVR10_EL1, HVF_SYSREG(0, 10, 2, 0, 6) }, - { HV_SYS_REG_DBGWCR10_EL1, HVF_SYSREG(0, 10, 2, 0, 7) }, - - { HV_SYS_REG_DBGBVR11_EL1, HVF_SYSREG(0, 11, 2, 0, 4) }, - { HV_SYS_REG_DBGBCR11_EL1, HVF_SYSREG(0, 11, 2, 0, 5) }, - { HV_SYS_REG_DBGWVR11_EL1, HVF_SYSREG(0, 11, 2, 0, 6) }, - { HV_SYS_REG_DBGWCR11_EL1, HVF_SYSREG(0, 11, 2, 0, 7) }, - - { HV_SYS_REG_DBGBVR12_EL1, HVF_SYSREG(0, 12, 2, 0, 4) }, - { HV_SYS_REG_DBGBCR12_EL1, HVF_SYSREG(0, 12, 2, 0, 5) }, - { HV_SYS_REG_DBGWVR12_EL1, HVF_SYSREG(0, 12, 2, 0, 6) }, - { HV_SYS_REG_DBGWCR12_EL1, HVF_SYSREG(0, 12, 2, 0, 7) }, - - { HV_SYS_REG_DBGBVR13_EL1, HVF_SYSREG(0, 13, 2, 0, 4) }, - { HV_SYS_REG_DBGBCR13_EL1, HVF_SYSREG(0, 13, 2, 0, 5) }, - { HV_SYS_REG_DBGWVR13_EL1, HVF_SYSREG(0, 13, 2, 0, 6) }, - { HV_SYS_REG_DBGWCR13_EL1, HVF_SYSREG(0, 13, 2, 0, 7) }, - - { HV_SYS_REG_DBGBVR14_EL1, HVF_SYSREG(0, 14, 2, 0, 4) }, - { HV_SYS_REG_DBGBCR14_EL1, HVF_SYSREG(0, 14, 2, 0, 5) }, - { HV_SYS_REG_DBGWVR14_EL1, HVF_SYSREG(0, 14, 2, 0, 6) }, - { HV_SYS_REG_DBGWCR14_EL1, HVF_SYSREG(0, 14, 2, 0, 7) }, - - { HV_SYS_REG_DBGBVR15_EL1, HVF_SYSREG(0, 15, 2, 0, 4) }, - { HV_SYS_REG_DBGBCR15_EL1, HVF_SYSREG(0, 15, 2, 0, 5) }, - { HV_SYS_REG_DBGWVR15_EL1, HVF_SYSREG(0, 15, 2, 0, 6) }, - { HV_SYS_REG_DBGWCR15_EL1, HVF_SYSREG(0, 15, 2, 0, 7) }, - -#ifdef SYNC_NO_RAW_REGS - /* - * The registers below are manually synced on init because they are - * marked as NO_RAW. We still list them to make number space sync easier. - */ - { HV_SYS_REG_MDCCINT_EL1, HVF_SYSREG(0, 2, 2, 0, 0) }, - { HV_SYS_REG_MIDR_EL1, HVF_SYSREG(0, 0, 3, 0, 0) }, - { HV_SYS_REG_MPIDR_EL1, HVF_SYSREG(0, 0, 3, 0, 5) }, - { HV_SYS_REG_ID_AA64PFR0_EL1, HVF_SYSREG(0, 4, 3, 0, 0) }, -#endif - { HV_SYS_REG_ID_AA64PFR1_EL1, HVF_SYSREG(0, 4, 3, 0, 1) }, - { HV_SYS_REG_ID_AA64DFR0_EL1, HVF_SYSREG(0, 5, 3, 0, 0) }, - { HV_SYS_REG_ID_AA64DFR1_EL1, HVF_SYSREG(0, 5, 3, 0, 1) }, - { HV_SYS_REG_ID_AA64ISAR0_EL1, HVF_SYSREG(0, 6, 3, 0, 0) }, - { HV_SYS_REG_ID_AA64ISAR1_EL1, HVF_SYSREG(0, 6, 3, 0, 1) }, -#ifdef SYNC_NO_MMFR0 - /* We keep the hardware MMFR0 around. HW limits are there anyway */ - { HV_SYS_REG_ID_AA64MMFR0_EL1, HVF_SYSREG(0, 7, 3, 0, 0) }, -#endif - { HV_SYS_REG_ID_AA64MMFR1_EL1, HVF_SYSREG(0, 7, 3, 0, 1) }, - { HV_SYS_REG_ID_AA64MMFR2_EL1, HVF_SYSREG(0, 7, 3, 0, 2) }, - /* Add ID_AA64MMFR3_EL1 here when HVF supports it */ - - { HV_SYS_REG_MDSCR_EL1, HVF_SYSREG(0, 2, 2, 0, 2) }, - { HV_SYS_REG_SCTLR_EL1, HVF_SYSREG(1, 0, 3, 0, 0) }, - { HV_SYS_REG_CPACR_EL1, HVF_SYSREG(1, 0, 3, 0, 2) }, - { HV_SYS_REG_TTBR0_EL1, HVF_SYSREG(2, 0, 3, 0, 0) }, - { HV_SYS_REG_TTBR1_EL1, HVF_SYSREG(2, 0, 3, 0, 1) }, - { HV_SYS_REG_TCR_EL1, HVF_SYSREG(2, 0, 3, 0, 2) }, - - { HV_SYS_REG_APIAKEYLO_EL1, HVF_SYSREG(2, 1, 3, 0, 0) }, - { HV_SYS_REG_APIAKEYHI_EL1, HVF_SYSREG(2, 1, 3, 0, 1) }, - { HV_SYS_REG_APIBKEYLO_EL1, HVF_SYSREG(2, 1, 3, 0, 2) }, - { HV_SYS_REG_APIBKEYHI_EL1, HVF_SYSREG(2, 1, 3, 0, 3) }, - { HV_SYS_REG_APDAKEYLO_EL1, HVF_SYSREG(2, 2, 3, 0, 0) }, - { HV_SYS_REG_APDAKEYHI_EL1, HVF_SYSREG(2, 2, 3, 0, 1) }, - { HV_SYS_REG_APDBKEYLO_EL1, HVF_SYSREG(2, 2, 3, 0, 2) }, - { HV_SYS_REG_APDBKEYHI_EL1, HVF_SYSREG(2, 2, 3, 0, 3) }, - { HV_SYS_REG_APGAKEYLO_EL1, HVF_SYSREG(2, 3, 3, 0, 0) }, - { HV_SYS_REG_APGAKEYHI_EL1, HVF_SYSREG(2, 3, 3, 0, 1) }, - - { HV_SYS_REG_SPSR_EL1, HVF_SYSREG(4, 0, 3, 0, 0) }, - { HV_SYS_REG_ELR_EL1, HVF_SYSREG(4, 0, 3, 0, 1) }, - { HV_SYS_REG_SP_EL0, HVF_SYSREG(4, 1, 3, 0, 0) }, - { HV_SYS_REG_AFSR0_EL1, HVF_SYSREG(5, 1, 3, 0, 0) }, - { HV_SYS_REG_AFSR1_EL1, HVF_SYSREG(5, 1, 3, 0, 1) }, - { HV_SYS_REG_ESR_EL1, HVF_SYSREG(5, 2, 3, 0, 0) }, - { HV_SYS_REG_FAR_EL1, HVF_SYSREG(6, 0, 3, 0, 0) }, - { HV_SYS_REG_PAR_EL1, HVF_SYSREG(7, 4, 3, 0, 0) }, - { HV_SYS_REG_MAIR_EL1, HVF_SYSREG(10, 2, 3, 0, 0) }, - { HV_SYS_REG_AMAIR_EL1, HVF_SYSREG(10, 3, 3, 0, 0) }, - { HV_SYS_REG_VBAR_EL1, HVF_SYSREG(12, 0, 3, 0, 0) }, - { HV_SYS_REG_CONTEXTIDR_EL1, HVF_SYSREG(13, 0, 3, 0, 1) }, - { HV_SYS_REG_TPIDR_EL1, HVF_SYSREG(13, 0, 3, 0, 4) }, - { HV_SYS_REG_CNTKCTL_EL1, HVF_SYSREG(14, 1, 3, 0, 0) }, - { HV_SYS_REG_CSSELR_EL1, HVF_SYSREG(0, 0, 3, 2, 0) }, - { HV_SYS_REG_TPIDR_EL0, HVF_SYSREG(13, 0, 3, 3, 2) }, - { HV_SYS_REG_TPIDRRO_EL0, HVF_SYSREG(13, 0, 3, 3, 3) }, - { HV_SYS_REG_CNTV_CTL_EL0, HVF_SYSREG(14, 3, 3, 3, 1) }, - { HV_SYS_REG_CNTV_CVAL_EL0, HVF_SYSREG(14, 3, 3, 3, 2) }, - { HV_SYS_REG_SP_EL1, HVF_SYSREG(4, 1, 3, 4, 0) }, +#include "sysreg.c.inc" }; +#undef DEF_SYSREG + int hvf_get_registers(CPUState *cpu) { ARMCPU *arm_cpu = ARM_CPU(cpu); diff --git a/target/arm/hvf/sysreg.c.inc b/target/arm/hvf/sysreg.c.inc new file mode 100644 index 0000000000..222698f1d1 --- /dev/null +++ b/target/arm/hvf/sysreg.c.inc @@ -0,0 +1,146 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +DEF_SYSREG(HV_SYS_REG_DBGBVR0_EL1, 0, 0, 2, 0, 4) +DEF_SYSREG(HV_SYS_REG_DBGBCR0_EL1, 0, 0, 2, 0, 5) +DEF_SYSREG(HV_SYS_REG_DBGWVR0_EL1, 0, 0, 2, 0, 6) +DEF_SYSREG(HV_SYS_REG_DBGWCR0_EL1, 0, 0, 2, 0, 7) + +DEF_SYSREG(HV_SYS_REG_DBGBVR1_EL1, 0, 1, 2, 0, 4) +DEF_SYSREG(HV_SYS_REG_DBGBCR1_EL1, 0, 1, 2, 0, 5) +DEF_SYSREG(HV_SYS_REG_DBGWVR1_EL1, 0, 1, 2, 0, 6) +DEF_SYSREG(HV_SYS_REG_DBGWCR1_EL1, 0, 1, 2, 0, 7) + +DEF_SYSREG(HV_SYS_REG_DBGBVR2_EL1, 0, 2, 2, 0, 4) +DEF_SYSREG(HV_SYS_REG_DBGBCR2_EL1, 0, 2, 2, 0, 5) +DEF_SYSREG(HV_SYS_REG_DBGWVR2_EL1, 0, 2, 2, 0, 6) +DEF_SYSREG(HV_SYS_REG_DBGWCR2_EL1, 0, 2, 2, 0, 7) + +DEF_SYSREG(HV_SYS_REG_DBGBVR3_EL1, 0, 3, 2, 0, 4) +DEF_SYSREG(HV_SYS_REG_DBGBCR3_EL1, 0, 3, 2, 0, 5) +DEF_SYSREG(HV_SYS_REG_DBGWVR3_EL1, 0, 3, 2, 0, 6) +DEF_SYSREG(HV_SYS_REG_DBGWCR3_EL1, 0, 3, 2, 0, 7) + +DEF_SYSREG(HV_SYS_REG_DBGBVR4_EL1, 0, 4, 2, 0, 4) +DEF_SYSREG(HV_SYS_REG_DBGBCR4_EL1, 0, 4, 2, 0, 5) +DEF_SYSREG(HV_SYS_REG_DBGWVR4_EL1, 0, 4, 2, 0, 6) +DEF_SYSREG(HV_SYS_REG_DBGWCR4_EL1, 0, 4, 2, 0, 7) + +DEF_SYSREG(HV_SYS_REG_DBGBVR5_EL1, 0, 5, 2, 0, 4) +DEF_SYSREG(HV_SYS_REG_DBGBCR5_EL1, 0, 5, 2, 0, 5) +DEF_SYSREG(HV_SYS_REG_DBGWVR5_EL1, 0, 5, 2, 0, 6) +DEF_SYSREG(HV_SYS_REG_DBGWCR5_EL1, 0, 5, 2, 0, 7) + +DEF_SYSREG(HV_SYS_REG_DBGBVR6_EL1, 0, 6, 2, 0, 4) +DEF_SYSREG(HV_SYS_REG_DBGBCR6_EL1, 0, 6, 2, 0, 5) +DEF_SYSREG(HV_SYS_REG_DBGWVR6_EL1, 0, 6, 2, 0, 6) +DEF_SYSREG(HV_SYS_REG_DBGWCR6_EL1, 0, 6, 2, 0, 7) + +DEF_SYSREG(HV_SYS_REG_DBGBVR7_EL1, 0, 7, 2, 0, 4) +DEF_SYSREG(HV_SYS_REG_DBGBCR7_EL1, 0, 7, 2, 0, 5) +DEF_SYSREG(HV_SYS_REG_DBGWVR7_EL1, 0, 7, 2, 0, 6) +DEF_SYSREG(HV_SYS_REG_DBGWCR7_EL1, 0, 7, 2, 0, 7) + +DEF_SYSREG(HV_SYS_REG_DBGBVR8_EL1, 0, 8, 2, 0, 4) +DEF_SYSREG(HV_SYS_REG_DBGBCR8_EL1, 0, 8, 2, 0, 5) +DEF_SYSREG(HV_SYS_REG_DBGWVR8_EL1, 0, 8, 2, 0, 6) +DEF_SYSREG(HV_SYS_REG_DBGWCR8_EL1, 0, 8, 2, 0, 7) + +DEF_SYSREG(HV_SYS_REG_DBGBVR9_EL1, 0, 9, 2, 0, 4) +DEF_SYSREG(HV_SYS_REG_DBGBCR9_EL1, 0, 9, 2, 0, 5) +DEF_SYSREG(HV_SYS_REG_DBGWVR9_EL1, 0, 9, 2, 0, 6) +DEF_SYSREG(HV_SYS_REG_DBGWCR9_EL1, 0, 9, 2, 0, 7) + +DEF_SYSREG(HV_SYS_REG_DBGBVR10_EL1, 0, 10, 2, 0, 4) +DEF_SYSREG(HV_SYS_REG_DBGBCR10_EL1, 0, 10, 2, 0, 5) +DEF_SYSREG(HV_SYS_REG_DBGWVR10_EL1, 0, 10, 2, 0, 6) +DEF_SYSREG(HV_SYS_REG_DBGWCR10_EL1, 0, 10, 2, 0, 7) + +DEF_SYSREG(HV_SYS_REG_DBGBVR11_EL1, 0, 11, 2, 0, 4) +DEF_SYSREG(HV_SYS_REG_DBGBCR11_EL1, 0, 11, 2, 0, 5) +DEF_SYSREG(HV_SYS_REG_DBGWVR11_EL1, 0, 11, 2, 0, 6) +DEF_SYSREG(HV_SYS_REG_DBGWCR11_EL1, 0, 11, 2, 0, 7) + +DEF_SYSREG(HV_SYS_REG_DBGBVR12_EL1, 0, 12, 2, 0, 4) +DEF_SYSREG(HV_SYS_REG_DBGBCR12_EL1, 0, 12, 2, 0, 5) +DEF_SYSREG(HV_SYS_REG_DBGWVR12_EL1, 0, 12, 2, 0, 6) +DEF_SYSREG(HV_SYS_REG_DBGWCR12_EL1, 0, 12, 2, 0, 7) + +DEF_SYSREG(HV_SYS_REG_DBGBVR13_EL1, 0, 13, 2, 0, 4) +DEF_SYSREG(HV_SYS_REG_DBGBCR13_EL1, 0, 13, 2, 0, 5) +DEF_SYSREG(HV_SYS_REG_DBGWVR13_EL1, 0, 13, 2, 0, 6) +DEF_SYSREG(HV_SYS_REG_DBGWCR13_EL1, 0, 13, 2, 0, 7) + +DEF_SYSREG(HV_SYS_REG_DBGBVR14_EL1, 0, 14, 2, 0, 4) +DEF_SYSREG(HV_SYS_REG_DBGBCR14_EL1, 0, 14, 2, 0, 5) +DEF_SYSREG(HV_SYS_REG_DBGWVR14_EL1, 0, 14, 2, 0, 6) +DEF_SYSREG(HV_SYS_REG_DBGWCR14_EL1, 0, 14, 2, 0, 7) + +DEF_SYSREG(HV_SYS_REG_DBGBVR15_EL1, 0, 15, 2, 0, 4) +DEF_SYSREG(HV_SYS_REG_DBGBCR15_EL1, 0, 15, 2, 0, 5) +DEF_SYSREG(HV_SYS_REG_DBGWVR15_EL1, 0, 15, 2, 0, 6) +DEF_SYSREG(HV_SYS_REG_DBGWCR15_EL1, 0, 15, 2, 0, 7) + +#ifdef SYNC_NO_RAW_REGS +/* + * The registers below are manually synced on init because they are + * marked as NO_RAW. We still list them to make number space sync easier. + */ +DEF_SYSREG(HV_SYS_REG_MDCCINT_EL1, 0, 2, 2, 0, 0) +DEF_SYSREG(HV_SYS_REG_MIDR_EL1, 0, 0, 3, 0, 0) +DEF_SYSREG(HV_SYS_REG_MPIDR_EL1, 0, 0, 3, 0, 5) +DEF_SYSREG(HV_SYS_REG_ID_AA64PFR0_EL1, 0, 4, 3, 0, 0) +#endif + +DEF_SYSREG(HV_SYS_REG_ID_AA64PFR1_EL1, 0, 4, 3, 0, 1) +DEF_SYSREG(HV_SYS_REG_ID_AA64DFR0_EL1, 0, 5, 3, 0, 0) +DEF_SYSREG(HV_SYS_REG_ID_AA64DFR1_EL1, 0, 5, 3, 0, 1) +DEF_SYSREG(HV_SYS_REG_ID_AA64ISAR0_EL1, 0, 6, 3, 0, 0) +DEF_SYSREG(HV_SYS_REG_ID_AA64ISAR1_EL1, 0, 6, 3, 0, 1) + +#ifdef SYNC_NO_MMFR0 +/* We keep the hardware MMFR0 around. HW limits are there anyway */ +DEF_SYSREG(HV_SYS_REG_ID_AA64MMFR0_EL1, 0, 7, 3, 0, 0) +#endif + +DEF_SYSREG(HV_SYS_REG_ID_AA64MMFR1_EL1, 0, 7, 3, 0, 1) +DEF_SYSREG(HV_SYS_REG_ID_AA64MMFR2_EL1, 0, 7, 3, 0, 2) +/* Add ID_AA64MMFR3_EL1 here when HVF supports it */ + +DEF_SYSREG(HV_SYS_REG_MDSCR_EL1, 0, 2, 2, 0, 2) +DEF_SYSREG(HV_SYS_REG_SCTLR_EL1, 1, 0, 3, 0, 0) +DEF_SYSREG(HV_SYS_REG_CPACR_EL1, 1, 0, 3, 0, 2) +DEF_SYSREG(HV_SYS_REG_TTBR0_EL1, 2, 0, 3, 0, 0) +DEF_SYSREG(HV_SYS_REG_TTBR1_EL1, 2, 0, 3, 0, 1) +DEF_SYSREG(HV_SYS_REG_TCR_EL1, 2, 0, 3, 0, 2) + +DEF_SYSREG(HV_SYS_REG_APIAKEYLO_EL1, 2, 1, 3, 0, 0) +DEF_SYSREG(HV_SYS_REG_APIAKEYHI_EL1, 2, 1, 3, 0, 1) +DEF_SYSREG(HV_SYS_REG_APIBKEYLO_EL1, 2, 1, 3, 0, 2) +DEF_SYSREG(HV_SYS_REG_APIBKEYHI_EL1, 2, 1, 3, 0, 3) +DEF_SYSREG(HV_SYS_REG_APDAKEYLO_EL1, 2, 2, 3, 0, 0) +DEF_SYSREG(HV_SYS_REG_APDAKEYHI_EL1, 2, 2, 3, 0, 1) +DEF_SYSREG(HV_SYS_REG_APDBKEYLO_EL1, 2, 2, 3, 0, 2) +DEF_SYSREG(HV_SYS_REG_APDBKEYHI_EL1, 2, 2, 3, 0, 3) +DEF_SYSREG(HV_SYS_REG_APGAKEYLO_EL1, 2, 3, 3, 0, 0) +DEF_SYSREG(HV_SYS_REG_APGAKEYHI_EL1, 2, 3, 3, 0, 1) + +DEF_SYSREG(HV_SYS_REG_SPSR_EL1, 4, 0, 3, 0, 0) +DEF_SYSREG(HV_SYS_REG_ELR_EL1, 4, 0, 3, 0, 1) +DEF_SYSREG(HV_SYS_REG_SP_EL0, 4, 1, 3, 0, 0) +DEF_SYSREG(HV_SYS_REG_AFSR0_EL1, 5, 1, 3, 0, 0) +DEF_SYSREG(HV_SYS_REG_AFSR1_EL1, 5, 1, 3, 0, 1) +DEF_SYSREG(HV_SYS_REG_ESR_EL1, 5, 2, 3, 0, 0) +DEF_SYSREG(HV_SYS_REG_FAR_EL1, 6, 0, 3, 0, 0) +DEF_SYSREG(HV_SYS_REG_PAR_EL1, 7, 4, 3, 0, 0) +DEF_SYSREG(HV_SYS_REG_MAIR_EL1, 10, 2, 3, 0, 0) +DEF_SYSREG(HV_SYS_REG_AMAIR_EL1, 10, 3, 3, 0, 0) +DEF_SYSREG(HV_SYS_REG_VBAR_EL1, 12, 0, 3, 0, 0) +DEF_SYSREG(HV_SYS_REG_CONTEXTIDR_EL1, 13, 0, 3, 0, 1) +DEF_SYSREG(HV_SYS_REG_TPIDR_EL1, 13, 0, 3, 0, 4) +DEF_SYSREG(HV_SYS_REG_CNTKCTL_EL1, 14, 1, 3, 0, 0) +DEF_SYSREG(HV_SYS_REG_CSSELR_EL1, 0, 0, 3, 2, 0) +DEF_SYSREG(HV_SYS_REG_TPIDR_EL0, 13, 0, 3, 3, 2) +DEF_SYSREG(HV_SYS_REG_TPIDRRO_EL0, 13, 0, 3, 3, 3) +DEF_SYSREG(HV_SYS_REG_CNTV_CTL_EL0, 14, 3, 3, 3, 1) +DEF_SYSREG(HV_SYS_REG_CNTV_CVAL_EL0, 14, 3, 3, 3, 2) +DEF_SYSREG(HV_SYS_REG_SP_EL1, 4, 1, 3, 4, 0) -- 2.43.0 ^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH 3/7] target/arm/hvf: Split out sysreg.c.inc 2025-08-18 4:13 ` [PATCH 3/7] target/arm/hvf: Split out sysreg.c.inc Richard Henderson @ 2025-08-18 6:13 ` Philippe Mathieu-Daudé 0 siblings, 0 replies; 23+ messages in thread From: Philippe Mathieu-Daudé @ 2025-08-18 6:13 UTC (permalink / raw) To: Richard Henderson, qemu-devel; +Cc: mads, agraf, qemu-arm On 18/8/25 06:13, Richard Henderson wrote: > Move the list of supported sysregs to a reuseable file. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > target/arm/hvf/hvf.c | 147 ++---------------------------------- > target/arm/hvf/sysreg.c.inc | 146 +++++++++++++++++++++++++++++++++++ > 2 files changed, 152 insertions(+), 141 deletions(-) > create mode 100644 target/arm/hvf/sysreg.c.inc Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> ^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH 4/7] target/arm/hvf: Add KVMID_TO_HVF, HVF_TO_KVMID 2025-08-18 4:13 [PATCH 0/7] target/arm/hvf cleanups Richard Henderson ` (2 preceding siblings ...) 2025-08-18 4:13 ` [PATCH 3/7] target/arm/hvf: Split out sysreg.c.inc Richard Henderson @ 2025-08-18 4:13 ` Richard Henderson 2025-08-18 12:41 ` Philippe Mathieu-Daudé 2025-08-18 4:13 ` [PATCH 5/7] target/arm/hvf: Remove hvf_sreg_match.key Richard Henderson ` (4 subsequent siblings) 8 siblings, 1 reply; 23+ messages in thread From: Richard Henderson @ 2025-08-18 4:13 UTC (permalink / raw) To: qemu-devel; +Cc: mads, agraf, qemu-arm, philmd Conversion between KVM system registers ids and the HVF system register ids is trivial. Signed-off-by: Richard Henderson <richard.henderson@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__))); + +#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) }, -- 2.43.0 ^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH 4/7] target/arm/hvf: Add KVMID_TO_HVF, HVF_TO_KVMID 2025-08-18 4:13 ` [PATCH 4/7] target/arm/hvf: Add KVMID_TO_HVF, HVF_TO_KVMID Richard Henderson @ 2025-08-18 12:41 ` Philippe Mathieu-Daudé 2025-08-18 13:21 ` Richard Henderson 0 siblings, 1 reply; 23+ messages in thread From: Philippe Mathieu-Daudé @ 2025-08-18 12:41 UTC (permalink / raw) To: Richard Henderson, qemu-devel; +Cc: mads, agraf, qemu-arm, Mohamed Mediouni 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.henderson@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) }, > ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 4/7] target/arm/hvf: Add KVMID_TO_HVF, HVF_TO_KVMID 2025-08-18 12:41 ` Philippe Mathieu-Daudé @ 2025-08-18 13:21 ` Richard Henderson 2025-08-18 15:46 ` Philippe Mathieu-Daudé 0 siblings, 1 reply; 23+ messages in thread From: Richard Henderson @ 2025-08-18 13:21 UTC (permalink / raw) To: Philippe Mathieu-Daudé, qemu-devel Cc: mads, agraf, qemu-arm, Mohamed Mediouni On 8/18/25 22:41, Philippe Mathieu-Daudé wrote: > 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) > | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > HV_SYS_REG_MDCR_EL2 = 0xe019, <---- How odd. It should be e089, if it were encoded like all the others. I wonder if this is a manual typo that's now baked into the api, or if it's an OS bug. r~ ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 4/7] target/arm/hvf: Add KVMID_TO_HVF, HVF_TO_KVMID 2025-08-18 13:21 ` Richard Henderson @ 2025-08-18 15:46 ` Philippe Mathieu-Daudé 2025-08-18 18:37 ` Danny Canter 0 siblings, 1 reply; 23+ messages in thread From: Philippe Mathieu-Daudé @ 2025-08-18 15:46 UTC (permalink / raw) To: Richard Henderson, qemu-devel Cc: mads, agraf, qemu-arm, Mohamed Mediouni, Danny Canter, Cameron Esfahani, Akihiko Odaki Cc'ing Apple folks hoping they can forward or directly help :) On 18/8/25 15:21, Richard Henderson wrote: > On 8/18/25 22:41, Philippe Mathieu-Daudé wrote: >> 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) >> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > >> HV_SYS_REG_MDCR_EL2 = 0xe019, <---- > > How odd. It should be e089, if it were encoded like all the others. > > I wonder if this is a manual typo that's now baked into the api, or if > it's an OS bug. > > > r~ > ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 4/7] target/arm/hvf: Add KVMID_TO_HVF, HVF_TO_KVMID 2025-08-18 15:46 ` Philippe Mathieu-Daudé @ 2025-08-18 18:37 ` Danny Canter 2025-09-01 15:02 ` Philippe Mathieu-Daudé 0 siblings, 1 reply; 23+ messages in thread From: Danny Canter @ 2025-08-18 18:37 UTC (permalink / raw) To: Philippe Mathieu-Daudé Cc: Richard Henderson, qemu-devel, mads, agraf, qemu-arm, Mohamed Mediouni, Cameron Esfahani, Akihiko Odaki [-- Attachment #1: Type: text/plain, Size: 1427 bytes --] Howdy, On macOS versions/SDKs before 26 you are correct, we had an invalid enum value for HV_SYS_REG_MDCR_EL2 in the API, but the hv_vcpu_get/set_sys_reg APIs work with this value even though the encoding is incorrect. The enum value has been remedied in 26+ (0xe089 as you pointed out) and has been done in a backwards compatible way internally in the framework. > On Aug 18, 2025, at 8:46 AM, Philippe Mathieu-Daudé <philmd@linaro.org> wrote: > > Cc'ing Apple folks hoping they can forward or directly help :) > > On 18/8/25 15:21, Richard Henderson wrote: >> On 8/18/25 22:41, Philippe Mathieu-Daudé wrote: >>> 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) >>> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >>> HV_SYS_REG_MDCR_EL2 = 0xe019, <---- >> How odd. It should be e089, if it were encoded like all the others. >> I wonder if this is a manual typo that's now baked into the api, or if it's an OS bug. >> r~ > [-- Attachment #2: Type: text/html, Size: 2973 bytes --] ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 4/7] target/arm/hvf: Add KVMID_TO_HVF, HVF_TO_KVMID 2025-08-18 18:37 ` Danny Canter @ 2025-09-01 15:02 ` Philippe Mathieu-Daudé 2025-09-02 13:40 ` Richard Henderson 0 siblings, 1 reply; 23+ messages in thread From: Philippe Mathieu-Daudé @ 2025-09-01 15:02 UTC (permalink / raw) To: Richard Henderson Cc: qemu-devel, mads, agraf, Danny Canter, qemu-arm, Mohamed Mediouni, Cameron Esfahani, Akihiko Odaki On 18/8/25 20:37, Danny Canter wrote: > Howdy, > > On macOS versions/SDKs before 26 you are correct, we had an invalid enum > value for HV_SYS_REG_MDCR_EL2 in the API, but the hv_vcpu_get/ > set_sys_reg APIs work with this value even though the > encoding is incorrect. The enum value has been remedied in 26+ (0xe089 > as you pointed out) and has been done in a backwards compatible way > internally in the framework. Thanks Danny! Richard, should we guard the QEMU_BUILD_BUG_ON() macro with: #if defined(MAC_OS_VERSION_26_0) && \ MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_VERSION_26_0 ? > >> On Aug 18, 2025, at 8:46 AM, Philippe Mathieu-Daudé >> <philmd@linaro.org> wrote: >> >> Cc'ing Apple folks hoping they can forward or directly help :) >> >> On 18/8/25 15:21, Richard Henderson wrote: >>> On 8/18/25 22:41, Philippe Mathieu-Daudé wrote: >>>> 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) >>>> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >>>> HV_SYS_REG_MDCR_EL2 = 0xe019, <---- >>> How odd. It should be e089, if it were encoded like all the others. >>> I wonder if this is a manual typo that's now baked into the api, or >>> if it's an OS bug. >>> r~ >> > ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 4/7] target/arm/hvf: Add KVMID_TO_HVF, HVF_TO_KVMID 2025-09-01 15:02 ` Philippe Mathieu-Daudé @ 2025-09-02 13:40 ` Richard Henderson 0 siblings, 0 replies; 23+ messages in thread From: Richard Henderson @ 2025-09-02 13:40 UTC (permalink / raw) To: Philippe Mathieu-Daudé Cc: qemu-devel, mads, agraf, Danny Canter, qemu-arm, Mohamed Mediouni, Cameron Esfahani, Akihiko Odaki On 9/1/25 01:02, Philippe Mathieu-Daudé wrote: > On 18/8/25 20:37, Danny Canter wrote: >> Howdy, >> >> On macOS versions/SDKs before 26 you are correct, we had an invalid enum value for >> HV_SYS_REG_MDCR_EL2 in the API, but the hv_vcpu_get/ set_sys_reg APIs work with this >> value even though the >> encoding is incorrect. The enum value has been remedied in 26+ (0xe089 as you pointed >> out) and has been done in a backwards compatible way internally in the framework. > > Thanks Danny! > > Richard, should we guard the QEMU_BUILD_BUG_ON() macro with: > > #if defined(MAC_OS_VERSION_26_0) && \ > MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_VERSION_26_0 > > ? That's one possibility. Another is to remap the one broken enum, since this fix is described to be backward compatible. r~ ^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH 5/7] target/arm/hvf: Remove hvf_sreg_match.key 2025-08-18 4:13 [PATCH 0/7] target/arm/hvf cleanups Richard Henderson ` (3 preceding siblings ...) 2025-08-18 4:13 ` [PATCH 4/7] target/arm/hvf: Add KVMID_TO_HVF, HVF_TO_KVMID Richard Henderson @ 2025-08-18 4:13 ` Richard Henderson 2025-08-18 6:15 ` Philippe Mathieu-Daudé 2025-08-18 4:13 ` [PATCH 6/7] target/arm/hvf: Replace hvf_sreg_match with hvf_sreg_list Richard Henderson ` (3 subsequent siblings) 8 siblings, 1 reply; 23+ messages in thread From: Richard Henderson @ 2025-08-18 4:13 UTC (permalink / raw) To: qemu-devel; +Cc: mads, agraf, qemu-arm, philmd Use conversion functions instead of table lookup. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- target/arm/hvf/hvf.c | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c index 2577dc1c0c..46e52e8d34 100644 --- a/target/arm/hvf/hvf.c +++ b/target/arm/hvf/hvf.c @@ -152,9 +152,6 @@ void hvf_arm_init_debug(void) g_array_sized_new(true, true, sizeof(HWWatchpoint), max_hw_wps); } -#define HVF_SYSREG(crn, crm, op0, op1, op2) \ - ENCODE_AA64_CP_REG(CP_REG_ARM64_SYSREG_CP, crn, crm, op0, op1, op2) - #define SYSREG_OP0_SHIFT 20 #define SYSREG_OP0_MASK 0x3 #define SYSREG_OP0(sysreg) ((sysreg >> SYSREG_OP0_SHIFT) & SYSREG_OP0_MASK) @@ -399,7 +396,6 @@ static const struct hvf_reg_match hvf_fpreg_match[] = { struct hvf_sreg_match { int reg; - uint32_t key; uint32_t cp_idx; }; @@ -423,8 +419,7 @@ struct hvf_sreg_match { #undef DEF_SYSREG -#define DEF_SYSREG(HVF_ID, crn, crm, op0, op1, op2) \ - { HVF_ID, HVF_SYSREG(crn, crm, op0, op1, op2) }, +#define DEF_SYSREG(HVF_ID, crn, crm, op0, op1, op2) { HVF_ID }, static struct hvf_sreg_match hvf_sreg_match[] = { #include "sysreg.c.inc" @@ -469,13 +464,16 @@ int hvf_get_registers(CPUState *cpu) pstate_write(env, val); for (i = 0; i < ARRAY_SIZE(hvf_sreg_match); i++) { + int hvf_id = hvf_sreg_match[i].reg; + uint64_t kvm_id = HVF_TO_KVMID(hvf_id); + if (hvf_sreg_match[i].cp_idx == -1) { continue; } if (cpu->accel->guest_debug_enabled) { /* Handle debug registers */ - switch (hvf_sreg_match[i].reg) { + switch (hvf_id) { case HV_SYS_REG_DBGBVR0_EL1: case HV_SYS_REG_DBGBCR0_EL1: case HV_SYS_REG_DBGWVR0_EL1: @@ -549,8 +547,10 @@ int hvf_get_registers(CPUState *cpu) * vCPU but simply keep the values from the previous * environment. */ - const ARMCPRegInfo *ri; - ri = get_arm_cp_reginfo(arm_cpu->cp_regs, hvf_sreg_match[i].key); + uint32_t key = kvm_to_cpreg_id(kvm_id); + const ARMCPRegInfo *ri = + get_arm_cp_reginfo(arm_cpu->cp_regs, key); + val = read_raw_cp_reg(env, ri); arm_cpu->cpreg_values[hvf_sreg_match[i].cp_idx] = val; @@ -559,7 +559,7 @@ int hvf_get_registers(CPUState *cpu) } } - ret = hv_vcpu_get_sys_reg(cpu->accel->fd, hvf_sreg_match[i].reg, &val); + ret = hv_vcpu_get_sys_reg(cpu->accel->fd, hvf_id, &val); assert_hvf_ok(ret); arm_cpu->cpreg_values[hvf_sreg_match[i].cp_idx] = val; @@ -606,13 +606,15 @@ int hvf_put_registers(CPUState *cpu) assert(write_cpustate_to_list(arm_cpu, false)); for (i = 0; i < ARRAY_SIZE(hvf_sreg_match); i++) { + int hvf_id = hvf_sreg_match[i].reg; + if (hvf_sreg_match[i].cp_idx == -1) { continue; } if (cpu->accel->guest_debug_enabled) { /* Handle debug registers */ - switch (hvf_sreg_match[i].reg) { + switch (hvf_id) { case HV_SYS_REG_DBGBVR0_EL1: case HV_SYS_REG_DBGBCR0_EL1: case HV_SYS_REG_DBGWVR0_EL1: @@ -687,7 +689,7 @@ int hvf_put_registers(CPUState *cpu) } val = arm_cpu->cpreg_values[hvf_sreg_match[i].cp_idx]; - ret = hv_vcpu_set_sys_reg(cpu->accel->fd, hvf_sreg_match[i].reg, val); + ret = hv_vcpu_set_sys_reg(cpu->accel->fd, hvf_id, val); assert_hvf_ok(ret); } @@ -922,14 +924,15 @@ int hvf_arch_init_vcpu(CPUState *cpu) /* Populate cp list for all known sysregs */ for (i = 0; i < sregs_match_len; i++) { - const ARMCPRegInfo *ri; - uint32_t key = hvf_sreg_match[i].key; + int hvf_id = hvf_sreg_match[i].reg; + uint64_t kvm_id = HVF_TO_KVMID(hvf_id); + uint32_t key = kvm_to_cpreg_id(kvm_id); + const ARMCPRegInfo *ri = get_arm_cp_reginfo(arm_cpu->cp_regs, key); - ri = get_arm_cp_reginfo(arm_cpu->cp_regs, key); if (ri) { assert(!(ri->type & ARM_CP_NO_RAW)); hvf_sreg_match[i].cp_idx = sregs_cnt; - arm_cpu->cpreg_indexes[sregs_cnt++] = cpreg_to_kvm_id(key); + arm_cpu->cpreg_indexes[sregs_cnt++] = kvm_id; } else { hvf_sreg_match[i].cp_idx = -1; } -- 2.43.0 ^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH 5/7] target/arm/hvf: Remove hvf_sreg_match.key 2025-08-18 4:13 ` [PATCH 5/7] target/arm/hvf: Remove hvf_sreg_match.key Richard Henderson @ 2025-08-18 6:15 ` Philippe Mathieu-Daudé 0 siblings, 0 replies; 23+ messages in thread From: Philippe Mathieu-Daudé @ 2025-08-18 6:15 UTC (permalink / raw) To: Richard Henderson, qemu-devel; +Cc: mads, agraf, qemu-arm On 18/8/25 06:13, Richard Henderson wrote: > Use conversion functions instead of table lookup. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > target/arm/hvf/hvf.c | 35 +++++++++++++++++++---------------- > 1 file changed, 19 insertions(+), 16 deletions(-) Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> ^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH 6/7] target/arm/hvf: Replace hvf_sreg_match with hvf_sreg_list 2025-08-18 4:13 [PATCH 0/7] target/arm/hvf cleanups Richard Henderson ` (4 preceding siblings ...) 2025-08-18 4:13 ` [PATCH 5/7] target/arm/hvf: Remove hvf_sreg_match.key Richard Henderson @ 2025-08-18 4:13 ` Richard Henderson 2025-08-18 6:17 ` Philippe Mathieu-Daudé 2025-08-18 4:13 ` [PATCH 7/7] target/arm/hvf: Sort the cpreg_indexes array Richard Henderson ` (2 subsequent siblings) 8 siblings, 1 reply; 23+ messages in thread From: Richard Henderson @ 2025-08-18 4:13 UTC (permalink / raw) To: qemu-devel; +Cc: mads, agraf, qemu-arm, philmd Change hvf_get_registers and hvf_put_registers to iterate over cpregs_indexes instead of hvf_sreg_match. This lets us drop the cp_idx member of hvf_sreg_match, which leaves only one member in the struct. Replace the struct with a const array. Instead of int, use the proper enum type: hv_sys_reg_t. Rename from hvf_sreg_match to hvf_sreg_list because there is no longer any matching going on. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- target/arm/hvf/hvf.c | 45 +++++++++++++++----------------------------- 1 file changed, 15 insertions(+), 30 deletions(-) diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c index 46e52e8d34..647eb675ef 100644 --- a/target/arm/hvf/hvf.c +++ b/target/arm/hvf/hvf.c @@ -394,11 +394,6 @@ static const struct hvf_reg_match hvf_fpreg_match[] = { { HV_SIMD_FP_REG_Q31, offsetof(CPUARMState, vfp.zregs[31]) }, }; -struct hvf_sreg_match { - int reg; - 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 @@ -419,9 +414,9 @@ struct hvf_sreg_match { #undef DEF_SYSREG -#define DEF_SYSREG(HVF_ID, crn, crm, op0, op1, op2) { HVF_ID }, +#define DEF_SYSREG(HVF_ID, crn, crm, op0, op1, op2) HVF_ID, -static struct hvf_sreg_match hvf_sreg_match[] = { +static const hv_sys_reg_t hvf_sreg_list[] = { #include "sysreg.c.inc" }; @@ -434,7 +429,7 @@ int hvf_get_registers(CPUState *cpu) hv_return_t ret; uint64_t val; hv_simd_fp_uchar16_t fpval; - int i; + int i, n; for (i = 0; i < ARRAY_SIZE(hvf_reg_match); i++) { ret = hv_vcpu_get_reg(cpu->accel->fd, hvf_reg_match[i].reg, &val); @@ -463,13 +458,9 @@ int hvf_get_registers(CPUState *cpu) assert_hvf_ok(ret); pstate_write(env, val); - for (i = 0; i < ARRAY_SIZE(hvf_sreg_match); i++) { - int hvf_id = hvf_sreg_match[i].reg; - uint64_t kvm_id = HVF_TO_KVMID(hvf_id); - - if (hvf_sreg_match[i].cp_idx == -1) { - continue; - } + for (i = 0, n = arm_cpu->cpreg_array_len; i < n; i++) { + uint64_t kvm_id = arm_cpu->cpreg_indexes[i]; + int hvf_id = KVMID_TO_HVF(kvm_id); if (cpu->accel->guest_debug_enabled) { /* Handle debug registers */ @@ -553,7 +544,7 @@ int hvf_get_registers(CPUState *cpu) val = read_raw_cp_reg(env, ri); - arm_cpu->cpreg_values[hvf_sreg_match[i].cp_idx] = val; + arm_cpu->cpreg_values[i] = val; continue; } } @@ -562,7 +553,7 @@ int hvf_get_registers(CPUState *cpu) ret = hv_vcpu_get_sys_reg(cpu->accel->fd, hvf_id, &val); assert_hvf_ok(ret); - arm_cpu->cpreg_values[hvf_sreg_match[i].cp_idx] = val; + arm_cpu->cpreg_values[i] = val; } assert(write_list_to_cpustate(arm_cpu)); @@ -578,7 +569,7 @@ int hvf_put_registers(CPUState *cpu) hv_return_t ret; uint64_t val; hv_simd_fp_uchar16_t fpval; - int i; + int i, n; for (i = 0; i < ARRAY_SIZE(hvf_reg_match); i++) { val = *(uint64_t *)((void *)env + hvf_reg_match[i].offset); @@ -605,12 +596,9 @@ int hvf_put_registers(CPUState *cpu) aarch64_save_sp(env, arm_current_el(env)); assert(write_cpustate_to_list(arm_cpu, false)); - for (i = 0; i < ARRAY_SIZE(hvf_sreg_match); i++) { - int hvf_id = hvf_sreg_match[i].reg; - - if (hvf_sreg_match[i].cp_idx == -1) { - continue; - } + for (i = 0, n = arm_cpu->cpreg_array_len; i < n; i++) { + uint64_t kvm_id = arm_cpu->cpreg_indexes[i]; + int hvf_id = KVMID_TO_HVF(kvm_id); if (cpu->accel->guest_debug_enabled) { /* Handle debug registers */ @@ -688,7 +676,7 @@ int hvf_put_registers(CPUState *cpu) } } - val = arm_cpu->cpreg_values[hvf_sreg_match[i].cp_idx]; + val = arm_cpu->cpreg_values[i]; ret = hv_vcpu_set_sys_reg(cpu->accel->fd, hvf_id, val); assert_hvf_ok(ret); } @@ -899,7 +887,7 @@ int hvf_arch_init_vcpu(CPUState *cpu) { ARMCPU *arm_cpu = ARM_CPU(cpu); CPUARMState *env = &arm_cpu->env; - uint32_t sregs_match_len = ARRAY_SIZE(hvf_sreg_match); + uint32_t sregs_match_len = ARRAY_SIZE(hvf_sreg_list); uint32_t sregs_cnt = 0; uint64_t pfr; hv_return_t ret; @@ -924,17 +912,14 @@ int hvf_arch_init_vcpu(CPUState *cpu) /* Populate cp list for all known sysregs */ for (i = 0; i < sregs_match_len; i++) { - int hvf_id = hvf_sreg_match[i].reg; + hv_sys_reg_t hvf_id = hvf_sreg_list[i]; uint64_t kvm_id = HVF_TO_KVMID(hvf_id); uint32_t key = kvm_to_cpreg_id(kvm_id); const ARMCPRegInfo *ri = get_arm_cp_reginfo(arm_cpu->cp_regs, key); if (ri) { assert(!(ri->type & ARM_CP_NO_RAW)); - hvf_sreg_match[i].cp_idx = sregs_cnt; arm_cpu->cpreg_indexes[sregs_cnt++] = kvm_id; - } else { - hvf_sreg_match[i].cp_idx = -1; } } arm_cpu->cpreg_array_len = sregs_cnt; -- 2.43.0 ^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH 6/7] target/arm/hvf: Replace hvf_sreg_match with hvf_sreg_list 2025-08-18 4:13 ` [PATCH 6/7] target/arm/hvf: Replace hvf_sreg_match with hvf_sreg_list Richard Henderson @ 2025-08-18 6:17 ` Philippe Mathieu-Daudé 0 siblings, 0 replies; 23+ messages in thread From: Philippe Mathieu-Daudé @ 2025-08-18 6:17 UTC (permalink / raw) To: Richard Henderson, qemu-devel; +Cc: mads, agraf, qemu-arm On 18/8/25 06:13, Richard Henderson wrote: > Change hvf_get_registers and hvf_put_registers to iterate over > cpregs_indexes instead of hvf_sreg_match. > > This lets us drop the cp_idx member of hvf_sreg_match, which leaves > only one member in the struct. Replace the struct with a const array. > Instead of int, use the proper enum type: hv_sys_reg_t. > Rename from hvf_sreg_match to hvf_sreg_list because there is no > longer any matching going on. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > target/arm/hvf/hvf.c | 45 +++++++++++++++----------------------------- > 1 file changed, 15 insertions(+), 30 deletions(-) Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> ^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH 7/7] target/arm/hvf: Sort the cpreg_indexes array 2025-08-18 4:13 [PATCH 0/7] target/arm/hvf cleanups Richard Henderson ` (5 preceding siblings ...) 2025-08-18 4:13 ` [PATCH 6/7] target/arm/hvf: Replace hvf_sreg_match with hvf_sreg_list Richard Henderson @ 2025-08-18 4:13 ` Richard Henderson 2025-08-18 6:18 ` Philippe Mathieu-Daudé 2025-08-18 12:25 ` [PATCH 0/7] target/arm/hvf cleanups Philippe Mathieu-Daudé 2025-08-20 11:52 ` Mads Ynddal 8 siblings, 1 reply; 23+ messages in thread From: Richard Henderson @ 2025-08-18 4:13 UTC (permalink / raw) To: qemu-devel; +Cc: mads, agraf, qemu-arm, philmd Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- target/arm/hvf/hvf.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c index 647eb675ef..88ed96be11 100644 --- a/target/arm/hvf/hvf.c +++ b/target/arm/hvf/hvf.c @@ -925,6 +925,9 @@ int hvf_arch_init_vcpu(CPUState *cpu) arm_cpu->cpreg_array_len = sregs_cnt; arm_cpu->cpreg_vmstate_array_len = sregs_cnt; + /* cpreg tuples must be in strictly ascending order */ + qsort(arm_cpu->cpreg_indexes, sregs_cnt, sizeof(uint64_t), compare_u64); + assert(write_cpustate_to_list(arm_cpu, false)); /* Set CP_NO_RAW system registers on init */ -- 2.43.0 ^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH 7/7] target/arm/hvf: Sort the cpreg_indexes array 2025-08-18 4:13 ` [PATCH 7/7] target/arm/hvf: Sort the cpreg_indexes array Richard Henderson @ 2025-08-18 6:18 ` Philippe Mathieu-Daudé 0 siblings, 0 replies; 23+ messages in thread From: Philippe Mathieu-Daudé @ 2025-08-18 6:18 UTC (permalink / raw) To: Richard Henderson, qemu-devel; +Cc: mads, agraf, qemu-arm On 18/8/25 06:13, Richard Henderson wrote: > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > target/arm/hvf/hvf.c | 3 +++ > 1 file changed, 3 insertions(+) Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 0/7] target/arm/hvf cleanups 2025-08-18 4:13 [PATCH 0/7] target/arm/hvf cleanups Richard Henderson ` (6 preceding siblings ...) 2025-08-18 4:13 ` [PATCH 7/7] target/arm/hvf: Sort the cpreg_indexes array Richard Henderson @ 2025-08-18 12:25 ` Philippe Mathieu-Daudé 2025-08-20 11:52 ` Mads Ynddal 8 siblings, 0 replies; 23+ messages in thread From: Philippe Mathieu-Daudé @ 2025-08-18 12:25 UTC (permalink / raw) To: Richard Henderson, qemu-devel; +Cc: mads, agraf, qemu-arm On 18/8/25 06:13, Richard Henderson wrote: > While working on other things cpregs related, I noticed that > target/arm/hvf failed to produce a sorted cpreg_indexes[]. > > I wondered if that explained the migration-test failure that > we have, but no such luck. (I have no idea how to debug that > test, btw; so far it is still just a mysterious SIGSEGV.) I'm experiencing a pleasant speedup. I suppose this is expected, due to the array rearrangement. > Richard Henderson (7): > target/arm: Introduce KVMID_AA64_SYS_REG64 > target/arm: Move compare_u64 to helper.c > target/arm/hvf: Split out sysreg.c.inc > target/arm/hvf: Add KVMID_TO_HVF, HVF_TO_KVMID > target/arm/hvf: Remove hvf_sreg_match.key > target/arm/hvf: Replace hvf_sreg_match with hvf_sreg_list > target/arm/hvf: Sort the cpreg_indexes array Series: Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org> ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 0/7] target/arm/hvf cleanups 2025-08-18 4:13 [PATCH 0/7] target/arm/hvf cleanups Richard Henderson ` (7 preceding siblings ...) 2025-08-18 12:25 ` [PATCH 0/7] target/arm/hvf cleanups Philippe Mathieu-Daudé @ 2025-08-20 11:52 ` Mads Ynddal 8 siblings, 0 replies; 23+ messages in thread From: Mads Ynddal @ 2025-08-20 11:52 UTC (permalink / raw) To: Richard Henderson; +Cc: qemu-devel, agraf, qemu-arm, philmd > On 18 Aug 2025, at 06.13, Richard Henderson <richard.henderson@linaro.org> wrote: > > While working on other things cpregs related, I noticed that > target/arm/hvf failed to produce a sorted cpreg_indexes[]. > > I wondered if that explained the migration-test failure that > we have, but no such luck. (I have no idea how to debug that > test, btw; so far it is still just a mysterious SIGSEGV.) > > > r~ > > > Richard Henderson (7): > target/arm: Introduce KVMID_AA64_SYS_REG64 > target/arm: Move compare_u64 to helper.c > target/arm/hvf: Split out sysreg.c.inc > target/arm/hvf: Add KVMID_TO_HVF, HVF_TO_KVMID > target/arm/hvf: Remove hvf_sreg_match.key > target/arm/hvf: Replace hvf_sreg_match with hvf_sreg_list > target/arm/hvf: Sort the cpreg_indexes array > > target/arm/cpregs.h | 3 + > target/arm/kvm-consts.h | 11 ++ > target/arm/helper.c | 11 ++ > target/arm/hvf/hvf.c | 230 +++++++++--------------------------- > target/arm/kvm.c | 11 -- > target/arm/hvf/sysreg.c.inc | 146 +++++++++++++++++++++++ > 6 files changed, 224 insertions(+), 188 deletions(-) > create mode 100644 target/arm/hvf/sysreg.c.inc > > -- > 2.43.0 > I noted the issue with HV_SYS_REG_MDCR_EL2, but assume we'll fix it down the line. For the series: Reviewed-by: Mads Ynddal <mads@ynddal.dk> ^ permalink raw reply [flat|nested] 23+ messages in thread
* [RFC PATCH 00/61] target/arm: Implement FEAT_SYSREG128
@ 2025-08-27 1:03 Richard Henderson
2025-08-27 1:03 ` [PATCH 4/7] target/arm/hvf: Add KVMID_TO_HVF, HVF_TO_KVMID Richard Henderson
0 siblings, 1 reply; 23+ messages in thread
From: Richard Henderson @ 2025-08-27 1:03 UTC (permalink / raw)
To: qemu-devel; +Cc: qemu-arm
Requesting feedback on the implementation of 128-bit registers.
Note that there ought to be no functional change with all of this,
because 128-bit sysregs are not hereing enabled. Despite all of the
different FEAT_* names, it's all indivisible from FEAT_D128.
I've used Int128 throughout, which seems sensible at first glance,
but *really* complicates the definition of the registers within
ARMCPU, especially when the low part is aliased with AArch32.
The only saving grace is that there are so few 128-bit registers.
Gettng there isn't trivial either. I wasn't happy with the idea
of replicating the orig_{read,write,access} set of hooks used by
VHE, so I've rewritten that to perform the VHE redirection at
translation time, much like how we do for NV2.
In the process of rewriting VHE, re-organize registration to
simplify memory management and reduce the number of arguments
to the inner helper functions.
At one point in development, I did not have CP_REG_AA64_128BIT_MASK,
which was going to require cpreg_to_kvm_id to also take a
ARMCPRegInfo pointer. There aren't a whole lot of calls to that
helper, but the one in hvf required reorganization to handle.
With CP_REG_AA64_128BIT_MASK, that reorganization is not required,
but I still think it's a good cleanup so I have kept it.
Alternate implementation strategies:
(1) Disconnect the 64-bit halves of the sysregs.
Cons:
- The 128-bit-ness isn't screamingly obvious.
Pros:
- Avoid having to rearrange the ARMCPU layout, and simpler
integration with AArch32.
- Avoid Int128 most places, since we wind up doing quite a
lot of packing and unpacking the structure.
- Because Int128 *isn't* a structure for most 64-bit builds,
we can accidentally assign a 64-bit local to a 128-bit field.
- Possibly easier migration changes; I havn't thought about
that too much.
(2) Avoid adding read128fn, raw_*128fn, and most write128fn, at
least for now, because no defined sysregs need such handling.
E.g. the 128-bit write of TTBR0_EL1 could call the existing
writefn for the low half and directly store the high half.
We do still need write128fn for the TLBIP set of insns, not
yet implemented here, but even that could avoid Int128 by
having 2 64-bit arguments.
Thoughts?
r~
Richard Henderson (61):
target/arm: Introduce KVMID_AA64_SYS_REG64
target/arm: Move compare_u64 to helper.c
target/arm/hvf: Split out sysreg.c.inc
target/arm/hvf: Reorder DEF_SYSREG arguments
target/arm/hvf: Add KVMID_TO_HVF, HVF_TO_KVMID
target/arm/hvf: Remove hvf_sreg_match.key
target/arm/hvf: Replace hvf_sreg_match with hvf_sreg_list
target/arm/hvf: Sort the cpreg_indexes array
target/arm/hvf: Use raw_read, raw_write to access
target/arm: Use raw_write in cp_reg_reset
target/arm: Rename all ARMCPRegInfo from opaque to ri
target/arm: Drop define_one_arm_cp_reg_with_opaque
target/arm: Restrict the scope of CPREG_FIELD32, CPREG_FIELD64
target/arm: Replace cpreg_field_is_64bit with cpreg_field_type
target/arm: Add CP_REG_AA32_64BIT_{SHIFT,MASK}
target/arm: Rename CP_REG_AA32_NS_{SHIFT,MASK}
target/arm: Convert init_cpreg_list to g_hash_table_foreach
target/arm: Remove cp argument to ENCODE_AA64_CP_REG
target/arm: Reorder ENCODE_AA64_CP_REG arguments
target/arm: Split out add_cpreg_to_hashtable_aa{32,64}
target/arm: Improve asserts in define_one_arm_cp_reg
target/arm: Move cp processing to define_one_arm_cp_reg
target/arm: Move cpreg elimination to define_one_arm_cp_reg
target/arm: Add key parameter to add_cpreg_to_hashtable
target/arm: Split out alloc_cpreg
target/arm: Hoist the allocation of ARMCPRegInfo
target/arm: Remove name argument to alloc_cpreg
target/arm: Move alias setting for wildcards
target/arm: Move writeback of CP_ANY fields
target/arm: Move endianness fixup for 32-bit registers
target/arm: Rename TBFLAG_A64_NV2_MEM_E20 with *_E2H
target/arm: Split out redirect_cpreg
target/arm: Redirect VHE FOO_EL1 -> FOO_EL2 during translation
target/arm: Redirect VHE FOO_EL12 to FOO_EL1 during translation
target/arm: Rename some cpreg to their aarch64 names
target/arm: Remove define_arm_vh_e2h_redirects_aliases
target/arm: Implement isar tests for FEAT_SYSREG128, FEAT_SYSINSTR128
target/arm: Define CP_REG_SIZE_U128
target/arm: Update ARMCPRegInfo for 128-bit sysregs
target/arm: Assert ARM_CP_128BIT only with ARM_CP_STATE_AA64
target/arm: Split add_cpreg_to_hashtable_aa64
target/arm: Add raw_read128, raw_write128
target/arm: Add read_raw_cp_reg128, write_raw_cp_reg128
target/arm: Put 128-bit sysregs into a separate list
target/arm/kvm: Assert no 128-bit sysregs in kvm_arm_init_cpreg_list
target/arm/hvf: Assert no 128-bit sysregs in hvf_arch_init_vcpu
migration: Add vmstate_info_int128
target/arm: Migrate cpreg128 registers
target/arm: Add syn_aa64_sysreg128trap
target/arm: Introduce helper_{get,set}_cp_reg128
target/arm: Implement MRRS, MSRR, SYSP
include/qemu/compiler: Introduce HOST_ENDIAN_FIELDS
include/hw/core/cpu: Use HOST_ENDIAN_FIELDS in IcountDecr
include/qemu/host-utils: Use HOST_ENDIAN_FIELDS in muldiv64_rounding
target/arm: Use HOST_ENDIAN_FIELDS in CPUARMState
target/arm: Consolidate definitions of PAR
target/arm: Extend PAR_EL1 to 128-bit
target/arm: Consolidate definitions of TTBR[01]
target/arm: Split out flush_if_asid_change
target/arm: Use flush_if_asid_change in vmsa_ttbr_write
target/arm: Extend TTBR system registers to 128-bit
include/hw/core/cpu.h | 8 +-
include/migration/vmstate.h | 1 +
include/qemu/compiler.h | 11 +
include/qemu/host-utils.h | 6 +-
target/arm/cpregs.h | 134 +--
target/arm/cpu-features.h | 10 +
target/arm/cpu.h | 95 +-
target/arm/internals.h | 4 +
target/arm/kvm-consts.h | 16 +-
target/arm/syndrome.h | 10 +
target/arm/tcg/helper.h | 2 +
target/arm/tcg/translate.h | 2 +
hw/intc/arm_gicv3_cpuif.c | 10 +-
migration/vmstate-types.c | 30 +
target/arm/cpu.c | 10 +-
target/arm/gdbstub.c | 14 +-
target/arm/helper.c | 1536 +++++++++++++++++++-------------
target/arm/hvf/hvf.c | 243 ++---
target/arm/kvm.c | 13 +-
target/arm/machine.c | 50 ++
target/arm/ptw.c | 14 +-
target/arm/tcg/cpregs-at.c | 4 +-
target/arm/tcg/hflags.c | 8 +-
target/arm/tcg/op_helper.c | 28 +
target/arm/tcg/translate-a64.c | 207 ++++-
target/arm/hvf/sysreg.c.inc | 146 +++
target/arm/tcg/a64.decode | 12 +-
27 files changed, 1595 insertions(+), 1029 deletions(-)
create mode 100644 target/arm/hvf/sysreg.c.inc
--
2.43.0
^ permalink raw reply [flat|nested] 23+ messages in thread* [PATCH 4/7] target/arm/hvf: Add KVMID_TO_HVF, HVF_TO_KVMID 2025-08-27 1:03 [RFC PATCH 00/61] target/arm: Implement FEAT_SYSREG128 Richard Henderson @ 2025-08-27 1:03 ` Richard Henderson 2025-08-28 12:22 ` Manos Pitsidianakis 0 siblings, 1 reply; 23+ messages in thread From: Richard Henderson @ 2025-08-27 1:03 UTC (permalink / raw) To: qemu-devel; +Cc: qemu-arm Conversion between KVM system registers ids and the HVF system register ids is trivial. Signed-off-by: Richard Henderson <richard.henderson@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__))); + +#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) }, -- 2.43.0 ^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH 4/7] target/arm/hvf: Add KVMID_TO_HVF, HVF_TO_KVMID 2025-08-27 1:03 ` [PATCH 4/7] target/arm/hvf: Add KVMID_TO_HVF, HVF_TO_KVMID Richard Henderson @ 2025-08-28 12:22 ` Manos Pitsidianakis 0 siblings, 0 replies; 23+ messages in thread From: Manos Pitsidianakis @ 2025-08-28 12:22 UTC (permalink / raw) To: Richard Henderson; +Cc: qemu-devel, qemu-arm On Wed, Aug 27, 2025 at 4:07 AM Richard Henderson <richard.henderson@linaro.org> wrote: > > Conversion between KVM system registers ids and the HVF system > register ids is trivial. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- FYI: you sent this as [PATCH 4/7] and [PATCH 05/61] by accident, happened to a few other patches in this series as well. > 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__))); > + > +#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) }, > > -- > 2.43.0 > > ^ permalink raw reply [flat|nested] 23+ messages in thread
end of thread, other threads:[~2025-09-02 13:41 UTC | newest] Thread overview: 23+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-08-18 4:13 [PATCH 0/7] target/arm/hvf cleanups Richard Henderson 2025-08-18 4:13 ` [PATCH 1/7] target/arm: Introduce KVMID_AA64_SYS_REG64 Richard Henderson 2025-08-18 4:13 ` [PATCH 2/7] target/arm: Move compare_u64 to helper.c Richard Henderson 2025-08-18 6:12 ` Philippe Mathieu-Daudé 2025-08-18 4:13 ` [PATCH 3/7] target/arm/hvf: Split out sysreg.c.inc Richard Henderson 2025-08-18 6:13 ` Philippe Mathieu-Daudé 2025-08-18 4:13 ` [PATCH 4/7] target/arm/hvf: Add KVMID_TO_HVF, HVF_TO_KVMID Richard Henderson 2025-08-18 12:41 ` Philippe Mathieu-Daudé 2025-08-18 13:21 ` Richard Henderson 2025-08-18 15:46 ` Philippe Mathieu-Daudé 2025-08-18 18:37 ` Danny Canter 2025-09-01 15:02 ` Philippe Mathieu-Daudé 2025-09-02 13:40 ` Richard Henderson 2025-08-18 4:13 ` [PATCH 5/7] target/arm/hvf: Remove hvf_sreg_match.key Richard Henderson 2025-08-18 6:15 ` Philippe Mathieu-Daudé 2025-08-18 4:13 ` [PATCH 6/7] target/arm/hvf: Replace hvf_sreg_match with hvf_sreg_list Richard Henderson 2025-08-18 6:17 ` Philippe Mathieu-Daudé 2025-08-18 4:13 ` [PATCH 7/7] target/arm/hvf: Sort the cpreg_indexes array Richard Henderson 2025-08-18 6:18 ` Philippe Mathieu-Daudé 2025-08-18 12:25 ` [PATCH 0/7] target/arm/hvf cleanups Philippe Mathieu-Daudé 2025-08-20 11:52 ` Mads Ynddal -- strict thread matches above, loose matches on Subject: below -- 2025-08-27 1:03 [RFC PATCH 00/61] target/arm: Implement FEAT_SYSREG128 Richard Henderson 2025-08-27 1:03 ` [PATCH 4/7] target/arm/hvf: Add KVMID_TO_HVF, HVF_TO_KVMID Richard Henderson 2025-08-28 12:22 ` Manos Pitsidianakis
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).