The kvm_riscv_vcpu_update_timedelta() will be also used for when switching between guest HS-mode and guest VS/VU-mode so extend it accordingly.
Signed-off-by: Anup Patel <[email protected]> --- arch/riscv/include/asm/kvm_vcpu_timer.h | 1 + arch/riscv/kvm/vcpu_timer.c | 21 ++++++++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/arch/riscv/include/asm/kvm_vcpu_timer.h b/arch/riscv/include/asm/kvm_vcpu_timer.h index 82f7260301da..f97cf1d7d760 100644 --- a/arch/riscv/include/asm/kvm_vcpu_timer.h +++ b/arch/riscv/include/asm/kvm_vcpu_timer.h @@ -43,6 +43,7 @@ int kvm_riscv_vcpu_set_reg_timer(struct kvm_vcpu *vcpu, int kvm_riscv_vcpu_timer_init(struct kvm_vcpu *vcpu); int kvm_riscv_vcpu_timer_deinit(struct kvm_vcpu *vcpu); int kvm_riscv_vcpu_timer_reset(struct kvm_vcpu *vcpu); +void kvm_riscv_vcpu_update_timedelta(struct kvm_vcpu *vcpu, bool nested_virt); void kvm_riscv_vcpu_timer_restore(struct kvm_vcpu *vcpu); void kvm_riscv_guest_timer_init(struct kvm *kvm); void kvm_riscv_vcpu_timer_sync(struct kvm_vcpu *vcpu); diff --git a/arch/riscv/kvm/vcpu_timer.c b/arch/riscv/kvm/vcpu_timer.c index 9817ff802821..eda530228b05 100644 --- a/arch/riscv/kvm/vcpu_timer.c +++ b/arch/riscv/kvm/vcpu_timer.c @@ -287,15 +287,26 @@ int kvm_riscv_vcpu_timer_reset(struct kvm_vcpu *vcpu) return kvm_riscv_vcpu_timer_cancel(&vcpu->arch.timer); } -static void kvm_riscv_vcpu_update_timedelta(struct kvm_vcpu *vcpu) +void kvm_riscv_vcpu_update_timedelta(struct kvm_vcpu *vcpu, bool nested_virt) { + struct kvm_vcpu_nested_csr *nsc = &vcpu->arch.nested.csr; struct kvm_guest_timer *gt = &vcpu->kvm->arch.timer; + u64 ndelta = 0; + if (nested_virt) { + ndelta = nsc->htimedelta; #if defined(CONFIG_32BIT) - ncsr_write(CSR_HTIMEDELTA, (u32)(gt->time_delta)); - ncsr_write(CSR_HTIMEDELTAH, (u32)(gt->time_delta >> 32)); + ndelta |= ((u64)nsc->htimedeltah) << 32; +#endif + } + + ndelta += gt->time_delta; + +#if defined(CONFIG_32BIT) + ncsr_write(CSR_HTIMEDELTA, (u32)ndelta); + ncsr_write(CSR_HTIMEDELTAH, (u32)(ndelta >> 32)); #else - ncsr_write(CSR_HTIMEDELTA, gt->time_delta); + ncsr_write(CSR_HTIMEDELTA, ndelta); #endif } @@ -303,7 +314,7 @@ void kvm_riscv_vcpu_timer_restore(struct kvm_vcpu *vcpu) { struct kvm_vcpu_timer *t = &vcpu->arch.timer; - kvm_riscv_vcpu_update_timedelta(vcpu); + kvm_riscv_vcpu_update_timedelta(vcpu, kvm_riscv_vcpu_nested_virt(vcpu)); if (!t->sstc_enabled) return; -- 2.43.0

