Add the required handling for EL2 and EL02 registers, as
well as EL1 registers used in the E2H context.

Signed-off-by: Marc Zyngier <[email protected]>
---
 arch/arm64/include/asm/sysreg.h |  6 +++
 arch/arm64/kvm/sys_regs.c       | 87 +++++++++++++++++++++++++++++++++
 2 files changed, 93 insertions(+)

diff --git a/arch/arm64/include/asm/sysreg.h b/arch/arm64/include/asm/sysreg.h
index d5724eccfc5d..286b09dbfc61 100644
--- a/arch/arm64/include/asm/sysreg.h
+++ b/arch/arm64/include/asm/sysreg.h
@@ -619,6 +619,12 @@
 
 #define SYS_CNTVOFF_EL2                        sys_reg(3, 4, 14, 0, 3)
 #define SYS_CNTHCTL_EL2                        sys_reg(3, 4, 14, 1, 0)
+#define SYS_CNTHP_TVAL_EL2             sys_reg(3, 4, 14, 2, 0)
+#define SYS_CNTHP_CTL_EL2              sys_reg(3, 4, 14, 2, 1)
+#define SYS_CNTHP_CVAL_EL2             sys_reg(3, 4, 14, 2, 2)
+#define SYS_CNTHV_TVAL_EL2             sys_reg(3, 4, 14, 3, 0)
+#define SYS_CNTHV_CTL_EL2              sys_reg(3, 4, 14, 3, 1)
+#define SYS_CNTHV_CVAL_EL2             sys_reg(3, 4, 14, 3, 2)
 
 /* VHE encodings for architectural EL0/1 system registers */
 #define SYS_SCTLR_EL12                 sys_reg(3, 5, 1, 0, 0)
diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
index 96e14c511c74..3da69c7992d1 100644
--- a/arch/arm64/kvm/sys_regs.c
+++ b/arch/arm64/kvm/sys_regs.c
@@ -1278,20 +1278,92 @@ static bool access_arch_timer(struct kvm_vcpu *vcpu,
 
        switch (reg) {
        case SYS_CNTP_TVAL_EL0:
+               if (vcpu_mode_el2(vcpu) && vcpu_el2_e2h_is_set(vcpu))
+                       tmr = TIMER_HPTIMER;
+               else
+                       tmr = TIMER_PTIMER;
+               treg = TIMER_REG_TVAL;
+               break;
+
        case SYS_AARCH32_CNTP_TVAL:
+       case SYS_CNTP_TVAL_EL02:
                tmr = TIMER_PTIMER;
                treg = TIMER_REG_TVAL;
                break;
+
+       case SYS_CNTV_TVAL_EL02:
+               tmr = TIMER_VTIMER;
+               treg = TIMER_REG_TVAL;
+               break;
+
+       case SYS_CNTHP_TVAL_EL2:
+               tmr = TIMER_HPTIMER;
+               treg = TIMER_REG_TVAL;
+               break;
+
+       case SYS_CNTHV_TVAL_EL2:
+               tmr = TIMER_HVTIMER;
+               treg = TIMER_REG_TVAL;
+               break;
+
        case SYS_CNTP_CTL_EL0:
+               if (vcpu_mode_el2(vcpu) && vcpu_el2_e2h_is_set(vcpu))
+                       tmr = TIMER_HPTIMER;
+               else
+                       tmr = TIMER_PTIMER;
+               treg = TIMER_REG_CTL;
+               break;
+
        case SYS_AARCH32_CNTP_CTL:
+       case SYS_CNTP_CTL_EL02:
                tmr = TIMER_PTIMER;
                treg = TIMER_REG_CTL;
                break;
+
+       case SYS_CNTV_CTL_EL02:
+               tmr = TIMER_VTIMER;
+               treg = TIMER_REG_CTL;
+               break;
+
+       case SYS_CNTHP_CTL_EL2:
+               tmr = TIMER_HPTIMER;
+               treg = TIMER_REG_CTL;
+               break;
+
+       case SYS_CNTHV_CTL_EL2:
+               tmr = TIMER_HVTIMER;
+               treg = TIMER_REG_CTL;
+               break;
+
        case SYS_CNTP_CVAL_EL0:
+               if (vcpu_mode_el2(vcpu) && vcpu_el2_e2h_is_set(vcpu))
+                       tmr = TIMER_HPTIMER;
+               else
+                       tmr = TIMER_PTIMER;
+               treg = TIMER_REG_CVAL;
+               break;
+
        case SYS_AARCH32_CNTP_CVAL:
+       case SYS_CNTP_CVAL_EL02:
                tmr = TIMER_PTIMER;
                treg = TIMER_REG_CVAL;
                break;
+
+       case SYS_CNTV_CVAL_EL02:
+               tmr = TIMER_VTIMER;
+               treg = TIMER_REG_CVAL;
+               break;
+
+       case SYS_CNTHP_CVAL_EL2:
+               tmr = TIMER_HPTIMER;
+               treg = TIMER_REG_CVAL;
+               break;
+
+       case SYS_CNTHV_CVAL_EL2:
+               tmr = TIMER_HVTIMER;
+               treg = TIMER_REG_CVAL;
+               break;
+
        case SYS_CNTVOFF_EL2:
                tmr = TIMER_VTIMER;
                treg = TIMER_REG_VOFF;
@@ -2147,6 +2219,13 @@ static const struct sys_reg_desc sys_reg_descs[] = {
        { SYS_DESC(SYS_CNTVOFF_EL2), access_arch_timer },
        { SYS_DESC(SYS_CNTHCTL_EL2), access_rw, reset_val, CNTHCTL_EL2, 0 },
 
+       { SYS_DESC(SYS_CNTHP_TVAL_EL2), access_arch_timer },
+       { SYS_DESC(SYS_CNTHP_CTL_EL2), access_arch_timer },
+       { SYS_DESC(SYS_CNTHP_CVAL_EL2), access_arch_timer },
+       { SYS_DESC(SYS_CNTHV_TVAL_EL2), access_arch_timer },
+       { SYS_DESC(SYS_CNTHV_CTL_EL2), access_arch_timer },
+       { SYS_DESC(SYS_CNTHV_CVAL_EL2), access_arch_timer },
+
        { SYS_DESC(SYS_SCTLR_EL12), access_vm_reg, reset_val, SCTLR_EL1, 
0x00C50078 },
        { SYS_DESC(SYS_CPACR_EL12), access_rw, reset_val, CPACR_EL1, 0 },
        { SYS_DESC(SYS_TTBR0_EL12), access_vm_reg, reset_unknown, TTBR0_EL1 },
@@ -2164,6 +2243,14 @@ static const struct sys_reg_desc sys_reg_descs[] = {
        { SYS_DESC(SYS_CONTEXTIDR_EL12), access_vm_reg, reset_val, 
CONTEXTIDR_EL1, 0 },
        { SYS_DESC(SYS_CNTKCTL_EL12), access_rw, reset_val, CNTKCTL_EL1, 0 },
 
+       { SYS_DESC(SYS_CNTP_TVAL_EL02), access_arch_timer },
+       { SYS_DESC(SYS_CNTP_CTL_EL02), access_arch_timer },
+       { SYS_DESC(SYS_CNTP_CVAL_EL02), access_arch_timer },
+
+       { SYS_DESC(SYS_CNTV_TVAL_EL02), access_arch_timer },
+       { SYS_DESC(SYS_CNTV_CTL_EL02), access_arch_timer },
+       { SYS_DESC(SYS_CNTV_CVAL_EL02), access_arch_timer },
+
        { SYS_DESC(SYS_SP_EL2), NULL, reset_unknown, SP_EL2 },
 };
 
-- 
2.29.2

_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

Reply via email to