diff options
Diffstat (limited to 'include/kvm/arm_arch_timer.h')
| -rw-r--r-- | include/kvm/arm_arch_timer.h | 49 | 
1 files changed, 43 insertions, 6 deletions
diff --git a/include/kvm/arm_arch_timer.h b/include/kvm/arm_arch_timer.h index 71916de7c6c4..bb3cb005873e 100644 --- a/include/kvm/arm_arch_timer.h +++ b/include/kvm/arm_arch_timer.h @@ -13,6 +13,9 @@  enum kvm_arch_timers {  	TIMER_PTIMER,  	TIMER_VTIMER, +	NR_KVM_EL0_TIMERS, +	TIMER_HVTIMER = NR_KVM_EL0_TIMERS, +	TIMER_HPTIMER,  	NR_KVM_TIMERS  }; @@ -21,17 +24,41 @@ enum kvm_arch_timer_regs {  	TIMER_REG_CVAL,  	TIMER_REG_TVAL,  	TIMER_REG_CTL, +	TIMER_REG_VOFF, +}; + +struct arch_timer_offset { +	/* +	 * If set, pointer to one of the offsets in the kvm's offset +	 * structure. If NULL, assume a zero offset. +	 */ +	u64	*vm_offset; +	/* +	 * If set, pointer to one of the offsets in the vcpu's sysreg +	 * array. If NULL, assume a zero offset. +	 */ +	u64	*vcpu_offset; +}; + +struct arch_timer_vm_data { +	/* Offset applied to the virtual timer/counter */ +	u64	voffset; +	/* Offset applied to the physical timer/counter */ +	u64	poffset; + +	/* The PPI for each timer, global to the VM */ +	u8	ppi[NR_KVM_TIMERS];  };  struct arch_timer_context {  	struct kvm_vcpu			*vcpu; -	/* Timer IRQ */ -	struct kvm_irq_level		irq; -  	/* Emulated Timer (may be unused) */  	struct hrtimer			hrtimer; +	u64				ns_frac; +	/* Offset for this counter/timer */ +	struct arch_timer_offset	offset;  	/*  	 * We have multiple paths which can save/restore the timer state onto  	 * the hardware, so we need some way of keeping track of where the @@ -39,14 +66,19 @@ struct arch_timer_context {  	 */  	bool				loaded; +	/* Output level of the timer IRQ */ +	struct { +		bool			level; +	} irq; +  	/* Duplicated state from arch_timer.c for convenience */  	u32				host_timer_irq; -	u32				host_timer_irq_flags;  };  struct timer_map {  	struct arch_timer_context *direct_vtimer;  	struct arch_timer_context *direct_ptimer; +	struct arch_timer_context *emul_vtimer;  	struct arch_timer_context *emul_ptimer;  }; @@ -69,6 +101,8 @@ bool kvm_timer_should_notify_user(struct kvm_vcpu *vcpu);  void kvm_timer_update_run(struct kvm_vcpu *vcpu);  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); @@ -83,15 +117,18 @@ void kvm_timer_vcpu_put(struct kvm_vcpu *vcpu);  void kvm_timer_init_vhe(void); -bool kvm_arch_timer_get_input_level(int vintid); -  #define vcpu_timer(v)	(&(v)->arch.timer_cpu)  #define vcpu_get_timer(v,t)	(&vcpu_timer(v)->timers[(t)])  #define vcpu_vtimer(v)	(&(v)->arch.timer_cpu.timers[TIMER_VTIMER])  #define vcpu_ptimer(v)	(&(v)->arch.timer_cpu.timers[TIMER_PTIMER]) +#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 timer_irq(ctx)			(timer_vm_data(ctx)->ppi[arch_timer_ctx_index(ctx)]) +  u64 kvm_arm_timer_read_sysreg(struct kvm_vcpu *vcpu,  			      enum kvm_arch_timers tmr,  			      enum kvm_arch_timer_regs treg);  |