[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 4/5] x86/boot: Simplify pagetable manipulation loops
For __page_tables_{start,end} and L3 bootmap initialisation, the logic is unnecesserily complicated owing to its attempt to use the LOOP instruction, which results in an off-by-8 memory address owing to LOOP's termination condition. Rewrite both loops for improved clarity and speed. Misc notes: * TEST $IMM, MEM can't macrofuse. The loop has 0x1200 iterations, so pull the $_PAGE_PRESENT constant out into a spare register to turn the TEST into its %REG, MEM form, which can macrofuse. * Avoid the use of %fs-relative references. %esi-relative is the more common form in the code, and doesn't suffer an address generation overhead. * Avoid LOOP. CMP/JB isn't microcoded and faster to execute in all cases. * For a 4 interation trivial loop, even compilers unroll these. The generated code size is a fraction larger, but this is init and the asm is far easier to follow. * Reposition the l2=>l1 bootmap construction so the asm reads in pagetable level order. No functional change. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- CC: Jan Beulich <JBeulich@xxxxxxxx> CC: Wei Liu <wl@xxxxxxx> CC: Roger Pau Monné <roger.pau@xxxxxxxxxx> --- xen/arch/x86/boot/head.S | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/xen/arch/x86/boot/head.S b/xen/arch/x86/boot/head.S index 1deeae2f2a..1acaf817ba 100644 --- a/xen/arch/x86/boot/head.S +++ b/xen/arch/x86/boot/head.S @@ -662,11 +662,17 @@ trampoline_setup: mov %edx,sym_fs(boot_tsc_stamp)+4 /* Relocate pagetables to point at Xen's current location in memory. */ - mov $((__page_tables_end-__page_tables_start)/8),%ecx -1: testl $_PAGE_PRESENT,sym_fs(__page_tables_start)-8(,%ecx,8) + mov $_PAGE_PRESENT, %edx + lea sym_esi(__page_tables_start), %eax + lea sym_esi(__page_tables_end), %edi + +1: testb %dl, (%eax) /* if page present */ jz 2f - add %esi,sym_fs(__page_tables_start)-8(,%ecx,8) -2: loop 1b + add %esi, (%eax) /* pte += base */ +2: add $8, %eax + + cmp %edi, %eax + jb 1b /* Map Xen into the higher mappings using 2M superpages. */ lea _PAGE_PSE + PAGE_HYPERVISOR_RWX + sym_esi(_start), %eax @@ -701,22 +707,27 @@ trampoline_setup: cmp %edx, %ecx jbe 1b - /* Initialize L3 boot-map page directory entries. */ - lea __PAGE_HYPERVISOR+(L2_PAGETABLE_ENTRIES*8)*3+sym_esi(l2_bootmap),%eax - mov $4,%ecx -1: mov %eax,sym_fs(l3_bootmap)-8(,%ecx,8) - sub $(L2_PAGETABLE_ENTRIES*8),%eax - loop 1b - - /* Map the permanent trampoline page into l{1,2}_bootmap[]. */ + /* Map 4x l2_bootmap[] into l3_bootmap[0...3] */ + lea __PAGE_HYPERVISOR + sym_esi(l2_bootmap), %eax + mov $PAGE_SIZE, %edx + mov %eax, 0 + sym_esi(l3_bootmap) + add %edx, %eax + mov %eax, 8 + sym_esi(l3_bootmap) + add %edx, %eax + mov %eax, 16 + sym_esi(l3_bootmap) + add %edx, %eax + mov %eax, 24 + sym_esi(l3_bootmap) + + /* Map l1_bootmap[] into l2_bootmap[0]. */ + lea __PAGE_HYPERVISOR + sym_esi(l1_bootmap), %eax + mov %eax, sym_esi(l2_bootmap) + + /* Map the permanent trampoline page into l1_bootmap[]. */ mov sym_esi(trampoline_phys), %ecx lea __PAGE_HYPERVISOR_RX(%ecx), %edx /* %edx = PTE to write */ shr $PAGE_SHIFT, %ecx /* %ecx = Slot to write */ mov %edx, sym_offs(l1_bootmap)(%esi, %ecx, 8) - lea __PAGE_HYPERVISOR + sym_esi(l1_bootmap), %edx - mov %edx, sym_esi(l2_bootmap) - /* Apply relocations to bootstrap trampoline. */ mov sym_esi(trampoline_phys), %edx lea sym_esi(__trampoline_rel_start), %edi -- 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 |