|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 06/35] xen/arm64: head: Introduce distinct paths for the boot CPU and secondary CPUs
On Mon, 22 Jul 2019, Julien Grall wrote:
> The boot code is currently quite difficult to go through because of the
> lack of documentation and a number of indirection to avoid executing
> some path in either the boot CPU or secondary CPUs.
>
> In an attempt to make the boot code easier to follow, each parts of the
> boot are now in separate functions. Furthermore, the paths for the boot
> CPU and secondary CPUs are now distinct and for now will call each
> functions.
>
> Follow-ups will remove unnecessary calls and do further improvement
> (such as adding documentation and reshuffling).
>
> Note that the switch from using the 1:1 mapping to the runtime mapping
> is duplicated for each path. This is because in the future we will need
> to stay longer in the 1:1 mapping for the boot CPU.
>
> Signed-off-by: Julien Grall <julien.grall@xxxxxxx>
Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
> ---
> Changes in v2:
> - Avoid infinite loop on boot CPU
> - Fix typoes in the commit message
> - s/ID/1:1/
> ---
> xen/arch/arm/arm64/head.S | 60
> ++++++++++++++++++++++++++++++++++++++++-------
> 1 file changed, 51 insertions(+), 9 deletions(-)
>
> diff --git a/xen/arch/arm/arm64/head.S b/xen/arch/arm/arm64/head.S
> index 63d63bc8ec..df797a1573 100644
> --- a/xen/arch/arm/arm64/head.S
> +++ b/xen/arch/arm/arm64/head.S
> @@ -290,7 +290,19 @@ real_start_efi:
>
> mov x22, #0 /* x22 := is_secondary_cpu */
>
> - b common_start
> + bl check_cpu_mode
> + bl zero_bss
> + bl cpu_init
> + bl create_page_tables
> + bl enable_mmu
> +
> + /* We are still in the 1:1 mapping. Jump to the runtime Virtual
> Address. */
> + ldr x0, =primary_switched
> + br x0
> +primary_switched:
> + bl setup_fixmap
> + b launch
> +ENDPROC(real_start)
>
> GLOBAL(init_secondary)
> msr DAIFSet, 0xf /* Disable all interrupts */
> @@ -324,9 +336,21 @@ GLOBAL(init_secondary)
> print_reg x24
> PRINT(" booting -\r\n")
> #endif
> -
> -common_start:
> -
> + bl check_cpu_mode
> + bl zero_bss
> + bl cpu_init
> + bl create_page_tables
> + bl enable_mmu
> +
> + /* We are still in the 1:1 mapping. Jump to the runtime Virtual
> Address. */
> + ldr x0, =secondary_switched
> + br x0
> +secondary_switched:
> + bl setup_fixmap
> + b launch
> +ENDPROC(init_secondary)
> +
> +check_cpu_mode:
> PRINT("- Current EL ")
> mrs x5, CurrentEL
> print_reg x5
> @@ -343,7 +367,10 @@ common_start:
> b fail
>
> el2: PRINT("- Xen starting at EL2 -\r\n")
> + ret
> +ENDPROC(check_cpu_mode)
>
> +zero_bss:
> /* Zero BSS only when requested */
> cbnz x26, skip_bss
>
> @@ -356,6 +383,10 @@ el2: PRINT("- Xen starting at EL2 -\r\n")
> b.lo 1b
>
> skip_bss:
> + ret
> +ENDPROC(zero_bss)
> +
> +cpu_init:
> PRINT("- Setting up control registers -\r\n")
>
> /* Set up memory attribute type tables */
> @@ -382,7 +413,10 @@ skip_bss:
> * are handled using the EL2 stack pointer, rather
> * than SP_EL0. */
> msr spsel, #1
> + ret
> +ENDPROC(cpu_init)
>
> +create_page_tables:
> /* Rebuild the boot pagetable's first-level entries. The structure
> * is described in mm.c.
> *
> @@ -507,6 +541,10 @@ virtphys_clash:
> b fail
>
> 1:
> + ret
> +ENDPROC(create_page_tables)
> +
> +enable_mmu:
> PRINT("- Turning on paging -\r\n")
>
> /*
> @@ -516,16 +554,16 @@ virtphys_clash:
> tlbi alle2 /* Flush hypervisor TLBs */
> dsb nsh
>
> - ldr x1, =paging /* Explicit vaddr, not RIP-relative */
> mrs x0, SCTLR_EL2
> orr x0, x0, #SCTLR_Axx_ELx_M /* Enable MMU */
> orr x0, x0, #SCTLR_Axx_ELx_C /* Enable D-cache */
> dsb sy /* Flush PTE writes and finish reads */
> msr SCTLR_EL2, x0 /* now paging is enabled */
> isb /* Now, flush the icache */
> - br x1 /* Get a proper vaddr into PC */
> -paging:
> + ret
> +ENDPROC(enable_mmu)
>
> +setup_fixmap:
> /* Now we can install the fixmap and dtb mappings, since we
> * don't need the 1:1 map any more */
> dsb sy
> @@ -567,11 +605,14 @@ paging:
> tlbi alle2
> dsb sy /* Ensure completion of TLB flush */
> isb
> + ret
> +ENDPROC(setup_fixmap)
>
> +launch:
> PRINT("- Ready -\r\n")
>
> /* The boot CPU should go straight into C now */
> - cbz x22, launch
> + cbz x22, 1f
>
> /* Non-boot CPUs need to move on to the proper pagetables, which were
> * setup in init_secondary_pagetables. */
> @@ -586,7 +627,7 @@ paging:
> dsb sy /* Ensure completion of TLB flush */
> isb
>
> -launch:
> +1:
> ldr x0, =init_data
> add x0, x0, #INITINFO_stack /* Find the boot-time stack */
> ldr x0, [x0]
> @@ -601,6 +642,7 @@ launch:
> b start_xen /* and disappear into the land of C */
> 1:
> b start_secondary /* (to the appropriate entry point) */
> +ENDPROC(launch)
>
> /* Fail-stop */
> fail: PRINT("- Boot failed -\r\n")
> --
> 2.11.0
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |