[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 17/17] xen/arm64: Zero BSS after the MMU and D-cache is turned on
On Mon, 10 Jun 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. > > 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". > > 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. > > However, the only reason to have the BSS zeroed early is because the > boot page tables are part of BSS. To avoid the two cache invalidations, > it is possible to move the page tables in the section .data.page_aligned. I am not following the last part. How is moving the boot page tables to .data.page_aligned solving the problem? Do we need to zero .data.page_aligned early or can we skip it because it is guaranteed to already be zero? > 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. On a similar note, and continuing from what I wrote above, do we need to make sure to zero the xen_fixmap before hooking it up setup_fixmap? > [1] linux/Documentation/arm64/booting.txt > > --- > > Note that the arm32 support is not there yet. This will need to be > addressed here or separately depending on when the Arm32 boot rework > is sent. > --- > xen/arch/arm/arm64/head.S | 6 +++--- > xen/arch/arm/mm.c | 23 +++++++++++++++++------ > 2 files changed, 20 insertions(+), 9 deletions(-) > > diff --git a/xen/arch/arm/arm64/head.S b/xen/arch/arm/arm64/head.S > index 130ab66d8e..6c3edbbc81 100644 > --- a/xen/arch/arm/arm64/head.S > +++ b/xen/arch/arm/arm64/head.S > @@ -291,7 +291,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 > @@ -312,6 +311,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 := phys_offset */ > @@ -423,8 +423,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 6a549e9283..0b2d07a258 100644 > --- a/xen/arch/arm/mm.c > +++ b/xen/arch/arm/mm.c > @@ -48,6 +48,17 @@ > #undef mfn_to_virt > #define mfn_to_virt(mfn) __mfn_to_virt(mfn_x(mfn)) > > +/* > + * 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)] > > @@ -76,13 +87,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 */ > > @@ -135,7 +146,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 |