RISC-V: KVM: do not EOPNOTSUPP in set KVM_REG_RISCV_TIMER_REG
authorDaniel Henrique Barboza <dbarboza@ventanamicro.com>
Thu, 3 Aug 2023 16:32:56 +0000 (13:32 -0300)
committerAnup Patel <anup@brainfault.org>
Tue, 8 Aug 2023 11:55:49 +0000 (17:25 +0530)
The KVM_REG_RISCV_TIMER_REG can be read via get_one_reg(). But trying to
write anything in this reg via set_one_reg() results in an EOPNOTSUPP.

Change the API to behave like cbom_block_size: instead of always
erroring out with EOPNOTSUPP, allow userspace to write the same value
(riscv_timebase) back, throwing an EINVAL if a different value is
attempted.

Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Signed-off-by: Anup Patel <anup@brainfault.org>
arch/riscv/kvm/vcpu_timer.c

index 527d269cafffc48dc9780166887ed2e68d470d38..75486b25ac45aa3d3e2a9e91701fc0f76e1c59bd 100644 (file)
@@ -218,7 +218,8 @@ int kvm_riscv_vcpu_set_reg_timer(struct kvm_vcpu *vcpu,
 
        switch (reg_num) {
        case KVM_REG_RISCV_TIMER_REG(frequency):
-               ret = -EOPNOTSUPP;
+               if (reg_val != riscv_timebase)
+                       return -EINVAL;
                break;
        case KVM_REG_RISCV_TIMER_REG(time):
                gt->time_delta = reg_val - get_cycles64();