All of lore.kernel.org
 help / color / mirror / Atom feed
From: christoffer.dall@linaro.org (Christoffer Dall)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 04/18] KVM: arm/arm64: vgic: move GICv2 registers to their own structure
Date: Mon, 3 Mar 2014 19:32:10 -0800	[thread overview]
Message-ID: <20140304033210.GA4509@lvm> (raw)
In-Reply-To: <1391607050-540-5-git-send-email-marc.zyngier@arm.com>

On Wed, Feb 05, 2014 at 01:30:36PM +0000, Marc Zyngier wrote:
> In order to make way for the GICv3 registers, move the v2-specific
> registers to their own structure.
> 
> Acked-by: Catalin Marinas <catalin.marinas@arm.com>
> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
> ---
>  arch/arm/kernel/asm-offsets.c   | 14 +++++------
>  arch/arm/kvm/interrupts_head.S  | 26 ++++++++++-----------
>  arch/arm64/kernel/asm-offsets.c | 14 +++++------
>  arch/arm64/kvm/hyp.S            | 26 ++++++++++-----------
>  include/kvm/arm_vgic.h          | 20 ++++++++++------
>  virt/kvm/arm/vgic.c             | 52 ++++++++++++++++++++---------------------
>  6 files changed, 79 insertions(+), 73 deletions(-)
> 
> diff --git a/arch/arm/kernel/asm-offsets.c b/arch/arm/kernel/asm-offsets.c
> index ded0417..dbe0476 100644
> --- a/arch/arm/kernel/asm-offsets.c
> +++ b/arch/arm/kernel/asm-offsets.c
> @@ -181,13 +181,13 @@ int main(void)
>    DEFINE(VCPU_HYP_PC,		offsetof(struct kvm_vcpu, arch.fault.hyp_pc));
>  #ifdef CONFIG_KVM_ARM_VGIC
>    DEFINE(VCPU_VGIC_CPU,		offsetof(struct kvm_vcpu, arch.vgic_cpu));
> -  DEFINE(VGIC_CPU_HCR,		offsetof(struct vgic_cpu, vgic_hcr));
> -  DEFINE(VGIC_CPU_VMCR,		offsetof(struct vgic_cpu, vgic_vmcr));
> -  DEFINE(VGIC_CPU_MISR,		offsetof(struct vgic_cpu, vgic_misr));
> -  DEFINE(VGIC_CPU_EISR,		offsetof(struct vgic_cpu, vgic_eisr));
> -  DEFINE(VGIC_CPU_ELRSR,	offsetof(struct vgic_cpu, vgic_elrsr));
> -  DEFINE(VGIC_CPU_APR,		offsetof(struct vgic_cpu, vgic_apr));
> -  DEFINE(VGIC_CPU_LR,		offsetof(struct vgic_cpu, vgic_lr));
> +  DEFINE(VGIC_V2_CPU_HCR,	offsetof(struct vgic_cpu, vgic_v2.vgic_hcr));
> +  DEFINE(VGIC_V2_CPU_VMCR,	offsetof(struct vgic_cpu, vgic_v2.vgic_vmcr));
> +  DEFINE(VGIC_V2_CPU_MISR,	offsetof(struct vgic_cpu, vgic_v2.vgic_misr));
> +  DEFINE(VGIC_V2_CPU_EISR,	offsetof(struct vgic_cpu, vgic_v2.vgic_eisr));
> +  DEFINE(VGIC_V2_CPU_ELRSR,	offsetof(struct vgic_cpu, vgic_v2.vgic_elrsr));
> +  DEFINE(VGIC_V2_CPU_APR,	offsetof(struct vgic_cpu, vgic_v2.vgic_apr));
> +  DEFINE(VGIC_V2_CPU_LR,	offsetof(struct vgic_cpu, vgic_v2.vgic_lr));
>    DEFINE(VGIC_CPU_NR_LR,	offsetof(struct vgic_cpu, nr_lr));
>  #ifdef CONFIG_KVM_ARM_TIMER
>    DEFINE(VCPU_TIMER_CNTV_CTL,	offsetof(struct kvm_vcpu, arch.timer_cpu.cntv_ctl));
> diff --git a/arch/arm/kvm/interrupts_head.S b/arch/arm/kvm/interrupts_head.S
> index 6f18695..4a2a97a 100644
> --- a/arch/arm/kvm/interrupts_head.S
> +++ b/arch/arm/kvm/interrupts_head.S
> @@ -413,14 +413,14 @@ vcpu	.req	r0		@ vcpu pointer always in r0
>  	ldr	r9, [r2, #GICH_ELRSR1]
>  	ldr	r10, [r2, #GICH_APR]
>  
> -	str	r3, [r11, #VGIC_CPU_HCR]
> -	str	r4, [r11, #VGIC_CPU_VMCR]
> -	str	r5, [r11, #VGIC_CPU_MISR]
> -	str	r6, [r11, #VGIC_CPU_EISR]
> -	str	r7, [r11, #(VGIC_CPU_EISR + 4)]
> -	str	r8, [r11, #VGIC_CPU_ELRSR]
> -	str	r9, [r11, #(VGIC_CPU_ELRSR + 4)]
> -	str	r10, [r11, #VGIC_CPU_APR]
> +	str	r3, [r11, #VGIC_V2_CPU_HCR]
> +	str	r4, [r11, #VGIC_V2_CPU_VMCR]
> +	str	r5, [r11, #VGIC_V2_CPU_MISR]
> +	str	r6, [r11, #VGIC_V2_CPU_EISR]
> +	str	r7, [r11, #(VGIC_V2_CPU_EISR + 4)]
> +	str	r8, [r11, #VGIC_V2_CPU_ELRSR]
> +	str	r9, [r11, #(VGIC_V2_CPU_ELRSR + 4)]
> +	str	r10, [r11, #VGIC_V2_CPU_APR]
>  
>  	/* Clear GICH_HCR */
>  	mov	r5, #0
> @@ -428,7 +428,7 @@ vcpu	.req	r0		@ vcpu pointer always in r0
>  
>  	/* Save list registers */
>  	add	r2, r2, #GICH_LR0
> -	add	r3, r11, #VGIC_CPU_LR
> +	add	r3, r11, #VGIC_V2_CPU_LR
>  	ldr	r4, [r11, #VGIC_CPU_NR_LR]
>  1:	ldr	r6, [r2], #4
>  	str	r6, [r3], #4
> @@ -455,9 +455,9 @@ vcpu	.req	r0		@ vcpu pointer always in r0
>  	add	r11, vcpu, #VCPU_VGIC_CPU
>  
>  	/* We only restore a minimal set of registers */
> -	ldr	r3, [r11, #VGIC_CPU_HCR]
> -	ldr	r4, [r11, #VGIC_CPU_VMCR]
> -	ldr	r8, [r11, #VGIC_CPU_APR]
> +	ldr	r3, [r11, #VGIC_V2_CPU_HCR]
> +	ldr	r4, [r11, #VGIC_V2_CPU_VMCR]
> +	ldr	r8, [r11, #VGIC_V2_CPU_APR]
>  
>  	str	r3, [r2, #GICH_HCR]
>  	str	r4, [r2, #GICH_VMCR]
> @@ -465,7 +465,7 @@ vcpu	.req	r0		@ vcpu pointer always in r0
>  
>  	/* Restore list registers */
>  	add	r2, r2, #GICH_LR0
> -	add	r3, r11, #VGIC_CPU_LR
> +	add	r3, r11, #VGIC_V2_CPU_LR
>  	ldr	r4, [r11, #VGIC_CPU_NR_LR]
>  1:	ldr	r6, [r3], #4
>  	str	r6, [r2], #4
> diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c
> index 646f888..20fd488 100644
> --- a/arch/arm64/kernel/asm-offsets.c
> +++ b/arch/arm64/kernel/asm-offsets.c
> @@ -129,13 +129,13 @@ int main(void)
>    DEFINE(KVM_TIMER_ENABLED,	offsetof(struct kvm, arch.timer.enabled));
>    DEFINE(VCPU_KVM,		offsetof(struct kvm_vcpu, kvm));
>    DEFINE(VCPU_VGIC_CPU,		offsetof(struct kvm_vcpu, arch.vgic_cpu));
> -  DEFINE(VGIC_CPU_HCR,		offsetof(struct vgic_cpu, vgic_hcr));
> -  DEFINE(VGIC_CPU_VMCR,		offsetof(struct vgic_cpu, vgic_vmcr));
> -  DEFINE(VGIC_CPU_MISR,		offsetof(struct vgic_cpu, vgic_misr));
> -  DEFINE(VGIC_CPU_EISR,		offsetof(struct vgic_cpu, vgic_eisr));
> -  DEFINE(VGIC_CPU_ELRSR,	offsetof(struct vgic_cpu, vgic_elrsr));
> -  DEFINE(VGIC_CPU_APR,		offsetof(struct vgic_cpu, vgic_apr));
> -  DEFINE(VGIC_CPU_LR,		offsetof(struct vgic_cpu, vgic_lr));
> +  DEFINE(VGIC_V2_CPU_HCR,	offsetof(struct vgic_cpu, vgic_v2.vgic_hcr));
> +  DEFINE(VGIC_V2_CPU_VMCR,	offsetof(struct vgic_cpu, vgic_v2.vgic_vmcr));
> +  DEFINE(VGIC_V2_CPU_MISR,	offsetof(struct vgic_cpu, vgic_v2.vgic_misr));
> +  DEFINE(VGIC_V2_CPU_EISR,	offsetof(struct vgic_cpu, vgic_v2.vgic_eisr));
> +  DEFINE(VGIC_V2_CPU_ELRSR,	offsetof(struct vgic_cpu, vgic_v2.vgic_elrsr));
> +  DEFINE(VGIC_V2_CPU_APR,	offsetof(struct vgic_cpu, vgic_v2.vgic_apr));
> +  DEFINE(VGIC_V2_CPU_LR,	offsetof(struct vgic_cpu, vgic_v2.vgic_lr));
>    DEFINE(VGIC_CPU_NR_LR,	offsetof(struct vgic_cpu, nr_lr));
>    DEFINE(KVM_VTTBR,		offsetof(struct kvm, arch.vttbr));
>    DEFINE(KVM_VGIC_VCTRL,	offsetof(struct kvm, arch.vgic.vctrl_base));
> diff --git a/arch/arm64/kvm/hyp.S b/arch/arm64/kvm/hyp.S
> index 3b47c36..c4c3a18 100644
> --- a/arch/arm64/kvm/hyp.S
> +++ b/arch/arm64/kvm/hyp.S
> @@ -412,14 +412,14 @@ CPU_BE(	rev	w9,  w9  )
>  CPU_BE(	rev	w10, w10 )
>  CPU_BE(	rev	w11, w11 )
>  
> -	str	w4, [x3, #VGIC_CPU_HCR]
> -	str	w5, [x3, #VGIC_CPU_VMCR]
> -	str	w6, [x3, #VGIC_CPU_MISR]
> -	str	w7, [x3, #VGIC_CPU_EISR]
> -	str	w8, [x3, #(VGIC_CPU_EISR + 4)]
> -	str	w9, [x3, #VGIC_CPU_ELRSR]
> -	str	w10, [x3, #(VGIC_CPU_ELRSR + 4)]
> -	str	w11, [x3, #VGIC_CPU_APR]
> +	str	w4, [x3, #VGIC_V2_CPU_HCR]
> +	str	w5, [x3, #VGIC_V2_CPU_VMCR]
> +	str	w6, [x3, #VGIC_V2_CPU_MISR]
> +	str	w7, [x3, #VGIC_V2_CPU_EISR]
> +	str	w8, [x3, #(VGIC_V2_CPU_EISR + 4)]
> +	str	w9, [x3, #VGIC_V2_CPU_ELRSR]
> +	str	w10, [x3, #(VGIC_V2_CPU_ELRSR + 4)]
> +	str	w11, [x3, #VGIC_V2_CPU_APR]
>  
>  	/* Clear GICH_HCR */
>  	str	wzr, [x2, #GICH_HCR]
> @@ -427,7 +427,7 @@ CPU_BE(	rev	w11, w11 )
>  	/* Save list registers */
>  	add	x2, x2, #GICH_LR0
>  	ldr	w4, [x3, #VGIC_CPU_NR_LR]
> -	add	x3, x3, #VGIC_CPU_LR
> +	add	x3, x3, #VGIC_V2_CPU_LR
>  1:	ldr	w5, [x2], #4
>  CPU_BE(	rev	w5, w5 )
>  	str	w5, [x3], #4
> @@ -452,9 +452,9 @@ CPU_BE(	rev	w5, w5 )
>  	add	x3, x0, #VCPU_VGIC_CPU
>  
>  	/* We only restore a minimal set of registers */
> -	ldr	w4, [x3, #VGIC_CPU_HCR]
> -	ldr	w5, [x3, #VGIC_CPU_VMCR]
> -	ldr	w6, [x3, #VGIC_CPU_APR]
> +	ldr	w4, [x3, #VGIC_V2_CPU_HCR]
> +	ldr	w5, [x3, #VGIC_V2_CPU_VMCR]
> +	ldr	w6, [x3, #VGIC_V2_CPU_APR]
>  CPU_BE(	rev	w4, w4 )
>  CPU_BE(	rev	w5, w5 )
>  CPU_BE(	rev	w6, w6 )
> @@ -466,7 +466,7 @@ CPU_BE(	rev	w6, w6 )
>  	/* Restore list registers */
>  	add	x2, x2, #GICH_LR0
>  	ldr	w4, [x3, #VGIC_CPU_NR_LR]
> -	add	x3, x3, #VGIC_CPU_LR
> +	add	x3, x3, #VGIC_V2_CPU_LR
>  1:	ldr	w5, [x3], #4
>  CPU_BE(	rev	w5, w5 )
>  	str	w5, [x2], #4
> diff --git a/include/kvm/arm_vgic.h b/include/kvm/arm_vgic.h
> index be85127..066f7d6 100644
> --- a/include/kvm/arm_vgic.h
> +++ b/include/kvm/arm_vgic.h
> @@ -110,6 +110,16 @@ struct vgic_dist {
>  #endif
>  };
>  
> +struct vgic_v2_cpu_if {
> +	u32		vgic_hcr;
> +	u32		vgic_vmcr;
> +	u32		vgic_misr;	/* Saved only */
> +	u32		vgic_eisr[2];	/* Saved only */
> +	u32		vgic_elrsr[2];	/* Saved only */
> +	u32		vgic_apr;
> +	u32		vgic_lr[VGIC_MAX_LRS];
> +};
> +
>  struct vgic_cpu {
>  #ifdef CONFIG_KVM_ARM_VGIC
>  	/* per IRQ to LR mapping */
> @@ -126,13 +136,9 @@ struct vgic_cpu {
>  	int		nr_lr;
>  
>  	/* CPU vif control registers for world switch */
> -	u32		vgic_hcr;
> -	u32		vgic_vmcr;
> -	u32		vgic_misr;	/* Saved only */
> -	u32		vgic_eisr[2];	/* Saved only */
> -	u32		vgic_elrsr[2];	/* Saved only */
> -	u32		vgic_apr;
> -	u32		vgic_lr[VGIC_MAX_LRS];
> +	union {
> +		struct vgic_v2_cpu_if	vgic_v2;
> +	};
>  #endif
>  };
>  
> diff --git a/virt/kvm/arm/vgic.c b/virt/kvm/arm/vgic.c
> index 8ca405c..fdc2696 100644
> --- a/virt/kvm/arm/vgic.c
> +++ b/virt/kvm/arm/vgic.c
> @@ -602,7 +602,7 @@ static bool handle_mmio_sgi_reg(struct kvm_vcpu *vcpu,
>  static void vgic_retire_lr(int lr_nr, int irq, struct vgic_cpu *vgic_cpu)
>  {
>  	clear_bit(lr_nr, vgic_cpu->lr_used);
> -	vgic_cpu->vgic_lr[lr_nr] &= ~GICH_LR_STATE;
> +	vgic_cpu->vgic_v2.vgic_lr[lr] &= ~GICH_LR_STATE;

lr_nr, this breaks bisectability

>  	vgic_cpu->vgic_irq_lr_map[irq] = LR_EMPTY;
>  }
>  
> @@ -1007,7 +1007,7 @@ static void vgic_retire_disabled_irqs(struct kvm_vcpu *vcpu)
>  	int lr;
>  
>  	for_each_set_bit(lr, vgic_cpu->lr_used, vgic_cpu->nr_lr) {
> -		int irq = vgic_cpu->vgic_lr[lr] & GICH_LR_VIRTUALID;
> +		int irq = vgic_cpu->vgic_v2.vgic_lr[lr] & GICH_LR_VIRTUALID;
>  
>  		if (!vgic_irq_is_enabled(vcpu, irq)) {
>  			vgic_retire_lr(lr, irq, vgic_cpu);
> @@ -1037,11 +1037,11 @@ static bool vgic_queue_irq(struct kvm_vcpu *vcpu, u8 sgi_source_id, int irq)
>  
>  	/* Do we have an active interrupt for the same CPUID? */
>  	if (lr != LR_EMPTY &&
> -	    (LR_CPUID(vgic_cpu->vgic_lr[lr]) == sgi_source_id)) {
> +	    (LR_CPUID(vgic_cpu->vgic_v2.vgic_lr[lr]) == sgi_source_id)) {
>  		kvm_debug("LR%d piggyback for IRQ%d %x\n",
> -			  lr, irq, vgic_cpu->vgic_lr[lr]);
> +			  lr, irq, vgic_cpu->vgic_v2.vgic_lr[lr]);
>  		BUG_ON(!test_bit(lr, vgic_cpu->lr_used));
> -		vgic_cpu->vgic_lr[lr] |= GICH_LR_PENDING_BIT;
> +		vgic_cpu->vgic_v2.vgic_lr[lr] |= GICH_LR_PENDING_BIT;
>  		return true;
>  	}
>  
> @@ -1052,12 +1052,12 @@ static bool vgic_queue_irq(struct kvm_vcpu *vcpu, u8 sgi_source_id, int irq)
>  		return false;
>  
>  	kvm_debug("LR%d allocated for IRQ%d %x\n", lr, irq, sgi_source_id);
> -	vgic_cpu->vgic_lr[lr] = MK_LR_PEND(sgi_source_id, irq);
> +	vgic_cpu->vgic_v2.vgic_lr[lr] = MK_LR_PEND(sgi_source_id, irq);
>  	vgic_cpu->vgic_irq_lr_map[irq] = lr;
>  	set_bit(lr, vgic_cpu->lr_used);
>  
>  	if (!vgic_irq_is_edge(vcpu, irq))
> -		vgic_cpu->vgic_lr[lr] |= GICH_LR_EOI;
> +		vgic_cpu->vgic_v2.vgic_lr[lr] |= GICH_LR_EOI;
>  
>  	return true;
>  }
> @@ -1155,9 +1155,9 @@ static void __kvm_vgic_flush_hwstate(struct kvm_vcpu *vcpu)
>  
>  epilog:
>  	if (overflow) {
> -		vgic_cpu->vgic_hcr |= GICH_HCR_UIE;
> +		vgic_cpu->vgic_v2.vgic_hcr |= GICH_HCR_UIE;
>  	} else {
> -		vgic_cpu->vgic_hcr &= ~GICH_HCR_UIE;
> +		vgic_cpu->vgic_v2.vgic_hcr &= ~GICH_HCR_UIE;
>  		/*
>  		 * We're about to run this VCPU, and we've consumed
>  		 * everything the distributor had in store for
> @@ -1173,21 +1173,21 @@ static bool vgic_process_maintenance(struct kvm_vcpu *vcpu)
>  	struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic_cpu;
>  	bool level_pending = false;
>  
> -	kvm_debug("MISR = %08x\n", vgic_cpu->vgic_misr);
> +	kvm_debug("MISR = %08x\n", vgic_cpu->vgic_v2.vgic_misr);
>  
> -	if (vgic_cpu->vgic_misr & GICH_MISR_EOI) {
> +	if (vgic_cpu->vgic_v2.vgic_misr & GICH_MISR_EOI) {
>  		/*
>  		 * Some level interrupts have been EOIed. Clear their
>  		 * active bit.
>  		 */
>  		int lr, irq;
>  
> -		for_each_set_bit(lr, (unsigned long *)vgic_cpu->vgic_eisr,
> +		for_each_set_bit(lr, (unsigned long *)vgic_cpu->vgic_v2.vgic_eisr,
>  				 vgic_cpu->nr_lr) {
> -			irq = vgic_cpu->vgic_lr[lr] & GICH_LR_VIRTUALID;
> +			irq = vgic_cpu->vgic_v2.vgic_lr[lr] & GICH_LR_VIRTUALID;
>  
>  			vgic_irq_clear_active(vcpu, irq);
> -			vgic_cpu->vgic_lr[lr] &= ~GICH_LR_EOI;
> +			vgic_cpu->vgic_v2.vgic_lr[lr] &= ~GICH_LR_EOI;
>  
>  			/* Any additional pending interrupt? */
>  			if (vgic_dist_irq_is_pending(vcpu, irq)) {
> @@ -1201,13 +1201,13 @@ static bool vgic_process_maintenance(struct kvm_vcpu *vcpu)
>  			 * Despite being EOIed, the LR may not have
>  			 * been marked as empty.
>  			 */
> -			set_bit(lr, (unsigned long *)vgic_cpu->vgic_elrsr);
> -			vgic_cpu->vgic_lr[lr] &= ~GICH_LR_ACTIVE_BIT;
> +			set_bit(lr, (unsigned long *)vgic_cpu->vgic_v2.vgic_elrsr);
> +			vgic_cpu->vgic_v2.vgic_lr[lr] &= ~GICH_LR_ACTIVE_BIT;
>  		}
>  	}
>  
> -	if (vgic_cpu->vgic_misr & GICH_MISR_U)
> -		vgic_cpu->vgic_hcr &= ~GICH_HCR_UIE;
> +	if (vgic_cpu->vgic_v2.vgic_misr & GICH_MISR_U)
> +		vgic_cpu->vgic_v2.vgic_hcr &= ~GICH_HCR_UIE;
>  
>  	return level_pending;
>  }
> @@ -1226,21 +1226,21 @@ static void __kvm_vgic_sync_hwstate(struct kvm_vcpu *vcpu)
>  	level_pending = vgic_process_maintenance(vcpu);
>  
>  	/* Clear mappings for empty LRs */
> -	for_each_set_bit(lr, (unsigned long *)vgic_cpu->vgic_elrsr,
> +	for_each_set_bit(lr, (unsigned long *)vgic_cpu->vgic_v2.vgic_elrsr,
>  			 vgic_cpu->nr_lr) {
>  		int irq;
>  
>  		if (!test_and_clear_bit(lr, vgic_cpu->lr_used))
>  			continue;
>  
> -		irq = vgic_cpu->vgic_lr[lr] & GICH_LR_VIRTUALID;
> +		irq = vgic_cpu->vgic_v2.vgic_lr[lr] & GICH_LR_VIRTUALID;
>  
>  		BUG_ON(irq >= VGIC_NR_IRQS);
>  		vgic_cpu->vgic_irq_lr_map[irq] = LR_EMPTY;
>  	}
>  
>  	/* Check if we still have something up our sleeve... */
> -	pending = find_first_zero_bit((unsigned long *)vgic_cpu->vgic_elrsr,
> +	pending = find_first_zero_bit((unsigned long *)vgic_cpu->vgic_v2.vgic_elrsr,
>  				      vgic_cpu->nr_lr);
>  	if (level_pending || pending < vgic_cpu->nr_lr)
>  		set_bit(vcpu->vcpu_id, &dist->irq_pending_on_cpu);
> @@ -1436,10 +1436,10 @@ int kvm_vgic_vcpu_init(struct kvm_vcpu *vcpu)
>  	 * points to their reset values. Anything else resets to zero
>  	 * anyway.
>  	 */
> -	vgic_cpu->vgic_vmcr = 0;
> +	vgic_cpu->vgic_v2.vgic_vmcr = 0;
>  
>  	vgic_cpu->nr_lr = vgic_nr_lr;
> -	vgic_cpu->vgic_hcr = GICH_HCR_EN; /* Get the show on the road... */
> +	vgic_cpu->vgic_v2.vgic_hcr = GICH_HCR_EN; /* Get the show on the road... */
>  
>  	return 0;
>  }
> @@ -1745,15 +1745,15 @@ static bool handle_cpu_mmio_misc(struct kvm_vcpu *vcpu,
>  	}
>  
>  	if (!mmio->is_write) {
> -		reg = (vgic_cpu->vgic_vmcr & mask) >> shift;
> +		reg = (vgic_cpu->vgic_v2.vgic_vmcr & mask) >> shift;
>  		mmio_data_write(mmio, ~0, reg);
>  	} else {
>  		reg = mmio_data_read(mmio, ~0);
>  		reg = (reg << shift) & mask;
>  		if (reg != (vgic_cpu->vgic_vmcr & mask))

You forgot one here

>  			updated = true;
> -		vgic_cpu->vgic_vmcr &= ~mask;
> -		vgic_cpu->vgic_vmcr |= reg;
> +		vgic_cpu->vgic_v2.vgic_vmcr &= ~mask;
> +		vgic_cpu->vgic_v2.vgic_vmcr |= reg;
>  	}
>  	return updated;
>  }
> -- 
> 1.8.3.4
> 

I think you also left one out in vgic_unqueue_irqs.

  reply	other threads:[~2014-03-04  3:32 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-05 13:30 [PATCH 00/18] arm64: GICv3 support Marc Zyngier
2014-02-05 13:30 ` [PATCH 01/18] arm64: initial support for GICv3 Marc Zyngier
2014-02-07  8:59   ` Arnab Basu
2014-02-07 13:52     ` Christopher Covington
2014-02-13 15:28     ` Marc Zyngier
2014-02-17  1:19   ` Christoffer Dall
2014-02-17 16:41     ` Marc Zyngier
2014-02-17 18:10       ` Christoffer Dall
2014-02-25 18:06   ` Will Deacon
2014-02-26 12:53     ` Marc Zyngier
2014-02-27 12:07       ` Will Deacon
2014-03-15 15:22         ` Radha Mohan
2014-02-05 13:30 ` [PATCH 02/18] arm64: GICv3 device tree binding documentation Marc Zyngier
2014-02-07  5:41   ` Arnab Basu
2014-02-13 12:59     ` Marc Zyngier
2014-02-13 13:27       ` Rob Herring
2014-02-13 13:26   ` Rob Herring
2014-02-13 14:00     ` Marc Zyngier
2014-02-17  1:21   ` Christoffer Dall
2014-02-17 16:57     ` Marc Zyngier
2014-02-05 13:30 ` [PATCH 03/18] arm64: boot protocol documentation update for GICv3 Marc Zyngier
2014-02-05 15:03   ` Catalin Marinas
2014-02-25 18:06   ` Will Deacon
2014-02-26 14:37     ` Marc Zyngier
2014-02-26 15:31       ` Will Deacon
2014-02-26 15:59         ` Marc Zyngier
2014-02-26 16:01           ` Will Deacon
2014-02-05 13:30 ` [PATCH 04/18] KVM: arm/arm64: vgic: move GICv2 registers to their own structure Marc Zyngier
2014-03-04  3:32   ` Christoffer Dall [this message]
2014-02-05 13:30 ` [PATCH 05/18] KVM: ARM: vgic: introduce vgic_ops and LR manipulation primitives Marc Zyngier
2014-02-05 13:30 ` [PATCH 06/18] KVM: ARM: vgic: abstract access to the ELRSR bitmap Marc Zyngier
2014-02-05 13:30 ` [PATCH 07/18] KVM: ARM: vgic: abstract EISR bitmap access Marc Zyngier
2014-02-05 13:30 ` [PATCH 08/18] KVM: ARM: vgic: abstract MISR decoding Marc Zyngier
2014-02-05 13:30 ` [PATCH 09/18] KVM: ARM: vgic: move underflow handling to vgic_ops Marc Zyngier
2014-02-05 13:30 ` [PATCH 10/18] KVM: ARM: vgic: abstract VMCR access Marc Zyngier
2014-02-05 13:30 ` [PATCH 11/18] KVM: ARM: vgic: introduce vgic_enable Marc Zyngier
2014-02-05 13:30 ` [PATCH 12/18] KVM: ARM: introduce vgic_params structure Marc Zyngier
2014-02-05 13:30 ` [PATCH 13/18] KVM: ARM: vgic: split GICv2 backend from the main vgic code Marc Zyngier
2014-02-05 13:30 ` [PATCH 14/18] arm64: KVM: remove __kvm_hyp_code_{start, end} from hyp.S Marc Zyngier
2014-02-05 13:30 ` [PATCH 15/18] arm64: KVM: split GICv2 world switch from hyp code Marc Zyngier
2014-02-25 18:07   ` Will Deacon
2014-02-05 13:30 ` [PATCH 16/18] arm64: KVM: move hcr_el2 setting into vgic-v2-switch.S Marc Zyngier
2014-02-05 13:30 ` [PATCH 17/18] KVM: ARM: vgic: add the GICv3 backend Marc Zyngier
2014-02-25 18:07   ` Will Deacon
2014-02-26 18:18     ` Marc Zyngier
2014-02-27 12:12       ` Will Deacon
2014-02-05 13:30 ` [PATCH 18/18] arm64: KVM: vgic: add GICv3 world switch Marc Zyngier
2014-02-25 18:08   ` Will Deacon
2014-02-26 18:06     ` Marc Zyngier

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20140304033210.GA4509@lvm \
    --to=christoffer.dall@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.