|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 1/4] xen/arm: observe itargets setting in vgic_enable_irqs and vgic_disable_irqs
On Sat, 7 Jun 2014, Julien Grall wrote:
> Hi Stefano,
>
> On 06/06/14 18:48, Stefano Stabellini wrote:
> > return 0;
> > }
> >
> > @@ -369,6 +377,22 @@ read_as_zero:
> > return 1;
> > }
> >
> > +struct vcpu *vgic_get_target_vcpu(struct vcpu *v, unsigned int irq)
> > +{
> > + int target;
> > + struct vgic_irq_rank *rank;
> > + struct vcpu *v_target;
> > +
> > + rank = vgic_irq_rank(v, 1, irq/32);
> > + vgic_lock_rank(v, rank);
> > + target = byte_read(rank->itargets[(irq%32)/4], 0, irq % 4);
> > + /* just return the first vcpu in the mask */
> > + target = find_next_bit((const unsigned long *) &target, 8, 0);
>
> int* and unsigned long* doesn't have the same alignment on aarch64. This may
> end up to a data abort for Xen side.
>
> IIRC, Ian has fixed a similar issue in commit 5224a733.
>
Well spotted! Thanks!
>
> > }
> > if ( p->desc != NULL )
> > {
> > @@ -502,6 +530,7 @@ static int vgic_distr_mmio_write(struct vcpu *v,
> > mmio_info_t *info)
> > int offset = (int)(info->gpa - v->domain->arch.vgic.dbase);
> > int gicd_reg = REG(offset);
> > uint32_t tr;
> > + int i;
> >
> > switch ( gicd_reg )
> > {
> > @@ -585,6 +614,21 @@ static int vgic_distr_mmio_write(struct vcpu *v,
> > mmio_info_t *info)
> > rank = vgic_irq_rank(v, 8, gicd_reg - GICD_ITARGETSR);
> > if ( rank == NULL) goto write_ignore;
> > vgic_lock_rank(v, rank);
> > + tr = *r & ~(rank->itargets[REG_RANK_INDEX(8, gicd_reg -
> > GICD_ITARGETSR)]);
>
> Write in GICD_ITARGETSR can be either half-word or word. If I'm not mistaken
> you sanity check only handle word access.
I realize that it is a bit tricky to read, but this works for both word
and half-word accesses.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |