xen/arm64: head.S: Introduce enable_{boot,secondary}_cpu_mm()

At the moment, on MMU system, enable_mmu() will return to an
address in the 1:1 mapping, then each path is responsible to
switch to virtual runtime mapping. Then remove_identity_mapping()
is called on the boot CPU to remove all 1:1 mapping.

Since remove_identity_mapping() is not necessary on Non-MMU system,
and we also avoid creating empty function for Non-MMU system, trying
to keep only one codeflow in arm64/head.S, we move path switch and
remove_identity_mapping() in enable_mmu() on MMU system.

As the remove_identity_mapping should only be called for the boot
CPU only, so we introduce enable_boot_cpu_mm() for boot CPU and
enable_secondary_cpu_mm() for secondary CPUs in this patch.

Signed-off-by: Wei Chen <wei.chen@arm.com>
Signed-off-by: Penny Zheng <penny.zheng@arm.com>
Signed-off-by: Henry Wang <Henry.Wang@arm.com>
Reviewed-by: Julien Grall <jgrall@amazon.com>
Reviewed-by: Ayan Kumar Halder <ayankuma@amd.com>
This commit is contained in:
Wei Chen authored and Stefano Stabellini committed 2023-09-08 15:07:19 -07:00
1 parent cba6d44a13
commit d2f8df5b3e
1 file changed
+64 -19
+64 -19
View File
@@ -325,21 +325,11 @@ real_start_efi:
bl check_cpu_mode
bl cpu_init
bl create_page_tables
load_paddr x0, boot_pgtable
bl enable_mmu
/* We are still in the 1:1 mapping. Jump to the runtime Virtual Address. */
ldr x0, =primary_switched
br x0
ldr lr, =primary_switched
b enable_boot_cpu_mm
primary_switched:
/*
* The 1:1 map may clash with other parts of the Xen virtual memory
* layout. As it is not used anymore, remove it completely to
* avoid having to worry about replacing existing mapping
* afterwards.
*/
bl remove_identity_mapping
bl setup_fixmap
#ifdef CONFIG_EARLY_PRINTK
/* Use a virtual address to access the UART. */
@@ -384,13 +374,10 @@ GLOBAL(init_secondary)
#endif
bl check_cpu_mode
bl cpu_init
load_paddr x0, init_ttbr
ldr x0, [x0]
bl enable_mmu
/* We are still in the 1:1 mapping. Jump to the runtime Virtual Address. */
ldr x0, =secondary_switched
br x0
ldr lr, =secondary_switched
b enable_secondary_cpu_mm
secondary_switched:
#ifdef CONFIG_EARLY_PRINTK
/* Use a virtual address to access the UART. */
@@ -748,6 +735,64 @@ enable_mmu:
ret
ENDPROC(enable_mmu)
/*
* Enable mm (turn on the data cache and the MMU) for secondary CPUs.
* The function will return to the virtual address provided in LR (e.g. the
* runtime mapping).
*
* Inputs:
* lr : Virtual address to return to.
*
* Clobbers x0 - x5
*/
enable_secondary_cpu_mm:
mov x5, lr
load_paddr x0, init_ttbr
ldr x0, [x0]
bl enable_mmu
mov lr, x5
/* Return to the virtual address requested by the caller. */
ret
ENDPROC(enable_secondary_cpu_mm)
/*
* Enable mm (turn on the data cache and the MMU) for the boot CPU.
* The function will return to the virtual address provided in LR (e.g. the
* runtime mapping).
*
* Inputs:
* lr : Virtual address to return to.
*
* Clobbers x0 - x5
*/
enable_boot_cpu_mm:
mov x5, lr
bl create_page_tables
load_paddr x0, boot_pgtable
bl enable_mmu
/*
* The MMU is turned on and we are in the 1:1 mapping. Switch
* to the runtime mapping.
*/
ldr x0, =1f
br x0
1:
mov lr, x5
/*
* The 1:1 map may clash with other parts of the Xen virtual memory
* layout. As it is not used anymore, remove it completely to avoid
* having to worry about replacing existing mapping afterwards.
* Function will return to the virtual address requested by the caller.
*/
b remove_identity_mapping
ENDPROC(enable_boot_cpu_mm)
/*
* Remove the 1:1 map from the page-tables. It is not easy to keep track
* where the 1:1 map was mapped, so we will look for the top-level entry
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.