|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen master] Revert "xen/arm32: head: Widen the use of the temporary mapping"
commit c6c8c0808f908911a38bc330cdc7a26ac4bf6d51
Author: Julien Grall <jgrall@xxxxxxxxxx>
AuthorDate: Fri Apr 21 11:01:06 2023 +0100
Commit: Julien Grall <jgrall@xxxxxxxxxx>
CommitDate: Fri Apr 21 11:01:22 2023 +0100
Revert "xen/arm32: head: Widen the use of the temporary mapping"
We suspect the patch may break boot on the arndale board.
This reverts commit eed3ae84bcd10a69c24c3cb4b0b98e070bc65ee4.
---
xen/arch/arm/arm32/head.S | 86 ++++++++++++++++++++++++++++++++++++++---------
1 file changed, 70 insertions(+), 16 deletions(-)
diff --git a/xen/arch/arm/arm32/head.S b/xen/arch/arm/arm32/head.S
index 5168eb4588..f9f7be9588 100644
--- a/xen/arch/arm/arm32/head.S
+++ b/xen/arch/arm/arm32/head.S
@@ -459,6 +459,7 @@ ENDPROC(cpu_init)
create_page_tables:
/* Prepare the page-tables for mapping Xen */
mov_w r0, XEN_VIRT_START
+ create_table_entry boot_pgtable, boot_second, r0, 1
create_table_entry boot_second, boot_third, r0, 2
/* Setup boot_third: */
@@ -478,37 +479,70 @@ create_page_tables:
cmp r1, #(XEN_PT_LPAE_ENTRIES<<3) /* 512*8-byte entries per page */
blo 1b
+ /*
+ * 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 r9, #XEN_VIRT_START
+ moveq pc, lr
+
/*
* Setup the 1:1 mapping so we can turn the MMU on. Note that
* only the first page of Xen will be part of the 1:1 mapping.
+ *
+ * In all the cases, we will link boot_third_id. So create the
+ * mapping in advance.
*/
- create_table_entry boot_pgtable, boot_second_id, r9, 1
- create_table_entry boot_second_id, boot_third_id, r9, 2
create_mapping_entry boot_third_id, r9, r9
/*
- * Find the first slot used. If the slot is not the same
- * as TEMPORARY_AREA_FIRST_SLOT, then we will want to switch
- * to the temporary mapping before jumping to the runtime
- * virtual mapping.
+ * Find the first slot used. If the slot is not XEN_FIRST_SLOT,
+ * then the 1:1 mapping will use its own set of page-tables from
+ * the second level.
*/
get_table_slot r1, r9, 1 /* r1 := first slot */
- cmp r1, #TEMPORARY_AREA_FIRST_SLOT
- bne use_temporary_mapping
+ cmp r1, #XEN_FIRST_SLOT
+ beq 1f
+ create_table_entry boot_pgtable, boot_second_id, r9, 1
+ b link_from_second_id
- mov_w r0, XEN_VIRT_START
- create_table_entry boot_pgtable, boot_second, r0, 1
+1:
+ /*
+ * Find the second slot used. If the slot is XEN_SECOND_SLOT, then the
+ * 1:1 mapping will use its own set of page-tables from the
+ * third level.
+ */
+ get_table_slot r1, r9, 2 /* r1 := second slot */
+ cmp r1, #XEN_SECOND_SLOT
+ beq virtphys_clash
+ create_table_entry boot_second, boot_third_id, r9, 2
+ b link_from_third_id
+
+link_from_second_id:
+ create_table_entry boot_second_id, boot_third_id, r9, 2
+link_from_third_id:
+ /* Good news, we are not clashing with Xen virtual mapping */
mov r12, #0 /* r12 := temporary mapping not created */
mov pc, lr
-use_temporary_mapping:
+virtphys_clash:
/*
- * The identity mapping is not using the first slot
- * TEMPORARY_AREA_FIRST_SLOT. Create a temporary mapping.
- * See switch_to_runtime_mapping for more details.
+ * The identity map clashes with boot_third. Link boot_first_id and
+ * map Xen to a temporary mapping. See switch_to_runtime_mapping
+ * for more details.
*/
+ PRINT("- Virt and Phys addresses clash -\r\n")
PRINT("- Create temporary mapping -\r\n")
+ /*
+ * This will override the link to boot_second in XEN_FIRST_SLOT.
+ * The page-tables are not live yet. So no need to use
+ * break-before-make.
+ */
+ create_table_entry boot_pgtable, boot_second_id, r9, 1
+ create_table_entry boot_second_id, boot_third_id, r9, 2
+
/* Map boot_second (cover Xen mappings) to the temporary 1st slot */
mov_w r0, TEMPORARY_XEN_VIRT_START
create_table_entry boot_pgtable, boot_second, r0, 1
@@ -641,13 +675,33 @@ remove_identity_mapping:
/* r2:r3 := invalid page-table entry */
mov r2, #0x0
mov r3, #0x0
-
- /* Find the first slot used and remove it */
+ /*
+ * Find the first slot used. Remove the entry for the first
+ * table if the slot is not XEN_FIRST_SLOT.
+ */
get_table_slot r1, r9, 1 /* r1 := first slot */
+ cmp r1, #XEN_FIRST_SLOT
+ beq 1f
+ /* It is not in slot 0, remove the entry */
mov_w r0, boot_pgtable /* r0 := root table */
lsl r1, r1, #3 /* r1 := Slot offset */
strd r2, r3, [r0, r1]
+ b identity_mapping_removed
+
+1:
+ /*
+ * Find the second slot used. Remove the entry for the first
+ * table if the slot is not XEN_SECOND_SLOT.
+ */
+ get_table_slot r1, r9, 2 /* r1 := second slot */
+ cmp r1, #XEN_SECOND_SLOT
+ beq identity_mapping_removed
+ /* It is not in slot 1, remove the entry */
+ mov_w r0, boot_second /* r0 := second table */
+ lsl r1, r1, #3 /* r1 := Slot offset */
+ strd r2, r3, [r0, r1]
+identity_mapping_removed:
flush_xen_tlb_local r0
mov pc, lr
ENDPROC(remove_identity_mapping)
--
generated by git-patchbot for /home/xen/git/xen.git#master
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |