|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] x86/boot: Simplify pagetable manipulation loops
commit c5bcf30b2cfaec6bb1924e96d77134121d023692
Author: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
AuthorDate: Fri Jan 10 01:04:28 2020 +0000
Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
CommitDate: Wed Jan 22 19:03:18 2020 +0000
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>
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
---
xen/arch/x86/boot/head.S | 40 +++++++++++++++++++++++++---------------
1 file changed, 25 insertions(+), 15 deletions(-)
diff --git a/xen/arch/x86/boot/head.S b/xen/arch/x86/boot/head.S
index 1deeae2f2a..bd18ad48e5 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: test %edx, (%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,26 @@ 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 %eax, 0 + sym_esi(l3_bootmap)
+ add $PAGE_SIZE, %eax
+ mov %eax, 8 + sym_esi(l3_bootmap)
+ add $PAGE_SIZE, %eax
+ mov %eax, 16 + sym_esi(l3_bootmap)
+ add $PAGE_SIZE, %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
--
generated by git-patchbot for /home/xen/git/xen.git#master
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |