[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 1/2] xen: event channel arrays are xen_ulong_t and not unsigned long
On Fri, 2013-02-15 at 12:22 +0000, Stefano Stabellini wrote: > On Thu, 14 Feb 2013, Ian Campbell wrote: > > On ARM we want these to be the same size on 32- and 64-bit. > > > > This is an ABI change on ARM. X86 does not change. > > > > Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx> > > Cc: Jan Beulich <JBeulich@xxxxxxxx> > > Cc: Keir (Xen.org) <keir@xxxxxxx> > > Cc: Tim Deegan <tim@xxxxxxx> > > Cc: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> > > --- > > arch/arm/include/asm/xen/events.h | 22 +++++++++++ > > arch/x86/include/asm/xen/events.h | 2 + > > drivers/xen/events.c | 75 > > ++++++++++++++++++++---------------- > > include/xen/interface/xen.h | 8 ++-- > > 4 files changed, 70 insertions(+), 37 deletions(-) > > > > diff --git a/arch/arm/include/asm/xen/events.h > > b/arch/arm/include/asm/xen/events.h > > index 94b4e90..92dbb89 100644 > > --- a/arch/arm/include/asm/xen/events.h > > +++ b/arch/arm/include/asm/xen/events.h > > @@ -15,4 +15,26 @@ static inline int xen_irqs_disabled(struct pt_regs *regs) > > return raw_irqs_disabled_flags(regs->ARM_cpsr); > > } > > > > +/* > > + * We cannot use xchg because it does not support 8-byte > > + * values. However it is safe to use {ldr,dtd}exd directly because all > > + * platforms which Xen can run on support those instructions. > > + */ > > +static inline xen_ulong_t xen_read_evtchn_pending_sel(struct vcpu_info > > *vcpu_info) > > +{ > > + xen_ulong_t val; > > + unsigned int tmp; > > + > > + wmb(); > > + asm volatile("@ read_evtchn_pending_sel\n" > > + "1: ldrexd %0, %H0, [%3]\n" > > + " strexd %1, %2, %H2, [%3]\n" > > + " teq %1, #0\n" > > + " bne 1b" > > + : "=&r" (val), "=&r" (tmp) > > + : "r" (0), "r" (&vcpu_info->evtchn_pending_sel) > > + : "memory", "cc"); > > + return val; > > +} > > At this point we might as well introduce an xchg64, it is going to be > more useful to us in the future and to other non-Xen people too. The problem with that is the conditional nature of these instructions. We are guaranteed to have them because LPAE and/or the virtualisation extensions require them, but other ARMv7 implementations may not have this. > > static inline int test_evtchn(int port) > > { > > struct shared_info *s = HYPERVISOR_shared_info; > > - return sync_test_bit(port, &s->evtchn_pending[0]); > > + return sync_test_bit(port, BM(&s->evtchn_pending[0])); > > } > > > > Are you sure that the implementation of sync_test_bit, sync_set_bit, > etc, can cope with a bit > 32? > For example ____atomic_set_bit blatantly (bit & 31) at the beginning of > the function. I must confess I thought that these bit mask functions were designed to work on arbitrary sized bitmaps. I was so sure I didn't even check... static inline void ____atomic_set_bit(unsigned int bit, volatile unsigned long *p) { unsigned long flags; unsigned long mask = 1UL << (bit & 31); p += bit >> 5; raw_local_irq_save(flags); *p |= mask; raw_local_irq_restore(flags); } This is OK, it figures out the mask for the word containing @bit and then increments @p to point to that word. The other bit ops are similar. I think David V is right to be concerned about __ffs though, I'll need to investigate that one further. Ian. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |