diff options
| author | Marc Zyngier <marc.zyngier@arm.com> | 2013-06-04 11:24:17 +0100 | 
|---|---|---|
| committer | Christoffer Dall <christoffer.dall@linaro.org> | 2014-07-11 04:57:33 -0700 | 
| commit | 909d9b5025f149af6cfc304a76ad6218e6622cc0 (patch) | |
| tree | d4d2f9fe3fb90ed5f98a1284f6312fc31f51071f /virt | |
| parent | 495dd859f304689a7cd5ef413c439cb090dc25e6 (diff) | |
| download | linux-909d9b5025f149af6cfc304a76ad6218e6622cc0.tar.bz2 | |
KVM: ARM: vgic: move underflow handling to vgic_ops
Move the code dealing with LR underflow handling to its own functions,
and make them accessible through vgic_ops.
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Reviewed-by: Christoffer Dall <christoffer.dall@linaro.org>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Diffstat (limited to 'virt')
| -rw-r--r-- | virt/kvm/arm/vgic.c | 28 | 
1 files changed, 25 insertions, 3 deletions
| diff --git a/virt/kvm/arm/vgic.c b/virt/kvm/arm/vgic.c index c0bcc9735424..6d618e0b08a1 100644 --- a/virt/kvm/arm/vgic.c +++ b/virt/kvm/arm/vgic.c @@ -1063,6 +1063,16 @@ static u32 vgic_v2_get_interrupt_status(const struct kvm_vcpu *vcpu)  	return ret;  } +static void vgic_v2_enable_underflow(struct kvm_vcpu *vcpu) +{ +	vcpu->arch.vgic_cpu.vgic_v2.vgic_hcr |= GICH_HCR_UIE; +} + +static void vgic_v2_disable_underflow(struct kvm_vcpu *vcpu) +{ +	vcpu->arch.vgic_cpu.vgic_v2.vgic_hcr &= ~GICH_HCR_UIE; +} +  static const struct vgic_ops vgic_ops = {  	.get_lr			= vgic_v2_get_lr,  	.set_lr			= vgic_v2_set_lr, @@ -1070,6 +1080,8 @@ static const struct vgic_ops vgic_ops = {  	.get_elrsr		= vgic_v2_get_elrsr,  	.get_eisr		= vgic_v2_get_eisr,  	.get_interrupt_status	= vgic_v2_get_interrupt_status, +	.enable_underflow	= vgic_v2_enable_underflow, +	.disable_underflow	= vgic_v2_disable_underflow,  };  static struct vgic_lr vgic_get_lr(const struct kvm_vcpu *vcpu, int lr) @@ -1104,6 +1116,16 @@ static inline u32 vgic_get_interrupt_status(struct kvm_vcpu *vcpu)  	return vgic_ops.get_interrupt_status(vcpu);  } +static inline void vgic_enable_underflow(struct kvm_vcpu *vcpu) +{ +	vgic_ops.enable_underflow(vcpu); +} + +static inline void vgic_disable_underflow(struct kvm_vcpu *vcpu) +{ +	vgic_ops.disable_underflow(vcpu); +} +  static void vgic_retire_lr(int lr_nr, int irq, struct kvm_vcpu *vcpu)  {  	struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic_cpu; @@ -1285,9 +1307,9 @@ static void __kvm_vgic_flush_hwstate(struct kvm_vcpu *vcpu)  epilog:  	if (overflow) { -		vgic_cpu->vgic_v2.vgic_hcr |= GICH_HCR_UIE; +		vgic_enable_underflow(vcpu);  	} else { -		vgic_cpu->vgic_v2.vgic_hcr &= ~GICH_HCR_UIE; +		vgic_disable_underflow(vcpu);  		/*  		 * We're about to run this VCPU, and we've consumed  		 * everything the distributor had in store for @@ -1340,7 +1362,7 @@ static bool vgic_process_maintenance(struct kvm_vcpu *vcpu)  	}  	if (status & INT_STATUS_UNDERFLOW) -		vgic_cpu->vgic_v2.vgic_hcr &= ~GICH_HCR_UIE; +		vgic_disable_underflow(vcpu);  	return level_pending;  } |