Commit 680232a9 authored by Marc Zyngier's avatar Marc Zyngier

KVM: arm64: timers: Allow save/restoring of the physical timer

Nothing like being 10 year late to a party!

Now that userspace can set counter offsets, we can save/restore
the physical timer as well!

Nobody really cared so far, but you're welcome anyway.
Reviewed-by: default avatarColton Lewis <coltonlewis@google.com>
Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20230330174800.2677007-9-maz@kernel.org
parent 30ec7997
...@@ -590,11 +590,16 @@ static unsigned long num_core_regs(const struct kvm_vcpu *vcpu) ...@@ -590,11 +590,16 @@ static unsigned long num_core_regs(const struct kvm_vcpu *vcpu)
return copy_core_reg_indices(vcpu, NULL); return copy_core_reg_indices(vcpu, NULL);
} }
/** static const u64 timer_reg_list[] = {
* ARM64 versions of the TIMER registers, always available on arm64 KVM_REG_ARM_TIMER_CTL,
*/ KVM_REG_ARM_TIMER_CNT,
KVM_REG_ARM_TIMER_CVAL,
KVM_REG_ARM_PTIMER_CTL,
KVM_REG_ARM_PTIMER_CNT,
KVM_REG_ARM_PTIMER_CVAL,
};
#define NUM_TIMER_REGS 3 #define NUM_TIMER_REGS ARRAY_SIZE(timer_reg_list)
static bool is_timer_reg(u64 index) static bool is_timer_reg(u64 index)
{ {
...@@ -602,6 +607,9 @@ static bool is_timer_reg(u64 index) ...@@ -602,6 +607,9 @@ static bool is_timer_reg(u64 index)
case KVM_REG_ARM_TIMER_CTL: case KVM_REG_ARM_TIMER_CTL:
case KVM_REG_ARM_TIMER_CNT: case KVM_REG_ARM_TIMER_CNT:
case KVM_REG_ARM_TIMER_CVAL: case KVM_REG_ARM_TIMER_CVAL:
case KVM_REG_ARM_PTIMER_CTL:
case KVM_REG_ARM_PTIMER_CNT:
case KVM_REG_ARM_PTIMER_CVAL:
return true; return true;
} }
return false; return false;
...@@ -609,14 +617,11 @@ static bool is_timer_reg(u64 index) ...@@ -609,14 +617,11 @@ static bool is_timer_reg(u64 index)
static int copy_timer_indices(struct kvm_vcpu *vcpu, u64 __user *uindices) static int copy_timer_indices(struct kvm_vcpu *vcpu, u64 __user *uindices)
{ {
if (put_user(KVM_REG_ARM_TIMER_CTL, uindices)) for (int i = 0; i < NUM_TIMER_REGS; i++) {
return -EFAULT; if (put_user(timer_reg_list[i], uindices))
uindices++; return -EFAULT;
if (put_user(KVM_REG_ARM_TIMER_CNT, uindices)) uindices++;
return -EFAULT; }
uindices++;
if (put_user(KVM_REG_ARM_TIMER_CVAL, uindices))
return -EFAULT;
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment