[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 1/2] xen/arm: Introduce clean_and_invalidate_xen_dcache() macro
This macro is very similar to clean_xen_dcache(), but it performs clean and invalidate dcache. Also modify flush_page_to_ram() to call clean_and_invalidate_xen_dcache_va_range() function. Signed-off-by: Oleksandr Tyshchenko <oleksandr.tyshchenko@xxxxxxxxxxxxxxx> Reviewed-by: Julien Grall <julien.grall@xxxxxxxxxx> CC: Ian Campbell <ian.campbell@xxxxxxxxxx> --- xen/arch/arm/mm.c | 8 ++------ xen/include/asm-arm/page.h | 26 ++++++++++++++++++++++++-- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c index 308a798..544aa87 100644 --- a/xen/arch/arm/mm.c +++ b/xen/arch/arm/mm.c @@ -344,13 +344,9 @@ unsigned long domain_page_map_to_mfn(const void *ptr) void flush_page_to_ram(unsigned long mfn) { - void *p, *v = map_domain_page(mfn); - - dsb(); /* So the CPU issues all writes to the range */ - for ( p = v; p < v + PAGE_SIZE ; p += cacheline_bytes ) - asm volatile (__clean_and_invalidate_xen_dcache_one(0) : : "r" (p)); - dsb(); /* So we know the flushes happen before continuing */ + void *v = map_domain_page(mfn); + clean_and_invalidate_xen_dcache_va_range(v, PAGE_SIZE); unmap_domain_page(v); } diff --git a/xen/include/asm-arm/page.h b/xen/include/asm-arm/page.h index e00be9e..dfac003 100644 --- a/xen/include/asm-arm/page.h +++ b/xen/include/asm-arm/page.h @@ -226,7 +226,7 @@ static inline lpae_t mfn_to_xen_entry(unsigned long mfn) /* Actual cacheline size on the boot CPU. */ extern size_t cacheline_bytes; -/* Function for flushing medium-sized areas. +/* Functions for flushing medium-sized areas. * if 'range' is large enough we might want to use model-specific * full-cache flushes. */ static inline void clean_xen_dcache_va_range(void *p, unsigned long size) @@ -238,7 +238,17 @@ static inline void clean_xen_dcache_va_range(void *p, unsigned long size) dsb(); /* So we know the flushes happen before continuing */ } -/* Macro for flushing a single small item. The predicate is always +static inline void clean_and_invalidate_xen_dcache_va_range + (void *p, unsigned long size) +{ + void *end; + dsb(); /* So the CPU issues all writes to the range */ + for ( end = p + size; p < end; p += cacheline_bytes ) + asm volatile (__clean_and_invalidate_xen_dcache_one(0) : : "r" (p)); + dsb(); /* So we know the flushes happen before continuing */ +} + +/* Macros 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. */ #define clean_xen_dcache(x) do { \ @@ -253,6 +263,18 @@ static inline void clean_xen_dcache_va_range(void *p, unsigned long size) : : "r" (_p), "m" (*_p)); \ } while (0) +#define clean_and_invalidate_xen_dcache(x) do { \ + typeof(x) *_p = &(x); \ + if ( sizeof(x) > MIN_CACHELINE_BYTES || sizeof(x) > alignof(x) ) \ + clean_and_invalidate_xen_dcache_va_range(_p, sizeof(x)); \ + else \ + asm volatile ( \ + "dsb sy;" /* Finish all earlier writes */ \ + __clean_and_invalidate_xen_dcache_one(0) \ + "dsb sy;" /* Finish flush before continuing */ \ + : : "r" (_p), "m" (*_p)); \ +} while (0) + /* Flush the dcache for an entire page. */ void flush_page_to_ram(unsigned long mfn); -- 1.7.9.5 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |