From: Stefano Stabellini <sstabellini@kernel.org>
To: Julien Grall <julien.grall@arm.com>
Cc: xen-devel@lists.xenproject.org,
Stefano Stabellini <sstabellini@kernel.org>,
Volodymyr Babchuk <Volodymyr_Babchuk@epam.com>
Subject: Re: [Xen-devel] [PATCH v3 13/28] xen/arm32: head: Introduce distinct paths for the boot CPU and secondary CPUs
Date: Thu, 22 Aug 2019 10:11:18 -0700 (PDT) [thread overview]
Message-ID: <alpine.DEB.2.21.1908221011090.22783@sstabellini-ThinkPad-T480s> (raw)
In-Reply-To: <20190812173019.11956-14-julien.grall@arm.com>
On Mon, 12 Aug 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 ID mapping to the runtime mapping
> is duplicated for each path. This is because in the future we will need
> to stay longer in the ID mapping for the boot CPU.
>
> Lastly, it is now required to save lr in cpu_init() becauswe the
> function will call other functions and therefore clobber lr.
>
> Signed-off-by: Julien Grall <julien.grall@arm.com>
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
> ---
> Changes in v3:
> - Remove hard tab
> - s/ID map/1:1 mapping/
>
> Changes in v2:
> - Patch added
> ---
> xen/arch/arm/arm32/head.S | 65 +++++++++++++++++++++++++++++++++++++++--------
> 1 file changed, 54 insertions(+), 11 deletions(-)
>
> diff --git a/xen/arch/arm/arm32/head.S b/xen/arch/arm/arm32/head.S
> index c4ee06ba93..4285f76463 100644
> --- a/xen/arch/arm/arm32/head.S
> +++ b/xen/arch/arm/arm32/head.S
> @@ -148,7 +148,19 @@ past_zImage:
>
> mov r12, #0 /* r12 := 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 r0, =primary_switched
> + mov pc, r0
> +primary_switched:
> + bl setup_fixmap
> + b launch
> +ENDPROC(start)
>
> GLOBAL(init_secondary)
> cpsid aif /* Disable all interrupts */
> @@ -179,8 +191,22 @@ GLOBAL(init_secondary)
> print_reg r7
> 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 r0, =secondary_switched
> + mov pc, r0
> +secondary_switched:
> + bl setup_fixmap
> + b launch
> +ENDPROC(init_secondary)
> +
> +check_cpu_mode:
> /* Check that this CPU has Hyp mode */
> mrc CP32(r0, ID_PFR1)
> and r0, r0, #0xf000 /* Bits 12-15 define virt extensions */
> @@ -202,7 +228,10 @@ common_start:
> b fail
>
> hyp: PRINT("- Xen starting in Hyp mode -\r\n")
> + mov pc, lr
> +ENDPROC(check_cpu_mode)
>
> +zero_bss:
> /* Zero BSS On the boot CPU to avoid nasty surprises */
> teq r12, #0
> bne skip_bss
> @@ -219,8 +248,14 @@ hyp: PRINT("- Xen starting in Hyp mode -\r\n")
> blo 1b
>
> skip_bss:
> + mov pc, lr
> +ENDPROC(zero_bss)
> +
> +cpu_init:
> PRINT("- Setting up control registers -\r\n")
>
> + mov r5, lr /* r5 := return address */
> +
> /* Get processor specific proc info into r1 */
> bl __lookup_processor_type
> teq r1, #0
> @@ -231,7 +266,6 @@ skip_bss:
> PRINT(" -\r\n")
> b fail
> 1:
> -
> /* Jump to cpu_init */
> ldr r1, [r1, #PROCINFO_cpu_init] /* r1 := vaddr(init func) */
> adr lr, cpu_init_done /* Save return address */
> @@ -256,6 +290,10 @@ cpu_init_done:
> ldr r0, =HSCTLR_SET
> mcr CP32(r0, HSCTLR)
>
> + mov pc, r5 /* Return address is in r5 */
> +ENDPROC(cpu_init)
> +
> +create_page_tables:
> /*
> * Rebuild the boot pagetable's first-level entries. The structure
> * is described in mm.c.
> @@ -359,15 +397,16 @@ cpu_init_done:
> /* boot pagetable setup complete */
>
> cmp r6, #1 /* Did we manage to create an identity mapping ? */
> - beq 1f
> + moveq pc, lr
> PRINT("Unable to build boot page tables - Failed to identity map Xen.\r\n")
> b fail
> virtphys_clash:
> /* Identity map clashes with boot_third, which we cannot handle yet */
> PRINT("- Unable to build boot page tables - virt and phys addresses clash. -\r\n")
> b fail
> +ENDPROC(create_page_tables)
>
> -1:
> +enable_mmu:
> PRINT("- Turning on paging -\r\n")
>
> /*
> @@ -377,16 +416,16 @@ virtphys_clash:
> mcr CP32(r0, TLBIALLH) /* Flush hypervisor TLBs */
> dsb nsh
>
> - ldr r1, =paging /* Explicit vaddr, not RIP-relative */
> mrc CP32(r0, HSCTLR)
> /* Enable MMU and D-cache */
> orr r0, r0, #(SCTLR_Axx_ELx_M|SCTLR_Axx_ELx_C)
> dsb /* Flush PTE writes and finish reads */
> mcr CP32(r0, HSCTLR) /* now paging is enabled */
> isb /* Now, flush the icache */
> - mov pc, r1 /* Get a proper vaddr into PC */
> -paging:
> + mov pc, lr
> +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
> @@ -436,12 +475,15 @@ paging:
> mcr CP32(r0, TLBIALLH) /* Flush hypervisor TLB */
> dsb /* Ensure completion of TLB flush */
> isb
> + mov pc, lr
> +ENDPROC(setup_fixmap)
>
> +launch:
> PRINT("- Ready -\r\n")
>
> /* The boot CPU should go straight into C now */
> teq r12, #0
> - beq launch
> + beq 1f
>
> /*
> * Non-boot CPUs need to move on to the proper pagetables, which were
> @@ -460,7 +502,7 @@ paging:
> dsb /* Ensure completion of TLB+BP flush */
> isb
>
> -launch:
> +1:
> ldr r0, =init_data
> add r0, #INITINFO_stack /* Find the boot-time stack */
> ldr sp, [r0]
> @@ -471,6 +513,7 @@ launch:
> moveq r1, r8 /* - DTB address */
> beq start_xen /* and disappear into the land of C */
> 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@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
next prev parent reply other threads:[~2019-08-22 17:11 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-08-12 17:29 [Xen-devel] [PATCH v3 00/28] xen/arm: Rework head.S to make it more compliant with the Arm Arm Julien Grall
2019-08-12 17:29 ` [Xen-devel] [PATCH v3 01/28] xen/arm: lpae: Allow more LPAE helpers to be used in assembly Julien Grall
2019-08-22 17:07 ` Stefano Stabellini
2019-08-12 17:29 ` [Xen-devel] [PATCH v3 02/28] xen/arm64: head: Remove 1:1 mapping as soon as it is not used Julien Grall
2019-08-22 17:58 ` Stefano Stabellini
2019-08-22 18:25 ` Julien Grall
2019-08-22 18:29 ` Stefano Stabellini
2019-08-12 17:29 ` [Xen-devel] [PATCH v3 03/28] xen/arm64: head: Rework and document setup_fixmap() Julien Grall
2019-08-12 17:29 ` [Xen-devel] [PATCH v3 04/28] xen/arm64: head: Rework and document launch() Julien Grall
2019-08-12 17:29 ` [Xen-devel] [PATCH v3 05/28] xen/arm64: head: Setup TTBR_EL2 in enable_mmu() and add missing isb Julien Grall
2019-08-12 17:29 ` [Xen-devel] [PATCH v3 06/28] xen/arm64: head: Introduce a macro to get a PC-relative address of a symbol Julien Grall
2019-08-12 17:29 ` [Xen-devel] [PATCH v3 07/28] xen/arm64: head: Fix typo in the documentation on top of init_uart() Julien Grall
2019-08-22 17:08 ` Stefano Stabellini
2019-08-12 17:29 ` [Xen-devel] [PATCH v3 08/28] xen/arm32: head: Add a macro to move an immediate constant into a 32-bit register Julien Grall
2019-08-12 17:30 ` [Xen-devel] [PATCH v3 09/28] xen/arm32: head: Mark the end of subroutines with ENDPROC Julien Grall
2019-08-12 17:33 ` Julien Grall
2019-08-12 17:30 ` [Xen-devel] [PATCH v3 10/28] xen/arm32: head: Don't clobber r14/lr in the macro PRINT Julien Grall
2019-08-12 17:30 ` [Xen-devel] [PATCH v3 11/28] xen/arm32: head: Rework UART initialization on boot CPU Julien Grall
2019-08-12 17:30 ` [Xen-devel] [PATCH v3 12/28] xen/arm32: head: Introduce print_reg Julien Grall
2019-08-12 17:30 ` [Xen-devel] [PATCH v3 13/28] xen/arm32: head: Introduce distinct paths for the boot CPU and secondary CPUs Julien Grall
2019-08-22 17:11 ` Stefano Stabellini [this message]
2019-08-12 17:30 ` [Xen-devel] [PATCH v3 14/28] xen/arm32: head: Rework and document check_cpu_mode() Julien Grall
2019-08-22 17:14 ` Stefano Stabellini
2019-09-07 10:35 ` Julien Grall
2019-08-12 17:30 ` [Xen-devel] [PATCH v3 15/28] xen/arm32: head: Rework and document zero_bss() Julien Grall
2019-08-12 17:30 ` [Xen-devel] [PATCH v3 16/28] xen/arm32: head: Document create_pages_tables() Julien Grall
2019-08-12 17:30 ` [Xen-devel] [PATCH v3 17/28] xen/arm32: head: Document enable_mmu() Julien Grall
2019-08-12 17:30 ` [Xen-devel] [PATCH v3 18/28] xen/arm32: head: Move assembly switch to the runtime PT in secondary CPUs path Julien Grall
2019-08-22 17:17 ` Stefano Stabellini
2019-08-12 17:30 ` [Xen-devel] [PATCH v3 19/28] xen/arm32: head: Don't setup the fixmap on secondary CPUs Julien Grall
2019-08-12 17:30 ` [Xen-devel] [PATCH v3 20/28] xen/arm32: head: Remove 1:1 mapping as soon as it is not used Julien Grall
2019-08-22 18:17 ` Stefano Stabellini
2019-08-22 18:31 ` Julien Grall
2019-08-22 22:53 ` Stefano Stabellini
2019-08-22 23:39 ` Julien Grall
2019-08-12 17:30 ` [Xen-devel] [PATCH v3 21/28] xen/arm32: head: Rework and document setup_fixmap() Julien Grall
2019-08-12 17:30 ` [Xen-devel] [PATCH v3 22/28] xen/arm32: head: Rework and document launch() Julien Grall
2019-08-12 17:30 ` [Xen-devel] [PATCH v3 23/28] xen/arm32: head: Setup HTTBR in enable_mmu() and add missing isb Julien Grall
2019-08-22 17:15 ` Stefano Stabellini
2019-08-12 17:30 ` [Xen-devel] [PATCH v3 24/28] xen/arm: Zero BSS after the MMU and D-cache is turned on Julien Grall
2019-08-12 17:30 ` [Xen-devel] [PATCH v3 25/28] xen/arm64: head: Introduce macros to create table and mapping entry Julien Grall
2019-08-22 23:31 ` Stefano Stabellini
2019-08-22 23:44 ` Julien Grall
2019-08-12 17:30 ` [Xen-devel] [PATCH v3 26/28] xen/arm64: head: Use a page mapping for the 1:1 mapping in create_page_tables() Julien Grall
2019-08-24 1:16 ` Stefano Stabellini
2019-09-17 17:53 ` Julien Grall
2019-08-12 17:30 ` [Xen-devel] [PATCH v3 27/28] xen/arm32: head: Introduce macros to create table and mapping entry Julien Grall
2019-08-23 1:10 ` Stefano Stabellini
2019-08-23 9:40 ` Julien Grall
2019-08-12 17:30 ` [Xen-devel] [PATCH v3 28/28] xen/arm32: head: Use a page mapping for the 1:1 mapping in create_page_tables() Julien Grall
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=alpine.DEB.2.21.1908221011090.22783@sstabellini-ThinkPad-T480s \
--to=sstabellini@kernel.org \
--cc=Volodymyr_Babchuk@epam.com \
--cc=julien.grall@arm.com \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).