|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 35/35] xen/arm: Zero BSS after the MMU and D-cache is turned on
On Mon, 22 Jul 2019, Julien Grall wrote:
> At the moment BSS is zeroed before the MMU and D-Cache is turned on.
> In other words, the cache will be bypassed when zeroing the BSS section.
>
> On Arm64, per the Image protocol [1], the state of the cache for BSS region
> is not known because it is not part of the "loaded kernel image".
>
> On Arm32, the boot protocol [2] does not mention anything about the
> state of the cache. Therefore, it should be assumed that it is not known
> for BSS region.
>
> This means that the cache will need to be invalidated twice for the BSS
> region:
> 1) Before zeroing to remove any dirty cache line. Otherwise they may
> get evicted while zeroing and therefore overriding the value.
> 2) After zeroing to remove any cache line that may have been
> speculated. Otherwise when turning on MMU and D-Cache, the CPU may
> see old values.
>
> At the moment, the only reason to have BSS zeroed early is because the
> boot page tables are part of it. To avoid the two cache invalidations,
> it would be better if the boot page tables are part of the "loaded
> kernel image" and therefore be zeroed when loading the image into
> memory. A good candidate is the section .data.page_aligned.
>
> A new macro DEFINE_BOOT_PAGE_TABLE is introduced to create and mark
> page-tables used before BSS is zeroed. This includes all boot_* but also
> xen_fixmap as zero_bss() will print a message when earlyprintk is
> enabled.
>
> [1] linux/Documentation/arm64/booting.txt
> [2] linux/Documentation/arm/Booting
>
> Signed-off-by: Julien Grall <julien.grall@xxxxxxx>
Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
> ---
>
> Changes in v2:
> - Add missing signed-off
> - Clarify commit message
> - Add arm32 parts
> ---
> xen/arch/arm/arm32/head.S | 11 +++--------
> xen/arch/arm/arm64/head.S | 7 +++----
> xen/arch/arm/mm.c | 23 +++++++++++++++++------
> 3 files changed, 23 insertions(+), 18 deletions(-)
>
> diff --git a/xen/arch/arm/arm32/head.S b/xen/arch/arm/arm32/head.S
> index 8a1e272aab..48cad6103f 100644
> --- a/xen/arch/arm/arm32/head.S
> +++ b/xen/arch/arm/arm32/head.S
> @@ -149,7 +149,6 @@ past_zImage:
> mov r12, #0 /* r12 := is_secondary_cpu */
>
> bl check_cpu_mode
> - bl zero_bss
> bl cpu_init
> bl create_page_tables
> bl enable_mmu
> @@ -170,6 +169,7 @@ primary_switched:
> /* Use a virtual address to access the UART. */
> mov_w r11, EARLY_UART_VIRTUAL_ADDRESS
> #endif
> + bl zero_bss
> PRINT("- Ready -\r\n")
> /* Setup the arguments for start_xen and jump to C world */
> mov r0, r10 /* r0 := Physical offset */
> @@ -280,17 +280,12 @@ ENDPROC(check_cpu_mode)
> /*
> * Zero BSS
> *
> - * Inputs:
> - * r10: Physical offset
> - *
> * Clobbers r0 - r3
> */
> zero_bss:
> PRINT("- Zero BSS -\r\n")
> - ldr r0, =__bss_start /* Load start & end of bss */
> - ldr r1, =__bss_end
> - add r0, r0, r10 /* Apply physical offset */
> - add r1, r1, r10
> + ldr r0, =__bss_start /* r0 := vaddr(__bss_start) */
> + ldr r1, =__bss_end /* r1 := vaddr(__bss_start) */
>
> mov r2, #0
> 1: str r2, [r0], #4
> diff --git a/xen/arch/arm/arm64/head.S b/xen/arch/arm/arm64/head.S
> index 2287f3ce48..b671e0e59f 100644
> --- a/xen/arch/arm/arm64/head.S
> +++ b/xen/arch/arm/arm64/head.S
> @@ -303,7 +303,6 @@ real_start_efi:
> mov x22, #0 /* x22 := is_secondary_cpu */
>
> bl check_cpu_mode
> - bl zero_bss
> bl cpu_init
> bl create_page_tables
> bl enable_mmu
> @@ -324,6 +323,7 @@ primary_switched:
> /* Use a virtual address to access the UART. */
> ldr x23, =EARLY_UART_VIRTUAL_ADDRESS
> #endif
> + bl zero_bss
> PRINT("- Ready -\r\n")
> /* Setup the arguments for start_xen and jump to C world */
> mov x0, x20 /* x0 := Physical offset */
> @@ -426,7 +426,6 @@ ENDPROC(check_cpu_mode)
> * Zero BSS
> *
> * Inputs:
> - * x20: Physical offset
> * x26: Do we need to zero BSS?
> *
> * Clobbers x0 - x3
> @@ -436,8 +435,8 @@ zero_bss:
> cbnz x26, skip_bss
>
> PRINT("- Zero BSS -\r\n")
> - load_paddr x0, __bss_start /* Load paddr of start & end of bss */
> - load_paddr x1, __bss_end
> + ldr x0, =__bss_start /* x0 := vaddr(__bss_start) */
> + ldr x1, =__bss_end /* x1 := vaddr(__bss_start) */
>
> 1: str xzr, [x0], #8
> cmp x0, x1
> diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c
> index 44258ad89c..670a3089ea 100644
> --- a/xen/arch/arm/mm.c
> +++ b/xen/arch/arm/mm.c
> @@ -62,6 +62,17 @@ mm_printk(const char *fmt, ...) {}
> } while (0);
> #endif
>
> +/*
> + * Macros to define page-tables:
> + * - DEFINE_BOOT_PAGE_TABLE is used to define page-table that are used
> + * in assembly code before BSS is zeroed.
> + * - DEFINE_PAGE_TABLE{,S} are used to define one or multiple
> + * page-tables to be used after BSS is zeroed (typically they are only used
> + * in C).
> + */
> +#define DEFINE_BOOT_PAGE_TABLE(name)
> \
> +lpae_t __aligned(PAGE_SIZE) __section(".data.page_aligned")
> name[LPAE_ENTRIES]
> +
> #define DEFINE_PAGE_TABLES(name, nr) \
> lpae_t __aligned(PAGE_SIZE) name[LPAE_ENTRIES * (nr)]
>
> @@ -90,13 +101,13 @@ lpae_t __aligned(PAGE_SIZE) name[LPAE_ENTRIES * (nr)]
> * Finally, if EARLY_PRINTK is enabled then xen_fixmap will be mapped
> * by the CPU once it has moved off the 1:1 mapping.
> */
> -DEFINE_PAGE_TABLE(boot_pgtable);
> +DEFINE_BOOT_PAGE_TABLE(boot_pgtable);
> #ifdef CONFIG_ARM_64
> -DEFINE_PAGE_TABLE(boot_first);
> -DEFINE_PAGE_TABLE(boot_first_id);
> +DEFINE_BOOT_PAGE_TABLE(boot_first);
> +DEFINE_BOOT_PAGE_TABLE(boot_first_id);
> #endif
> -DEFINE_PAGE_TABLE(boot_second);
> -DEFINE_PAGE_TABLE(boot_third);
> +DEFINE_BOOT_PAGE_TABLE(boot_second);
> +DEFINE_BOOT_PAGE_TABLE(boot_third);
>
> /* Main runtime page tables */
>
> @@ -149,7 +160,7 @@ static __initdata int xenheap_first_first_slot = -1;
> */
> static DEFINE_PAGE_TABLES(xen_second, 2);
> /* First level page table used for fixmap */
> -DEFINE_PAGE_TABLE(xen_fixmap);
> +DEFINE_BOOT_PAGE_TABLE(xen_fixmap);
> /* First level page table used to map Xen itself with the XN bit set
> * as appropriate. */
> static DEFINE_PAGE_TABLE(xen_xenmap);
> --
> 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 |