[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v1 3/8] xen/arm: Support sign-extension for every read access
On Fri, 2015-09-25 at 15:51 +0100, Julien Grall wrote: > The guest may try to load data from the emulated MMIO region using > instruction with Sign-Extension (i.e ldrs*). This can happen for any > access smaller than the register size (byte/half-word for aarch32, > byte/half-word/word for aarch64). > > The support of sign-extension was limited for byte access in vGIG "vGIC" > emulation. Although there is no reason to not have it generically. > > So move the support just after we get the data from the MMIO emulation. > > Signed-off-by: Julien Grall <julien.grall@xxxxxxxxxx> > > --- > > I was thinking to completely drop the sign-extension support in Xen as > it will be very unlikely to use ldrs* instruction to access MMIO. > Although the code is fairly small, so it doesn't harm to keep it > generically. Yes, I think we should keep it, since we don't control what instructions are used to access MMIO, however unlikely... > Changes in v2: > - Patch added > --- > xen/arch/arm/io.c | 29 ++++++++++++++++++++++++++++- > xen/arch/arm/vgic-v2.c | 10 +++++----- > xen/arch/arm/vgic-v3.c | 4 ++-- > xen/include/asm-arm/vgic.h | 8 +++----- > 4 files changed, 38 insertions(+), 13 deletions(-) > > diff --git a/xen/arch/arm/io.c b/xen/arch/arm/io.c > index 32b2194..e1b03a2 100644 > --- a/xen/arch/arm/io.c > +++ b/xen/arch/arm/io.c > @@ -23,6 +23,32 @@ > #include <asm/current.h> > #include <asm/mmio.h> > > +static int handle_read(mmio_read_t read_cb, struct vcpu *v, > + mmio_info_t *info, register_t *r) > +{ > + uint8_t size = (1 << info->dabt.size) * 8; > + > + if ( !read_cb(v, info, r) ) > + return 0; > + > + /* > + * Extend the bit sign if required. I think you meant s/bit sign/sign bit/ but more correct would be "Sign extend if required". > + * Note that we expect the read handler to have zeroed the bit > + * unused in the register. "... to have zeroed the unused bits in the register". But I think "unused" is a bit misleading, you mean the ones outside the requested access size, those bits are still "used" IYSWIM. I can't think of a terse term for "outside the requested access size I'm afraid. Did you confirm that all existing handlers meet this requirement? Perhaps an ASSERT would be handy? > + */ > + if ( info->dabt.sign && (*r & (1UL << (size - 1)) )) > + { > + /* > + * We are relying on register_t as the same size as > + * an unsigned long or order to keep the 32bit some smaller "order"? I'm not sure what you meant here so I can't suggest an alternative. > + */ > + BUILD_BUG_ON(sizeof(register_t) != sizeof(unsigned long)); > + *r |= (~0UL) << size; I think here and in the initial if you need to be careful of the case where size == 32 (on arm32) or == 64 (on arm64), since a shift by >= the size of the variable is, I think, undefined behaviour. It's also a waste of time sign extending in that case. Ian. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |