diff options
Diffstat (limited to 'include/kvm/arm_arch_timer.h')
| -rw-r--r-- | include/kvm/arm_arch_timer.h | 24 | 
1 files changed, 16 insertions, 8 deletions
diff --git a/include/kvm/arm_arch_timer.h b/include/kvm/arm_arch_timer.h index 681cf0c8b9df..7310841f4512 100644 --- a/include/kvm/arm_arch_timer.h +++ b/include/kvm/arm_arch_timer.h @@ -51,8 +51,6 @@ struct arch_timer_vm_data {  };  struct arch_timer_context { -	struct kvm_vcpu			*vcpu; -  	/* Emulated Timer (may be unused) */  	struct hrtimer			hrtimer;  	u64				ns_frac; @@ -71,6 +69,9 @@ struct arch_timer_context {  		bool			level;  	} irq; +	/* Who am I? */ +	enum kvm_arch_timers		timer_id; +  	/* Duplicated state from arch_timer.c for convenience */  	u32				host_timer_irq;  }; @@ -106,9 +107,6 @@ void kvm_timer_vcpu_terminate(struct kvm_vcpu *vcpu);  void kvm_timer_init_vm(struct kvm *kvm); -u64 kvm_arm_timer_get_reg(struct kvm_vcpu *, u64 regid); -int kvm_arm_timer_set_reg(struct kvm_vcpu *, u64 regid, u64 value); -  int kvm_arm_timer_set_attr(struct kvm_vcpu *vcpu, struct kvm_device_attr *attr);  int kvm_arm_timer_get_attr(struct kvm_vcpu *vcpu, struct kvm_device_attr *attr);  int kvm_arm_timer_has_attr(struct kvm_vcpu *vcpu, struct kvm_device_attr *attr); @@ -127,9 +125,9 @@ void kvm_timer_init_vhe(void);  #define vcpu_hvtimer(v)	(&(v)->arch.timer_cpu.timers[TIMER_HVTIMER])  #define vcpu_hptimer(v)	(&(v)->arch.timer_cpu.timers[TIMER_HPTIMER]) -#define arch_timer_ctx_index(ctx)	((ctx) - vcpu_timer((ctx)->vcpu)->timers) - -#define timer_vm_data(ctx)		(&(ctx)->vcpu->kvm->arch.timer_data) +#define arch_timer_ctx_index(ctx)	((ctx)->timer_id) +#define timer_context_to_vcpu(ctx)	container_of((ctx), struct kvm_vcpu, arch.timer_cpu.timers[(ctx)->timer_id]) +#define timer_vm_data(ctx)		(&(timer_context_to_vcpu(ctx)->kvm->arch.timer_data))  #define timer_irq(ctx)			(timer_vm_data(ctx)->ppi[arch_timer_ctx_index(ctx)])  u64 kvm_arm_timer_read_sysreg(struct kvm_vcpu *vcpu, @@ -178,4 +176,14 @@ static inline u64 timer_get_offset(struct arch_timer_context *ctxt)  	return offset;  } +static inline void timer_set_offset(struct arch_timer_context *ctxt, u64 offset) +{ +	if (!ctxt->offset.vm_offset) { +		WARN(offset, "timer %d\n", arch_timer_ctx_index(ctxt)); +		return; +	} + +	WRITE_ONCE(*ctxt->offset.vm_offset, offset); +} +  #endif  | 
