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:
Julien Grall committed 2023-01-24 19:34:44 +00:00
1 parent b0a42e1973
commit dea9dddece
1 file changed
+17 -13
+17 -13
View File
@@ -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)
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.