[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3] xen/arm: flush D-cache and I-cache when appropriate
Sorry for the late review - I meant to get to these on Thursday but hadn't time. At 12:55 +0000 on 19 Nov (1353329757), Ian Campbell wrote: > > +/* Macro for flushing a single small item. The predicate is always > > + * compile-time constant so this will compile down to 3 instructions in > > + * the common case. This is no longer true! The predicate now depends on the alignment of the pointer, so this will compile to quite a bit of code, including the memory barrier I was trying to avoid. If we can sensibly restrict this to naturally-aligned objects smaller than a cacheline, we should go back to the previous version of this macro. If not, I think we might as well just use flush_xen_dcache_va_range(_p, sizeof *_p) and be done with it. Tim. > > Make sure to call it with the correct type of > > + * pointer! */ > > +#define flush_xen_dcache_va(p) do { \ > > + int cacheline_bytes = READ_CP32(CCSIDR); \ > > + typeof(p) _p = (p); \ > > + if ( ((unsigned long)_p & ~(cacheline_bytes - 1)) != \ > > + (((unsigned long)_p + (sizeof *_p)) & ~(cacheline_bytes - 1)) ) \ > > + flush_xen_dcache_va_range(_p, sizeof *_p); \ > > + else \ > > + asm volatile ( \ > > + "dsb;" /* Finish all earlier writes */ \ > > + STORE_CP32(0, DCCMVAC) \ > > + "dsb;" /* Finish flush before continuing */ \ > > + : : "r" (_p), "m" (*_p)); \ > > +} while (0) > > + > > + > > /* > > * Flush all hypervisor mappings from the TLB and branch predictor. > > - * This is needed after changing Xen code mappings. > > + * This is needed after changing Xen code mappings. > > + * > > + * The caller needs to issue the necessary DSB and D-cache flushes > > + * before calling flush_xen_text_tlb. > > */ > > static inline void flush_xen_text_tlb(void) > > { > > register unsigned long r0 asm ("r0"); > > asm volatile ( > > - "dsb;" /* Ensure visibility of PTE writes */ > > + "isb;" /* Ensure synchronization with > > previous changes to text */ > > STORE_CP32(0, TLBIALLH) /* Flush hypervisor TLB */ > > + STORE_CP32(0, ICIALLU) /* Flush I-cache */ > > STORE_CP32(0, BPIALL) /* Flush branch predictor */ > > "dsb;" /* Ensure completion of TLB+BP flush > > */ > > "isb;" > > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |