[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v4 1/5] xen/arm: vgic-v2: Handle correctly byte write in ITARGETSR



On Thu, 2015-10-22 at 17:36 +0100, Julien Grall wrote:
> Hi Ian,
> 
> On 22/10/15 16:53, Ian Campbell wrote:
> > On Mon, 2015-10-12 at 15:22 +0100, Julien Grall wrote:
> > 
> > Subject: "correctly handle" and "writes"
> > 
> > > During a store, the byte is always in the low part of the register
> > > (i.e
> > > [0:7]).
> > > 
> > > Although, we are masking the register by using a shift of the
> > > byte offset in the ITARGETSR. This will result to get a target list
> > > equal to 0 which is ignored by the emulation.
> > 
> > I'm afraid I can't parse this.
> > 
> > I think instead of "Although" you might mean "incorrectly" as in "we
> > are
> > incorrectly...", but that would really then want the sentence to end
> > "instead of <the right thing>". So perhaps:
> > 
> >     We are incorrectly masking the register by using a shift of the
> > byte
> >     offset in the ITARGETSR instead of <...something...>. This will
> > result
> >     in a target list equal to 0 which is ignored by the emulation.
> 
> Rather than "instead of..." what about "while the byte is always in
> r[0:7]"?

Yes, I think that's ok.


> > > 
> > > 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.
> > 
> > That might have meant a smaller patch, but it's a lot harder to
> > understand
> > either the result or the diff.
> 
> The size of the patch would have been the same. Although, it requires to
> modify the call to vgic_byte_read in the loop to access the correct
> interrupt.
> 
> I didn't try to spend to much time to modify the loop because the
> follow-up patch (#2) will rewrite the loop.

Since this patch is marked for backport then if we decided to take #2 then
that's probably ok, otherwise the state of the tree after just this patch
is more relevant.

That's in itself probably a stronger argument for taking #2 than the actual
functionality of #2 is.


> 
> [...]
> 
> > >  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 2d63e12..665afeb 100644
> > > --- a/xen/arch/arm/vgic-v2.c
> > > +++ b/xen/arch/arm/vgic-v2.c
> > > @@ -346,11 +346,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)));
> > 
> > At this point do you not now have 3 bytes of
> >     (1 << v->domain->max_vcpus) - 1;
> > and 1 byte of that masked with the write?
> > 
> > IOW isn't this modifying the 3 bytes which aren't written?
> 
> No, the current loop search for bit set to 1. As the target variable
> will only contain one byte with some bit set to 1, only the IRQ
> associated to this byte will be updated.

Um, OK, I'll take your word for that.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.