target/arm: hvf: pass through CNTHCTL_EL2 and MDCCINT_EL1
HVF traps accesses to CNTHCTL_EL2. For nested guests, HVF traps accesses to MDCCINT_EL1. Pass through those accesses to the Hypervisor.framework library. Signed-off-by: Mohamed Mediouni <mohamed@unpredictable.fr> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org> Message-id: 20260429190532.26538-12-mohamed@unpredictable.fr Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Mohamed Mediouni committed
May 5, 2026 at 09:25 UTC
b8650e65201ac0954d85f00f72eae570e3019ae9
1 file changed
+20
target/arm/hvf/hvf.c
+20
@@ -296,6 +296,10 @@ void hvf_arm_init_debug(void)
296
#define SYSREG_DBGWVR15_EL1 SYSREG(2, 0, 0, 15, 6)
297
#define SYSREG_DBGWCR15_EL1 SYSREG(2, 0, 0, 15, 7)
298
299
+/* EL2 registers */
300
+#define SYSREG_CNTHCTL_EL2 SYSREG(3, 4, 14, 1, 0)
301
+#define SYSREG_MDCCINT_EL1 SYSREG(2, 0, 0, 2, 0)
302
+
303
#define WFX_IS_WFE (1 << 0)
304
305
#define TMR_CTL_ENABLE (1 << 0)
@@ -1728,6 +1732,14 @@ static int hvf_sysreg_read(CPUState *cpu, uint32_t reg, uint64_t *val)
1732
case SYSREG_OSDLR_EL1:
1733
/* Dummy register */
1734
return 0;
1735
+ case SYSREG_CNTHCTL_EL2:
1736
+ if (__builtin_available(macOS 15.0, *)) {
1737
+ assert_hvf_ok(hv_vcpu_get_sys_reg(cpu->accel->fd, HV_SYS_REG_CNTHCTL_EL2, val));
1738
+ }
1739
+ return 0;
1740
+ case SYSREG_MDCCINT_EL1:
1741
+ assert_hvf_ok(hv_vcpu_get_sys_reg(cpu->accel->fd, HV_SYS_REG_MDCCINT_EL1, val));
1742
+ return 0;
1743
case SYSREG_ICC_AP0R0_EL1:
1744
case SYSREG_ICC_AP0R1_EL1:
1745
case SYSREG_ICC_AP0R2_EL1:
@@ -2016,6 +2028,14 @@ static int hvf_sysreg_write(CPUState *cpu, uint32_t reg, uint64_t val)
2028
case SYSREG_OSDLR_EL1:
2029
/* Dummy register */
2030
return 0;
2031
+ case SYSREG_CNTHCTL_EL2:
2032
+ if (__builtin_available(macOS 15.0, *)) {
2033
+ assert_hvf_ok(hv_vcpu_set_sys_reg(cpu->accel->fd, HV_SYS_REG_CNTHCTL_EL2, val));
2034
+ }
2035
+ return 0;
2036
+ case SYSREG_MDCCINT_EL1:
2037
+ assert_hvf_ok(hv_vcpu_set_sys_reg(cpu->accel->fd, HV_SYS_REG_MDCCINT_EL1, val));
2038
+ return 0;
2039
case SYSREG_LORC_EL1:
2040
/* Dummy register */
2041
return 0;