mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
xen: arm64: dcache flush
Use "dsb sy" instead of bare "dsb", they mean the same on 32-bit but only the former is valid on 64-bit. Abstract the actual flush operation into a macro. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> Acked-by: Tim Deegan <tim@xen.org>
This commit is contained in:
1 parent
1024642c62
commit
fac508273d
3 files changed
+10
-4
No files matched your search
@@ -23,6 +23,9 @@ static inline void write_pte(lpae_t *p, lpae_t pte)
|
||||
: : "r" (pte.bits), "r" (p) : "memory");
|
||||
}
|
||||
|
||||
/* Inline ASM to flush dcache on register R (may be an inline asm operand) */
|
||||
#define __flush_xen_dcache_one(R) STORE_CP32(R, DCCMVAC)
|
||||
|
||||
/*
|
||||
* Flush all hypervisor mappings from the TLB and branch predictor.
|
||||
* This is needed after changing Xen code mappings.
|
||||
|
||||
@@ -18,6 +18,9 @@ static inline void write_pte(lpae_t *p, lpae_t pte)
|
||||
: : "r" (pte.bits), "r" (p) : "memory");
|
||||
}
|
||||
|
||||
/* Inline ASM to flush dcache on register R (may be an inline asm operand) */
|
||||
#define __flush_xen_dcache_one(R) "dc cvac, %" #R ";"
|
||||
|
||||
/*
|
||||
* Flush all hypervisor mappings from the TLB
|
||||
* This is needed after changing Xen code mappings.
|
||||
|
||||
@@ -251,7 +251,7 @@ static inline void flush_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 )
|
||||
WRITE_CP32((uint32_t) p, DCCMVAC);
|
||||
asm volatile (__flush_xen_dcache_one(0) : : "r" (p));
|
||||
dsb(); /* So we know the flushes happen before continuing */
|
||||
}
|
||||
|
||||
@@ -264,9 +264,9 @@ static inline void flush_xen_dcache_va_range(void *p, unsigned long size)
|
||||
flush_xen_dcache_va_range(_p, sizeof(x)); \
|
||||
else \
|
||||
asm volatile ( \
|
||||
"dsb;" /* Finish all earlier writes */ \
|
||||
STORE_CP32(0, DCCMVAC) \
|
||||
"dsb;" /* Finish flush before continuing */ \
|
||||
"dsb sy;" /* Finish all earlier writes */ \
|
||||
__flush_xen_dcache_one(0) \
|
||||
"dsb sy;" /* Finish flush before continuing */ \
|
||||
: : "r" (_p), "m" (*_p)); \
|
||||
} while (0)
|
||||
|
||||
|
||||