mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
xen/arm32: head: Introduce an helper to flush the TLBs
The sequence for flushing the TLBs is 4 instruction long and often
requires an explanation how it works.
So create a helper and use it in the boot code (switch_ttbr() is left
alone until we decide the semantic of the call).
Note that in secondary_switched, we were also flushing the instruction
cache and branch predictor. Neither of them was necessary because:
* We are only supporting IVIPT cache on arm32, so the instruction
cache flush is only necessary when executable code is modified.
None of the boot code is doing that.
* The instruction cache is not invalidated and misprediction is not
a problem at boot.
Signed-off-by: Julien Grall <jgrall@amazon.com>
Reviewed-by: Michal Orzel <michal.orzel@amd.com>
Reviewed-by: Henry Wang <Henry.Wang@arm.com>
Tested-by: Henry Wang <Henry.Wang@arm.com>
This commit is contained in:
1 parent
b0a42e1973
commit
dea9dddece
1 file changed
+17
-13
+17
-13
@@ -66,6 +66,20 @@
|
||||
add \rb, \rb, r10
|
||||
.endm
|
||||
|
||||
/*
|
||||
* Flush local TLBs
|
||||
*
|
||||
* @tmp: Scratch register
|
||||
*
|
||||
* See asm/arm32/flushtlb.h for the explanation of the sequence.
|
||||
*/
|
||||
.macro flush_xen_tlb_local tmp
|
||||
dsb nshst
|
||||
mcr CP32(\tmp, TLBIALLH)
|
||||
dsb nsh
|
||||
isb
|
||||
.endm
|
||||
|
||||
/*
|
||||
* Common register usage in this file:
|
||||
* r0 -
|
||||
@@ -232,11 +246,7 @@ secondary_switched:
|
||||
mcrr CP64(r4, r5, HTTBR)
|
||||
dsb
|
||||
isb
|
||||
mcr CP32(r0, TLBIALLH) /* Flush hypervisor TLB */
|
||||
mcr CP32(r0, ICIALLU) /* Flush I-cache */
|
||||
mcr CP32(r0, BPIALL) /* Flush branch predictor */
|
||||
dsb /* Ensure completion of TLB+BP flush */
|
||||
isb
|
||||
flush_xen_tlb_local r0
|
||||
|
||||
#ifdef CONFIG_EARLY_PRINTK
|
||||
/* Use a virtual address to access the UART. */
|
||||
@@ -529,8 +539,7 @@ enable_mmu:
|
||||
* The state of the TLBs is unknown before turning on the MMU.
|
||||
* Flush them to avoid stale one.
|
||||
*/
|
||||
mcr CP32(r0, TLBIALLH) /* Flush hypervisor TLBs */
|
||||
dsb nsh
|
||||
flush_xen_tlb_local r0
|
||||
|
||||
/* Write Xen's PT's paddr into the HTTBR */
|
||||
load_paddr r0, boot_pgtable
|
||||
@@ -605,12 +614,7 @@ remove_identity_mapping:
|
||||
strd r2, r3, [r0, r1]
|
||||
|
||||
identity_mapping_removed:
|
||||
/* See asm/arm32/flushtlb.h for the explanation of the sequence. */
|
||||
dsb nshst
|
||||
mcr CP32(r0, TLBIALLH)
|
||||
dsb nsh
|
||||
isb
|
||||
|
||||
flush_xen_tlb_local r0
|
||||
mov pc, lr
|
||||
ENDPROC(remove_identity_mapping)
|
||||
|
||||
|
||||