[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 2/7] xen/arm64: head: Introduce get_table_slot() and use it
Hi Julien, > On 12 Aug 2022, at 20:24, Julien Grall <julien@xxxxxxx> wrote: > > From: Julien Grall <jgrall@xxxxxxxxxx> > > There are a few places in the code that need to find the slot > at a given page-table level. > > So create a new macro get_table_slot() for that. This will reduce > the effort to figure out whether the code is doing the right thing. > > Take the opportunity to use 'ubfx'. The only benefits is reducing > the number of instructions from 2 to 1. > > The new macro is used everywhere we need to compute the slot. This > requires to tweak the parameter of create_table_entry() to pass > a level rather than shift. > > Note, for slot 0 the code is currently skipping the masking part. While > this is fine, it is safer to mask it as technically slot 0 only covers > bit 48 - 39 bit (assuming 4KB page granularity). > > Take the opportunity to correct the comment when finding the second > slot for the identity mapping (we are computing the second slot > rather than first). > > Signed-off-by: Julien Grall <jgrall@xxxxxxxxxx> Reviewed-by: Bertrand Marquis <bertrand.marquis@xxxxxxx> > > ---- > > This patch also has the benefits to reduce the number > of use of {ZEROETH, FIRST, SECOND, THIRD}_SHIFT. The next > patch for arm32 will reduce further. > --- > xen/arch/arm/arm64/head.S | 55 +++++++++++++++++++++------------------ > 1 file changed, 30 insertions(+), 25 deletions(-) > > diff --git a/xen/arch/arm/arm64/head.S b/xen/arch/arm/arm64/head.S > index 26cc7705f556..ad014716db6f 100644 > --- a/xen/arch/arm/arm64/head.S > +++ b/xen/arch/arm/arm64/head.S > @@ -493,13 +493,24 @@ cpu_init: > ret > ENDPROC(cpu_init) > > +/* > + * Macro to find the slot number at a given page-table level > + * > + * slot: slot computed > + * virt: virtual address > + * lvl: page-table level > + */ > +.macro get_table_slot, slot, virt, lvl > + ubfx \slot, \virt, #XEN_PT_LEVEL_SHIFT(\lvl), #XEN_PT_LPAE_SHIFT > +.endm > + Crawling through the macros to verify the code was not that easy. This is not related to this patch but XEN_PT_* macros could really do with more comments. Cheers Bertrand > /* > * 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 > + * lvl: page-table level > * tmp1: scratch register > * tmp2: scratch register > * tmp3: scratch register > @@ -511,9 +522,8 @@ ENDPROC(cpu_init) > * > * 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, #XEN_PT_LPAE_ENTRY_MASK/* \tmp1 := slot in \tlb > */ > +.macro create_table_entry, ptbl, tbl, virt, lvl, tmp1, tmp2, tmp3 > + get_table_slot \tmp1, \virt, \lvl /* \tmp1 := slot in \tlb */ > > load_paddr \tmp2, \tbl > mov \tmp3, #PT_PT /* \tmp3 := right for linear PT */ > @@ -544,8 +554,7 @@ ENDPROC(cpu_init) > .macro create_mapping_entry, ptbl, 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, #XEN_PT_LPAE_ENTRY_MASK/* \tmp1 := slot in \tlb > */ > + get_table_slot \tmp1, \virt, 3 /* \tmp1 := slot in \tlb */ > > mov \tmp2, #\type /* \tmp2 := right for section PT > */ > orr \tmp2, \tmp2, \tmp3 /* + PAGE_ALIGNED(phys) > */ > @@ -573,9 +582,9 @@ ENDPROC(cpu_init) > create_page_tables: > /* Prepare the page-tables for mapping Xen */ > ldr x0, =XEN_VIRT_START > - create_table_entry boot_pgtable, boot_first, x0, ZEROETH_SHIFT, x1, > x2, x3 > - create_table_entry boot_first, boot_second, x0, FIRST_SHIFT, x1, x2, > x3 > - create_table_entry boot_second, boot_third, x0, SECOND_SHIFT, x1, > x2, x3 > + create_table_entry boot_pgtable, boot_first, x0, 0, x1, x2, x3 > + create_table_entry boot_first, boot_second, x0, 1, x1, x2, x3 > + create_table_entry boot_second, boot_third, x0, 2, x1, x2, x3 > > /* Map Xen */ > adr_l x4, boot_third > @@ -612,10 +621,10 @@ create_page_tables: > * XEN_ZEROETH_SLOT, then the 1:1 mapping will use its own set of > * page-tables from the first level. > */ > - lsr x0, x19, #ZEROETH_SHIFT /* x0 := zeroeth slot */ > + get_table_slot x0, x19, 0 /* x0 := zeroeth slot */ > cmp x0, #XEN_ZEROETH_SLOT > beq 1f > - create_table_entry boot_pgtable, boot_first_id, x19, ZEROETH_SHIFT, > x0, x1, x2 > + create_table_entry boot_pgtable, boot_first_id, x19, 0, x0, x1, x2 > b link_from_first_id > > 1: > @@ -624,11 +633,10 @@ create_page_tables: > * then the 1:1 mapping will use its own set of page-tables from > * the second level. > */ > - lsr x0, x19, #FIRST_SHIFT > - and x0, x0, #XEN_PT_LPAE_ENTRY_MASK /* x0 := first slot */ > + get_table_slot x0, x19, 1 /* x0 := first slot */ > cmp x0, #XEN_FIRST_SLOT > beq 1f > - create_table_entry boot_first, boot_second_id, x19, FIRST_SHIFT, x0, > x1, x2 > + create_table_entry boot_first, boot_second_id, x19, 1, x0, x1, x2 > b link_from_second_id > > 1: > @@ -638,17 +646,16 @@ create_page_tables: > * third level. For slot XEN_SECOND_SLOT, Xen is not yet able to > handle > * it. > */ > - lsr x0, x19, #SECOND_SHIFT > - and x0, x0, #XEN_PT_LPAE_ENTRY_MASK /* x0 := first slot */ > + get_table_slot x0, x19, 2 /* x0 := second slot */ > cmp x0, #XEN_SECOND_SLOT > beq virtphys_clash > - create_table_entry boot_second, boot_third_id, x19, SECOND_SHIFT, > x0, x1, x2 > + create_table_entry boot_second, boot_third_id, x19, 2, x0, x1, x2 > b link_from_third_id > > link_from_first_id: > - create_table_entry boot_first_id, boot_second_id, x19, FIRST_SHIFT, > x0, x1, x2 > + create_table_entry boot_first_id, boot_second_id, x19, 1, x0, x1, x2 > link_from_second_id: > - create_table_entry boot_second_id, boot_third_id, x19, SECOND_SHIFT, > x0, x1, x2 > + create_table_entry boot_second_id, boot_third_id, x19, 2, x0, x1, x2 > link_from_third_id: > create_mapping_entry boot_third_id, x19, x19, x0, x1, x2 > ret > @@ -705,7 +712,7 @@ remove_identity_mapping: > * Find the zeroeth slot used. Remove the entry from zeroeth > * table if the slot is not XEN_ZEROETH_SLOT. > */ > - lsr x1, x19, #ZEROETH_SHIFT /* x1 := zeroeth slot */ > + get_table_slot x1, x19, 0 /* x1 := zeroeth slot */ > cmp x1, #XEN_ZEROETH_SLOT > beq 1f > /* It is not in slot XEN_ZEROETH_SLOT, remove the entry. */ > @@ -718,8 +725,7 @@ remove_identity_mapping: > * Find the first slot used. Remove the entry for the first > * table if the slot is not XEN_FIRST_SLOT. > */ > - lsr x1, x19, #FIRST_SHIFT > - and x1, x1, #XEN_PT_LPAE_ENTRY_MASK /* x1 := first slot */ > + get_table_slot x1, x19, 1 /* x1 := first slot */ > cmp x1, #XEN_FIRST_SLOT > beq 1f > /* It is not in slot XEN_FIRST_SLOT, remove the entry. */ > @@ -732,8 +738,7 @@ remove_identity_mapping: > * Find the second slot used. Remove the entry for the first > * table if the slot is not XEN_SECOND_SLOT. > */ > - lsr x1, x19, #SECOND_SHIFT > - and x1, x1, #XEN_PT_LPAE_ENTRY_MASK /* x1 := first slot */ > + get_table_slot x1, x19, 2 /* x1 := second slot */ > cmp x1, #XEN_SECOND_SLOT > beq identity_mapping_removed > /* It is not in slot 1, remove the entry */ > @@ -771,7 +776,7 @@ setup_fixmap: > #endif > /* Map fixmap into boot_second */ > ldr x0, =FIXMAP_ADDR(0) > - create_table_entry boot_second, xen_fixmap, x0, SECOND_SHIFT, x1, > x2, x3 > + create_table_entry boot_second, xen_fixmap, x0, 2, x1, x2, x3 > /* Ensure any page table updates made above have occurred. */ > dsb nshst > > -- > 2.37.1 >
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |