[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 8/8] xen/arm32: head: Use a page mapping for the 1:1 mapping in create_page_tables()
On Tue, 17 Sep 2019, Julien Grall wrote: > At the moment the function create_page_tables() will use 1GB/2MB > mapping for the identity mapping. As we don't know what is present > before and after Xen in memory, we may end up to map > device/reserved-memory with cacheable memory. This may result to > mismatched attributes as other users may access the same region > differently. > > To prevent any issues, we should only map the strict minimum in the > 1:1 mapping. A check in xen.lds.S already guarantees anything > necessary for turning on the MMU fits in a page (at the moment 4K). > > As only one page will be mapped for the 1:1 mapping, it is necessary > to pre-allocate a page for the 3rd level table. > > Signed-off-by: Julien Grall <julien.grall@xxxxxxx> > > --- > Changes in v4: > - Use XEN_{FIRST, SECOND}_SLOT rather than hardcoded value > - Don't pre-link the page-tables for the 1:1 mapping > > Changes in v3: > - Patch added > --- > xen/arch/arm/arm32/head.S | 121 > +++++++++++++++++++--------------------------- > xen/arch/arm/mm.c | 2 +- > 2 files changed, 50 insertions(+), 73 deletions(-) > > diff --git a/xen/arch/arm/arm32/head.S b/xen/arch/arm/arm32/head.S > index 175f0c9760..7b5109db26 100644 > --- a/xen/arch/arm/arm32/head.S > +++ b/xen/arch/arm/arm32/head.S > @@ -447,73 +447,13 @@ ENDPROC(cpu_init) > * r6 : Identity map in place > */ > create_page_tables: > - /* > - * If Xen is loaded at exactly XEN_VIRT_START then we don't > - * need an additional 1:1 mapping, the virtual mapping will > - * suffice. > - */ > - cmp r9, #XEN_VIRT_START > - moveq r6, #1 /* r6 := identity map now in place */ > - movne r6, #0 /* r6 := identity map not yet in place > */ > - > - ldr r4, =boot_pgtable > - add r4, r4, r10 /* r4 := paddr (boot_pagetable) */ > - > - /* Setup boot_pgtable: */ > - ldr r1, =boot_second > - add r1, r1, r10 /* r1 := paddr (boot_second) */ > - > - /* ... map boot_second in boot_pgtable[0] */ > - orr r2, r1, #PT_UPPER(PT) /* r2:r3 := table map of boot_second */ > - orr r2, r2, #PT_LOWER(PT) /* (+ rights for linear PT) */ > - mov r3, #0x0 > - strd r2, r3, [r4, #0] /* Map it in slot 0 */ > - > - /* ... map of paddr(start) in boot_pgtable */ > - lsrs r1, r9, #FIRST_SHIFT /* Offset of base paddr in boot_pgtable > */ > - beq 1f /* If it is in slot 0 then map in > boot_second > - * later on */ > - lsl r2, r1, #FIRST_SHIFT /* Base address for 1GB mapping */ > - orr r2, r2, #PT_UPPER(MEM) /* r2:r3 := section map */ > - orr r2, r2, #PT_LOWER(MEM) > - lsl r1, r1, #3 /* r1 := Slot offset */ > - mov r3, #0x0 > - strd r2, r3, [r4, r1] /* Mapping of paddr(start) */ > - mov r6, #1 /* r6 := identity map now in place */ > - > -1: /* Setup boot_second: */ > - ldr r4, =boot_second > - add r4, r4, r10 /* r4 := paddr (boot_second) */ > - > - ldr r1, =boot_third > - add r1, r1, r10 /* r1 := paddr (boot_third) */ > - > - /* ... map boot_third in boot_second[1] */ > - orr r2, r1, #PT_UPPER(PT) /* r2:r3 := table map of boot_third */ > - orr r2, r2, #PT_LOWER(PT) /* (+ rights for linear PT) */ > - mov r3, #0x0 > - strd r2, r3, [r4, #8] /* Map it in slot 1 */ > - > - /* ... map of paddr(start) in boot_second */ > - cmp r6, #1 /* r6 is set if already created */ > - beq 1f > - lsr r2, r9, #SECOND_SHIFT /* Offset of base paddr in boot_second > */ > - ldr r3, =LPAE_ENTRY_MASK > - and r1, r2, r3 > - cmp r1, #1 > - beq virtphys_clash /* It's in slot 1, which we cannot > handle */ > - > - lsl r2, r2, #SECOND_SHIFT /* Base address for 2MB mapping */ > - orr r2, r2, #PT_UPPER(MEM) /* r2:r3 := section map */ > - orr r2, r2, #PT_LOWER(MEM) > - mov r3, #0x0 > - lsl r1, r1, #3 /* r1 := Slot offset */ > - strd r2, r3, [r4, r1] /* Mapping of paddr(start) */ > - mov r6, #1 /* r6 := identity map now in place */ > + /* Prepare the page-tables for mapping Xen */ > + ldr r0, =XEN_VIRT_START > + create_table_entry boot_pgtable, boot_second, r0, FIRST_SHIFT > + create_table_entry boot_second, boot_third, r0, SECOND_SHIFT > > /* Setup boot_third: */ > -1: ldr r4, =boot_third > - add r4, r4, r10 /* r4 := paddr (boot_third) */ > + adr_l r4, boot_third, mmu=0 > > lsr r2, r9, #THIRD_SHIFT /* Base address for 4K mapping */ > lsl r2, r2, #THIRD_SHIFT > @@ -530,16 +470,53 @@ create_page_tables: > blo 1b > > /* > - * Defer fixmap and dtb mapping until after paging enabled, to > - * avoid them clashing with the 1:1 mapping. > + * If Xen is loaded at exactly XEN_VIRT_START then we don't > + * need an additional 1:1 mapping, the virtual mapping will > + * suffice. > */ > + cmp r9, #XEN_VIRT_START > + moveq pc, lr > > - /* boot pagetable setup complete */ > +1: As far as I can tell, this 1 label is unused. If so, we should remove it. With that gone: Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> > + /* > + * Setup the 1:1 mapping so we can turn the MMU on. Note that > + * only the first page of Xen will be part of the 1:1 mapping. > + */ > + > + /* > + * Find the first slot used. If the slot is not XEN_FIRST_SLOT, > + * then the 1:1 mapping will use its own set of page-tables from > + * the second level. > + */ > + lsr r1, r9, #FIRST_SHIFT > + mov_w r0, LPAE_ENTRY_MASK > + and r1, r1, r0 /* r1 := first slot */ > + cmp r1, #XEN_FIRST_SLOT > + beq 1f > + create_table_entry boot_pgtable, boot_second_id, r9, FIRST_SHIFT > + b link_from_second_id > + > +1: > + /* > + * Find the second slot used. If the slot is XEN_SECOND_SLOT, then > the > + * 1:1 mapping will use its own set of page-tables from the > + * third level. For slot XEN_SECOND_SLOT, Xen is not yet able to > handle > + * it. > + */ > + lsr r1, r9, #SECOND_SHIFT > + mov_w r0, LPAE_ENTRY_MASK > + and r1, r1, r0 /* r1 := second slot */ > + cmp r1, #XEN_SECOND_SLOT > + beq virtphys_clash > + create_table_entry boot_second, boot_third_id, r9, SECOND_SHIFT > + b link_from_third_id > + > +link_from_second_id: > + create_table_entry boot_second_id, boot_third_id, r9, SECOND_SHIFT > +link_from_third_id: > + create_mapping_entry boot_third_id, r9, r9 > + mov pc, lr > > - cmp r6, #1 /* Did we manage to create an identity > mapping ? */ > - 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") > diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c > index 72ffea7472..9e0fdc39f9 100644 > --- a/xen/arch/arm/mm.c > +++ b/xen/arch/arm/mm.c > @@ -105,9 +105,9 @@ DEFINE_BOOT_PAGE_TABLE(boot_pgtable); > #ifdef CONFIG_ARM_64 > DEFINE_BOOT_PAGE_TABLE(boot_first); > DEFINE_BOOT_PAGE_TABLE(boot_first_id); > +#endif > DEFINE_BOOT_PAGE_TABLE(boot_second_id); > DEFINE_BOOT_PAGE_TABLE(boot_third_id); > -#endif > DEFINE_BOOT_PAGE_TABLE(boot_second); > DEFINE_BOOT_PAGE_TABLE(boot_third); > > -- > 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 |