xen/arm32: Add an helper to invalidate all instruction caches

This is similar to commit fb9d877a9c
"xen/arm64: Add an helper to invalidate all instruction caches"
except it is on ARM32 side.

When we are flushing the cache we are most likely also want
to flush the branch predictor too. Hence we add this.

And we also need to follow this with dsb()/isb() which are
memory barriers().

Reviewed-by: Julien Grall <julien.grall@arm.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
This commit is contained in:
Konrad Rzeszutek Wilk committed 2016-09-23 12:39:45 -04:00
1 parent cbe2213f60
commit efed19238c
1 file changed
+16
+16
View File
@@ -29,6 +29,22 @@ static inline void write_pte(lpae_t *p, lpae_t pte)
* inline asm operand) */
#define __clean_and_invalidate_dcache_one(R) STORE_CP32(R, DCCIMVAC)
/*
* Invalidate all instruction caches in Inner Shareable domain to PoU.
* We also need to flush the branch predictor for ARMv7 as it may be
* architecturally visible to the software (see B2.2.4 in ARM DDI 0406C.b).
*/
static inline void invalidate_icache(void)
{
asm volatile (
CMD_CP32(ICIALLUIS) /* Flush I-cache. */
CMD_CP32(BPIALLIS) /* Flush branch predictor. */
: : : "memory");
dsb(ish); /* Ensure completion of the flush I-cache */
isb(); /* Synchronize fetched instruction stream. */
}
/*
* Flush all hypervisor mappings from the TLB and branch predictor of
* the local processor.
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.