|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v5 2/6] xen/arm: vgic-v2: Handle correctly byte write in ITARGETSR
On Mon, 9 Nov 2015, Julien Grall wrote:
> During a store, the byte is always in the low part of the register (i.e
> [0:7]).
>
> We are incorrectly masking the register by using a shift of the byte
> offset in the ITARGETSR while the byte is alwasy in r[0:7]. This will
> result in a target list equal to 0 which is ignored by the emulation.
>
> Because of that the guest will only be able to modify the first byte in
> each ITARGETSR.
>
> Furthermore, the body of the loop is retrieving the old target list
> using the index of the byte.
>
> To avoid modifying too much the loop, shift the byte stored to the correct
> offset.
>
> Signed-off-by: Julien Grall <julien.grall@xxxxxxxxxx>
Acked-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
> This change used to be embedded in "xen/arm: vgic: Optimize the way
> to store the target vCPU in the rank". It has been moved out to
> avoid having too much functional changes in a single patch.
>
> This patch is a good candidate to backport to Xen 4.6 and Xen 4.5.
> Without it a guest won't be able migrate an IRQ from one vCPU to
> another if it's using byte access to write in ITARGETSR.
>
> Note that if we backport this patch alone, the resulting code in
> earlier version of Xen will be complex to read. As the last patch
> of this serie should also be backported, I'm planning to request
> backport for the whole series.
>
> Changes in v5:
> - Update commit message based on Ian's suggestion
>
> Changes in v4:
> - Patch added
> ---
> xen/arch/arm/vgic-v2.c | 12 ++++++------
> 1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/xen/arch/arm/vgic-v2.c b/xen/arch/arm/vgic-v2.c
> index 041291c..486e497 100644
> --- a/xen/arch/arm/vgic-v2.c
> +++ b/xen/arch/arm/vgic-v2.c
> @@ -353,11 +353,11 @@ static int vgic_v2_distr_mmio_write(struct vcpu *v,
> mmio_info_t *info,
> /* 8-bit vcpu mask for this domain */
> BUG_ON(v->domain->max_vcpus > 8);
> target = (1 << v->domain->max_vcpus) - 1;
> - if ( dabt.size == 2 )
> - target = target | (target << 8) | (target << 16) | (target <<
> 24);
> + target = target | (target << 8) | (target << 16) | (target << 24);
> + if ( dabt.size == DABT_WORD )
> + target &= r;
> else
> - target = (target << (8 * (gicd_reg & 0x3)));
> - target &= r;
> + target &= (r << (8 * (gicd_reg & 0x3)));
> /* ignore zero writes */
> if ( !target )
> goto write_ignore;
> @@ -381,7 +381,7 @@ static int vgic_v2_distr_mmio_write(struct vcpu *v,
> mmio_info_t *info,
>
> if ( new_target != old_target )
> {
> - irq = gicd_reg - GICD_ITARGETSR + (i / 8);
> + irq = (gicd_reg & ~0x3) - GICD_ITARGETSR + (i / 8);
> v_target = v->domain->vcpu[new_target];
> v_old = v->domain->vcpu[old_target];
> vgic_migrate_irq(v_old, v_target, irq);
> @@ -393,7 +393,7 @@ static int vgic_v2_distr_mmio_write(struct vcpu *v,
> mmio_info_t *info,
> DABT_WORD)] = target;
> else
> vgic_byte_write(&rank->v2.itargets[REG_RANK_INDEX(8,
> - gicd_reg - GICD_ITARGETSR, DABT_WORD)], target,
> gicd_reg);
> + gicd_reg - GICD_ITARGETSR, DABT_WORD)], r, gicd_reg);
> vgic_unlock_rank(v, rank, flags);
> return 1;
> }
> --
> 2.1.4
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |