Message ID | 20190812173019.11956-26-julien.grall@arm.com |
---|---|
State | Superseded |
Headers | show |
Series | xen/arm: Rework head.S to make it more compliant with the Arm Arm | expand |
On Mon, 12 Aug 2019, Julien Grall wrote: > At the moment, any update to the boot-pages are open-coded. This is > making more difficult to understand the logic of a function as each > update roughly requires 6 instructions. > > To ease the readability, two new macros are introduced: > - create_table_entry: Create a page-table entry in a given table. > This can work at any level. > - create_mapping_entry: Create a mapping entry in a given table. > None of the users will require to map at any other level than 3rd > (i.e page granularity). So the macro is supporting support 3rd level ^ you meant only? > mapping. > > Furthermore, the two macros are capable to work independently of the > state of the MMU. > > Lastly, take the opportunity to replace open-coded version in > setup_fixmap() by the two new macros. The ones in create_page_tables() > will be replaced in a follow-up patch. > > Signed-off-by: Julien Grall <julien.grall@arm.com> > > --- > Changes in v3: > - Patch added > --- > xen/arch/arm/arm64/head.S | 83 ++++++++++++++++++++++++++++++++++++++--------- > 1 file changed, 67 insertions(+), 16 deletions(-) > > diff --git a/xen/arch/arm/arm64/head.S b/xen/arch/arm/arm64/head.S > index f2a0e1d3b0..f4177dbba1 100644 > --- a/xen/arch/arm/arm64/head.S > +++ b/xen/arch/arm/arm64/head.S > @@ -492,6 +492,68 @@ cpu_init: > ENDPROC(cpu_init) > > /* > + * Macro to create a page table entry in \ptbl to \tbl > + * > + * ptbl: table symbol where the entry will be created > + * tbl: table symbol to point to > + * virt: virtual address Why not pass the virtual address as a symbol too? > + * shift: #imm page table shift > + * tmp1: scratch register > + * tmp2: scratch register > + * tmp3: scratch register > + * > + * Preserves \virt > + * Clobbers \tmp1, \tmp2, \tmp3 > + * > + * Also use x20 for the phys offset. > + * > + * Note that all parameters using registers should be distinct. > + */ > +.macro create_table_entry, ptbl, tbl, virt, shift, tmp1, tmp2, tmp3 > + lsr \tmp1, \virt, #\shift > + and \tmp1, \tmp1, #LPAE_ENTRY_MASK/* \tmp1 := slot in \tlb */ > + > + load_paddr \tmp2, \tbl > + mov \tmp3, #PT_PT /* \tmp3 := right for linear PT */ > + orr \tmp3, \tmp3, \tmp2 /* + \tlb paddr */ > + > + adr_l \tmp2, \ptbl > + > + str \tmp3, [\tmp2, \tmp1, lsl #3] > +.endm > + > +/* > + * Macro to create a mapping entry in \tbl to \phys. Only mapping in 3rd > + * level table (i.e page granularity) is supported. > + * > + * tbl: table symbol where the entry will be created NIT: for consistency, I would prefer if you called it ptlb > + * virt: virtual address It could be a symbol here, right? > + * phys: physical address (should be page aligned) > + * tmp1: scratch register > + * tmp2: scratch register > + * tmp3: scratch register > + * type: mapping type. If not specified it will be normal memory (PT_MEM_L3) > + * > + * Preserves \virt, \phys > + * Clobbers \tmp1, \tmp2, \tmp3 > + * > + * Note that all parameters using registers should be distinct. > + */ > +.macro create_mapping_entry, tbl, virt, phys, tmp1, tmp2, tmp3, type=PT_MEM_L3 > + and \tmp3, \phys, #THIRD_MASK /* \tmp3 := PAGE_ALIGNED(phys) */ > + > + lsr \tmp1, \virt, #THIRD_SHIFT > + and \tmp1, \tmp1, #LPAE_ENTRY_MASK/* \tmp1 := slot in \tlb */ > + > + mov \tmp2, #\type /* \tmp2 := right for section PT */ > + orr \tmp2, \tmp2, \tmp3 /* + PAGE_ALIGNED(phys) */ > + > + adr_l \tmp3, \tbl > + > + str \tmp2, [\tmp3, \tmp1, lsl #3] > +.endm > + > +/* > * Rebuild the boot pagetable's first-level entries. The structure > * is described in mm.c. > * > @@ -735,28 +797,17 @@ ENDPROC(remove_identity_mapping) > * x20: Physical offset > * x23: Early UART base physical address > * > - * Clobbers x1 - x4 > + * Clobbers x0 - x3 > */ > setup_fixmap: > #ifdef CONFIG_EARLY_PRINTK > /* Add UART to the fixmap table */ > - ldr x1, =xen_fixmap /* x1 := vaddr (xen_fixmap) */ > - lsr x2, x23, #THIRD_SHIFT > - lsl x2, x2, #THIRD_SHIFT /* 4K aligned paddr of UART */ > - mov x3, #PT_DEV_L3 > - orr x2, x2, x3 /* x2 := 4K dev map including UART */ > - str x2, [x1, #(FIXMAP_CONSOLE*8)] /* Map it in the first fixmap's slot */ > + ldr x0, =EARLY_UART_VIRTUAL_ADDRESS > + create_mapping_entry xen_fixmap, x0, x23, x1, x2, x3, type=PT_DEV_L3 > #endif > - > /* Map fixmap into boot_second */ > - ldr x4, =boot_second /* x4 := vaddr (boot_second) */ > - load_paddr x2, xen_fixmap > - mov x3, #PT_PT > - orr x2, x2, x3 /* x2 := table map of xen_fixmap */ > - ldr x1, =FIXMAP_ADDR(0) > - lsr x1, x1, #(SECOND_SHIFT - 3) /* x1 := Slot for FIXMAP(0) */ > - str x2, [x4, x1] /* Map it in the fixmap's slot */ > - > + ldr x0, =FIXMAP_ADDR(0) > + create_table_entry boot_second, xen_fixmap, x0, SECOND_SHIFT, x1, x2, x3 > /* Ensure any page table updates made above have occurred. */ > dsb nshst > > -- > 2.11.0 >
On Fri, 23 Aug 2019, 00:33 Stefano Stabellini, <sstabellini@kernel.org> wrote: > On Mon, 12 Aug 2019, Julien Grall wrote: > > At the moment, any update to the boot-pages are open-coded. This is > > making more difficult to understand the logic of a function as each > > update roughly requires 6 instructions. > > > > To ease the readability, two new macros are introduced: > > - create_table_entry: Create a page-table entry in a given table. > > This can work at any level. > > - create_mapping_entry: Create a mapping entry in a given table. > > None of the users will require to map at any other level than 3rd > > (i.e page granularity). So the macro is supporting support 3rd level > ^ you meant > only? > Yes, I will fix it. > > mapping. > > > > Furthermore, the two macros are capable to work independently of the > > state of the MMU. > > > > Lastly, take the opportunity to replace open-coded version in > > setup_fixmap() by the two new macros. The ones in create_page_tables() > > will be replaced in a follow-up patch. > > > > Signed-off-by: Julien Grall <julien.grall@arm.com> > > > > --- > > Changes in v3: > > - Patch added > > --- > > xen/arch/arm/arm64/head.S | 83 > ++++++++++++++++++++++++++++++++++++++--------- > > 1 file changed, 67 insertions(+), 16 deletions(-) > > > > diff --git a/xen/arch/arm/arm64/head.S b/xen/arch/arm/arm64/head.S > > index f2a0e1d3b0..f4177dbba1 100644 > > --- a/xen/arch/arm/arm64/head.S > > +++ b/xen/arch/arm/arm64/head.S > > @@ -492,6 +492,68 @@ cpu_init: > > ENDPROC(cpu_init) > > > > /* > > + * Macro to create a page table entry in \ptbl to \tbl > > + * > > + * ptbl: table symbol where the entry will be created > > + * tbl: table symbol to point to > > + * virt: virtual address > > Why not pass the virtual address as a symbol too? > Because we have no symbol for most of the virtual addresses. They are just constant defined in config.h. > > > + * shift: #imm page table shift > > + * tmp1: scratch register > > + * tmp2: scratch register > > + * tmp3: scratch register > > + * > > + * Preserves \virt > > + * Clobbers \tmp1, \tmp2, \tmp3 > > + * > > + * Also use x20 for the phys offset. > > + * > > + * Note that all parameters using registers should be distinct. > > + */ > > +.macro create_table_entry, ptbl, tbl, virt, shift, tmp1, tmp2, tmp3 > > + lsr \tmp1, \virt, #\shift > > + and \tmp1, \tmp1, #LPAE_ENTRY_MASK/* \tmp1 := slot in \tlb */ > > + > > + load_paddr \tmp2, \tbl > > + mov \tmp3, #PT_PT /* \tmp3 := right for > linear PT */ > > + orr \tmp3, \tmp3, \tmp2 /* + \tlb paddr */ > > + > > + adr_l \tmp2, \ptbl > > + > > + str \tmp3, [\tmp2, \tmp1, lsl #3] > > +.endm > > + > > +/* > > + * Macro to create a mapping entry in \tbl to \phys. Only mapping in 3rd > > + * level table (i.e page granularity) is supported. > > + * > > + * tbl: table symbol where the entry will be created > > NIT: for consistency, I would prefer if you called it ptlb > Ok. > > > + * virt: virtual address > > It could be a symbol here, right? > No. See above. > > > + * phys: physical address (should be page aligned) > > + * tmp1: scratch register > > + * tmp2: scratch register > > + * tmp3: scratch register > > + * type: mapping type. If not specified it will be normal memory > (PT_MEM_L3) > > + * > > + * Preserves \virt, \phys > > + * Clobbers \tmp1, \tmp2, \tmp3 > > + * > > + * Note that all parameters using registers should be distinct. > > + */ > > +.macro create_mapping_entry, tbl, virt, phys, tmp1, tmp2, tmp3, > type=PT_MEM_L3 > > + and \tmp3, \phys, #THIRD_MASK /* \tmp3 := > PAGE_ALIGNED(phys) */ > > + > > + lsr \tmp1, \virt, #THIRD_SHIFT > > + and \tmp1, \tmp1, #LPAE_ENTRY_MASK/* \tmp1 := slot in \tlb */ > > + > > + mov \tmp2, #\type /* \tmp2 := right for > section PT */ > > + orr \tmp2, \tmp2, \tmp3 /* + > PAGE_ALIGNED(phys) */ > > + > > + adr_l \tmp3, \tbl > > + > > + str \tmp2, [\tmp3, \tmp1, lsl #3] > > +.endm > > + > > +/* > > * Rebuild the boot pagetable's first-level entries. The structure > > * is described in mm.c. > > * > > @@ -735,28 +797,17 @@ ENDPROC(remove_identity_mapping) > > * x20: Physical offset > > * x23: Early UART base physical address > > * > > - * Clobbers x1 - x4 > > + * Clobbers x0 - x3 > > */ > > setup_fixmap: > > #ifdef CONFIG_EARLY_PRINTK > > /* Add UART to the fixmap table */ > > - ldr x1, =xen_fixmap /* x1 := vaddr (xen_fixmap) */ > > - lsr x2, x23, #THIRD_SHIFT > > - lsl x2, x2, #THIRD_SHIFT /* 4K aligned paddr of UART */ > > - mov x3, #PT_DEV_L3 > > - orr x2, x2, x3 /* x2 := 4K dev map including UART > */ > > - str x2, [x1, #(FIXMAP_CONSOLE*8)] /* Map it in the first > fixmap's slot */ > > + ldr x0, =EARLY_UART_VIRTUAL_ADDRESS > > + create_mapping_entry xen_fixmap, x0, x23, x1, x2, x3, > type=PT_DEV_L3 > > #endif > > - > > /* Map fixmap into boot_second */ > > - ldr x4, =boot_second /* x4 := vaddr (boot_second) */ > > - load_paddr x2, xen_fixmap > > - mov x3, #PT_PT > > - orr x2, x2, x3 /* x2 := table map of xen_fixmap */ > > - ldr x1, =FIXMAP_ADDR(0) > > - lsr x1, x1, #(SECOND_SHIFT - 3) /* x1 := Slot for FIXMAP(0) > */ > > - str x2, [x4, x1] /* Map it in the fixmap's slot */ > > - > > + ldr x0, =FIXMAP_ADDR(0) > > + create_table_entry boot_second, xen_fixmap, x0, SECOND_SHIFT, > x1, x2, x3 > > /* Ensure any page table updates made above have occurred. */ > > dsb nshst > > > > -- > > 2.11.0 > > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xenproject.org > https://lists.xenproject.org/mailman/listinfo/xen-devel <div dir="auto"><div><br><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, 23 Aug 2019, 00:33 Stefano Stabellini, <<a href="mailto:sstabellini@kernel.org">sstabellini@kernel.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Mon, 12 Aug 2019, Julien Grall wrote:<br> > At the moment, any update to the boot-pages are open-coded. This is<br> > making more difficult to understand the logic of a function as each<br> > update roughly requires 6 instructions.<br> > <br> > To ease the readability, two new macros are introduced:<br> > - create_table_entry: Create a page-table entry in a given table.<br> > This can work at any level.<br> > - create_mapping_entry: Create a mapping entry in a given table.<br> > None of the users will require to map at any other level than 3rd<br> > (i.e page granularity). So the macro is supporting support 3rd level<br> ^ you meant<br> only?<br></blockquote></div></div><div dir="auto"><br></div><div dir="auto">Yes, I will fix it.</div><div dir="auto"><br></div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> <br> > mapping.<br> > <br> > Furthermore, the two macros are capable to work independently of the<br> > state of the MMU.<br> > <br> > Lastly, take the opportunity to replace open-coded version in<br> > setup_fixmap() by the two new macros. The ones in create_page_tables()<br> > will be replaced in a follow-up patch.<br> > <br> > Signed-off-by: Julien Grall <<a href="mailto:julien.grall@arm.com" target="_blank" rel="noreferrer">julien.grall@arm.com</a>><br> > <br> > ---<br> > Changes in v3:<br> > - Patch added<br> > ---<br> > xen/arch/arm/arm64/head.S | 83 ++++++++++++++++++++++++++++++++++++++---------<br> > 1 file changed, 67 insertions(+), 16 deletions(-)<br> > <br> > diff --git a/xen/arch/arm/arm64/head.S b/xen/arch/arm/arm64/head.S<br> > index f2a0e1d3b0..f4177dbba1 100644<br> > --- a/xen/arch/arm/arm64/head.S<br> > +++ b/xen/arch/arm/arm64/head.S<br> > @@ -492,6 +492,68 @@ cpu_init:<br> > ENDPROC(cpu_init)<br> > <br> > /*<br> > + * Macro to create a page table entry in \ptbl to \tbl<br> > + *<br> > + * ptbl: table symbol where the entry will be created<br> > + * tbl: table symbol to point to<br> > + * virt: virtual address<br> <br> Why not pass the virtual address as a symbol too?<br></blockquote></div></div><div dir="auto"><br></div><div dir="auto">Because we have no symbol for most of the virtual addresses. They are just constant defined in config.h.</div><div dir="auto"><br></div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> <br> <br> > + * shift: #imm page table shift<br> > + * tmp1: scratch register<br> > + * tmp2: scratch register<br> > + * tmp3: scratch register<br> > + *<br> > + * Preserves \virt<br> > + * Clobbers \tmp1, \tmp2, \tmp3<br> > + *<br> > + * Also use x20 for the phys offset.<br> > + *<br> > + * Note that all parameters using registers should be distinct.<br> > + */<br> > +.macro create_table_entry, ptbl, tbl, virt, shift, tmp1, tmp2, tmp3<br> > + lsr \tmp1, \virt, #\shift<br> > + and \tmp1, \tmp1, #LPAE_ENTRY_MASK/* \tmp1 := slot in \tlb */<br> > +<br> > + load_paddr \tmp2, \tbl<br> > + mov \tmp3, #PT_PT /* \tmp3 := right for linear PT */<br> > + orr \tmp3, \tmp3, \tmp2 /* + \tlb paddr */<br> > +<br> > + adr_l \tmp2, \ptbl<br> > +<br> > + str \tmp3, [\tmp2, \tmp1, lsl #3]<br> > +.endm<br> > +<br> > +/*<br> > + * Macro to create a mapping entry in \tbl to \phys. Only mapping in 3rd<br> > + * level table (i.e page granularity) is supported.<br> > + *<br> > + * tbl: table symbol where the entry will be created<br> <br> NIT: for consistency, I would prefer if you called it ptlb<br></blockquote></div></div><div dir="auto"><br></div><div dir="auto">Ok.</div><div dir="auto"><br></div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> <br> <br> > + * virt: virtual address<br> <br> It could be a symbol here, right?<br></blockquote></div></div><div dir="auto"><br></div><div dir="auto">No. See above.</div><div dir="auto"><br></div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> <br> <br> > + * phys: physical address (should be page aligned)<br> > + * tmp1: scratch register<br> > + * tmp2: scratch register<br> > + * tmp3: scratch register<br> > + * type: mapping type. If not specified it will be normal memory (PT_MEM_L3)<br> > + *<br> > + * Preserves \virt, \phys<br> > + * Clobbers \tmp1, \tmp2, \tmp3<br> > + *<br> > + * Note that all parameters using registers should be distinct.<br> > + */<br> > +.macro create_mapping_entry, tbl, virt, phys, tmp1, tmp2, tmp3, type=PT_MEM_L3<br> > + and \tmp3, \phys, #THIRD_MASK /* \tmp3 := PAGE_ALIGNED(phys) */<br> > +<br> > + lsr \tmp1, \virt, #THIRD_SHIFT<br> > + and \tmp1, \tmp1, #LPAE_ENTRY_MASK/* \tmp1 := slot in \tlb */<br> > +<br> > + mov \tmp2, #\type /* \tmp2 := right for section PT */<br> > + orr \tmp2, \tmp2, \tmp3 /* + PAGE_ALIGNED(phys) */<br> > +<br> > + adr_l \tmp3, \tbl<br> > +<br> > + str \tmp2, [\tmp3, \tmp1, lsl #3]<br> > +.endm<br> > +<br> > +/*<br> > * Rebuild the boot pagetable's first-level entries. The structure<br> > * is described in mm.c.<br> > *<br> > @@ -735,28 +797,17 @@ ENDPROC(remove_identity_mapping)<br> > * x20: Physical offset<br> > * x23: Early UART base physical address<br> > *<br> > - * Clobbers x1 - x4<br> > + * Clobbers x0 - x3<br> > */<br> > setup_fixmap:<br> > #ifdef CONFIG_EARLY_PRINTK<br> > /* Add UART to the fixmap table */<br> > - ldr x1, =xen_fixmap /* x1 := vaddr (xen_fixmap) */<br> > - lsr x2, x23, #THIRD_SHIFT<br> > - lsl x2, x2, #THIRD_SHIFT /* 4K aligned paddr of UART */<br> > - mov x3, #PT_DEV_L3<br> > - orr x2, x2, x3 /* x2 := 4K dev map including UART */<br> > - str x2, [x1, #(FIXMAP_CONSOLE*8)] /* Map it in the first fixmap's slot */<br> > + ldr x0, =EARLY_UART_VIRTUAL_ADDRESS<br> > + create_mapping_entry xen_fixmap, x0, x23, x1, x2, x3, type=PT_DEV_L3<br> > #endif<br> > -<br> > /* Map fixmap into boot_second */<br> > - ldr x4, =boot_second /* x4 := vaddr (boot_second) */<br> > - load_paddr x2, xen_fixmap<br> > - mov x3, #PT_PT<br> > - orr x2, x2, x3 /* x2 := table map of xen_fixmap */<br> > - ldr x1, =FIXMAP_ADDR(0)<br> > - lsr x1, x1, #(SECOND_SHIFT - 3) /* x1 := Slot for FIXMAP(0) */<br> > - str x2, [x4, x1] /* Map it in the fixmap's slot */<br> > -<br> > + ldr x0, =FIXMAP_ADDR(0)<br> > + create_table_entry boot_second, xen_fixmap, x0, SECOND_SHIFT, x1, x2, x3<br> > /* Ensure any page table updates made above have occurred. */<br> > dsb nshst<br> > <br> > -- <br> > 2.11.0<br> > <br> <br> _______________________________________________<br> Xen-devel mailing list<br> <a href="mailto:Xen-devel@lists.xenproject.org" target="_blank" rel="noreferrer">Xen-devel@lists.xenproject.org</a><br> <a href="https://lists.xenproject.org/mailman/listinfo/xen-devel" rel="noreferrer noreferrer" target="_blank">https://lists.xenproject.org/mailman/listinfo/xen-devel</a></blockquote></div></div></div>
diff --git a/xen/arch/arm/arm64/head.S b/xen/arch/arm/arm64/head.S index f2a0e1d3b0..f4177dbba1 100644 --- a/xen/arch/arm/arm64/head.S +++ b/xen/arch/arm/arm64/head.S @@ -492,6 +492,68 @@ cpu_init: ENDPROC(cpu_init) /* + * Macro to create a page table entry in \ptbl to \tbl + * + * ptbl: table symbol where the entry will be created + * tbl: table symbol to point to + * virt: virtual address + * shift: #imm page table shift + * tmp1: scratch register + * tmp2: scratch register + * tmp3: scratch register + * + * Preserves \virt + * Clobbers \tmp1, \tmp2, \tmp3 + * + * Also use x20 for the phys offset. + * + * Note that all parameters using registers should be distinct. + */ +.macro create_table_entry, ptbl, tbl, virt, shift, tmp1, tmp2, tmp3 + lsr \tmp1, \virt, #\shift + and \tmp1, \tmp1, #LPAE_ENTRY_MASK/* \tmp1 := slot in \tlb */ + + load_paddr \tmp2, \tbl + mov \tmp3, #PT_PT /* \tmp3 := right for linear PT */ + orr \tmp3, \tmp3, \tmp2 /* + \tlb paddr */ + + adr_l \tmp2, \ptbl + + str \tmp3, [\tmp2, \tmp1, lsl #3] +.endm + +/* + * Macro to create a mapping entry in \tbl to \phys. Only mapping in 3rd + * level table (i.e page granularity) is supported. + * + * tbl: table symbol where the entry will be created + * virt: virtual address + * phys: physical address (should be page aligned) + * tmp1: scratch register + * tmp2: scratch register + * tmp3: scratch register + * type: mapping type. If not specified it will be normal memory (PT_MEM_L3) + * + * Preserves \virt, \phys + * Clobbers \tmp1, \tmp2, \tmp3 + * + * Note that all parameters using registers should be distinct. + */ +.macro create_mapping_entry, tbl, virt, phys, tmp1, tmp2, tmp3, type=PT_MEM_L3 + and \tmp3, \phys, #THIRD_MASK /* \tmp3 := PAGE_ALIGNED(phys) */ + + lsr \tmp1, \virt, #THIRD_SHIFT + and \tmp1, \tmp1, #LPAE_ENTRY_MASK/* \tmp1 := slot in \tlb */ + + mov \tmp2, #\type /* \tmp2 := right for section PT */ + orr \tmp2, \tmp2, \tmp3 /* + PAGE_ALIGNED(phys) */ + + adr_l \tmp3, \tbl + + str \tmp2, [\tmp3, \tmp1, lsl #3] +.endm + +/* * Rebuild the boot pagetable's first-level entries. The structure * is described in mm.c. * @@ -735,28 +797,17 @@ ENDPROC(remove_identity_mapping) * x20: Physical offset * x23: Early UART base physical address * - * Clobbers x1 - x4 + * Clobbers x0 - x3 */ setup_fixmap: #ifdef CONFIG_EARLY_PRINTK /* Add UART to the fixmap table */ - ldr x1, =xen_fixmap /* x1 := vaddr (xen_fixmap) */ - lsr x2, x23, #THIRD_SHIFT - lsl x2, x2, #THIRD_SHIFT /* 4K aligned paddr of UART */ - mov x3, #PT_DEV_L3 - orr x2, x2, x3 /* x2 := 4K dev map including UART */ - str x2, [x1, #(FIXMAP_CONSOLE*8)] /* Map it in the first fixmap's slot */ + ldr x0, =EARLY_UART_VIRTUAL_ADDRESS + create_mapping_entry xen_fixmap, x0, x23, x1, x2, x3, type=PT_DEV_L3 #endif - /* Map fixmap into boot_second */ - ldr x4, =boot_second /* x4 := vaddr (boot_second) */ - load_paddr x2, xen_fixmap - mov x3, #PT_PT - orr x2, x2, x3 /* x2 := table map of xen_fixmap */ - ldr x1, =FIXMAP_ADDR(0) - lsr x1, x1, #(SECOND_SHIFT - 3) /* x1 := Slot for FIXMAP(0) */ - str x2, [x4, x1] /* Map it in the fixmap's slot */ - + ldr x0, =FIXMAP_ADDR(0) + create_table_entry boot_second, xen_fixmap, x0, SECOND_SHIFT, x1, x2, x3 /* Ensure any page table updates made above have occurred. */ dsb nshst
At the moment, any update to the boot-pages are open-coded. This is making more difficult to understand the logic of a function as each update roughly requires 6 instructions. To ease the readability, two new macros are introduced: - create_table_entry: Create a page-table entry in a given table. This can work at any level. - create_mapping_entry: Create a mapping entry in a given table. None of the users will require to map at any other level than 3rd (i.e page granularity). So the macro is supporting support 3rd level mapping. Furthermore, the two macros are capable to work independently of the state of the MMU. Lastly, take the opportunity to replace open-coded version in setup_fixmap() by the two new macros. The ones in create_page_tables() will be replaced in a follow-up patch. Signed-off-by: Julien Grall <julien.grall@arm.com> --- Changes in v3: - Patch added --- xen/arch/arm/arm64/head.S | 83 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 67 insertions(+), 16 deletions(-)