Hi Stefano,
On 8/24/19 2:16 AM, Stefano Stabellini wrote:
On Mon, 12 Aug 2019, Julien Grall wrote:
lsr x2, x19, #THIRD_SHIFT /* Base address for 4K mapping */
lsl x2, x2, #THIRD_SHIFT
@@ -674,21 +591,80 @@ create_page_tables:
cmp x1, #(LPAE_ENTRIES<<3) /* 512 entries per page */
b.lt 1b
Why can't we use create_mapping_entry here?
If we re-use create_mapping_entry, then we will compute everything at
each loop.
At the moment, the loop execute 3 instructions (excluding the branch and
comparison). We would end up to have an extra 5 instructions for arm64
(9 instruction for arm32).
At the moment, we iterate 512 times the loop, so this adds 2560
instructions (resp. 4608) in the boot code. Long-term plan, we will want
to increase the Xen mapping to 4MB (so you double up the number iteration).
This is a less than ideal solution. I haven't come up with a clever
solution so far, hence why it is left alone.
- /* 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 x19, #XEN_VIRT_START
+ bne 1f
+ ret
+1:
+ /*
+ * Only the first page of Xen will be part of the 1:1 mapping.
+ * All the boot_*_id tables are linked together even if they may
+ * not be all used. They will then be linked to the boot page
+ * tables at the correct level.
+ */
+ create_table_entry boot_first_id, boot_second_id, x19, FIRST_SHIFT,
x0, x1, x2
+ create_table_entry boot_second_id, boot_third_id, x19, SECOND_SHIFT,
x0, x1, x2
If I understood the code right, it is not actually required to link
boot_first_id -> boot_second_id and/or boot_second_id -> boot_third_id:
it depends on whether x19 clashes with XEN_FIRST_SLOT, XEN_SECOND_SLOT,
etc. Do you think it would be possible without making the code complex
to only call create_table_entry boot_first_id, boot_second_id and
create_table_entry boot_second_id, boot_third_id when required? So
moving the calls below after the relevant checks? It looks like it could
be done by adding those calls before "ret". I wouldn't mind if they are
duplicated but we could avoid it by adding appropriate labels and having
a single return path:
out1:
create_table_entry boot_first_id, boot_second_id, x19, FIRST_SHIFT, x0, x1,
x2
out2:
create_table_entry boot_second_id, boot_third_id, x19, SECOND_SHIFT, x0, x1,
x2
out3:
ret
I have implemented something similar. I will send it as part of the next
version in a bit.
Cheers,
--
Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel