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

Signed-off-by: Marc Zyngier <m...@kernel.org>
---
 arch/arm64/kvm/sys_regs.c | 72 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 72 insertions(+)

diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
index c1e856cb84f1..c62080d7742c 100644
--- a/arch/arm64/kvm/sys_regs.c
+++ b/arch/arm64/kvm/sys_regs.c
@@ -1384,20 +1384,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;
-- 
2.20.1

_______________________________________________
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

Reply via email to