|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v4 10/14] xen/arm32: head: Widen the use of the temporary mapping
Hi Julien,
On 13/01/2023 11:11, Julien Grall wrote:
>
>
> From: Julien Grall <jgrall@xxxxxxxxxx>
>
> At the moment, the temporary mapping is only used when the virtual
> runtime region of Xen is clashing with the physical region.
>
> In follow-up patches, we will rework how secondary CPU bring-up works
> and it will be convenient to use the fixmap area for accessing
> the root page-table (it is per-cpu).
>
> Rework the code to use temporary mapping when the Xen physical address
> is not overlapping with the temporary mapping.
>
> This also has the advantage to simplify the logic to identity map
> Xen.
>
> Signed-off-by: Julien Grall <jgrall@xxxxxxxxxx>
>
> ----
>
> Even if this patch is rewriting part of the previous patch, I decided
> to keep them separated to help the review.
>
> The "folow-up patches" are still in draft at the moment. I still haven't
> find a way to split them nicely and not require too much more work
> in the coloring side.
>
> I have provided some medium-term goal in the cover letter.
>
> Changes in v3:
> - Resolve conflicts after switching from "ldr rX, <label>" to
> "mov_w rX, <label>" in a previous patch
>
> Changes in v2:
> - Patch added
> ---
> xen/arch/arm/arm32/head.S | 82 +++++++--------------------------------
> 1 file changed, 15 insertions(+), 67 deletions(-)
>
> diff --git a/xen/arch/arm/arm32/head.S b/xen/arch/arm/arm32/head.S
> index 3800efb44169..ce858e9fc4da 100644
> --- a/xen/arch/arm/arm32/head.S
> +++ b/xen/arch/arm/arm32/head.S
> @@ -459,7 +459,6 @@ 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: */
> @@ -479,67 +478,37 @@ 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 XEN_FIRST_SLOT,
> - * then the 1:1 mapping will use its own set of page-tables from
> - * the second level.
> + * Find the first slot used. If the slot is not the same
> + * as XEN_TMP_FIRST_SLOT, then we will want to switch
Do you mean TEMPORARY_AREA_FIRST_SLOT?
> + * to the temporary mapping before jumping to the runtime
> + * virtual mapping.
> */
> get_table_slot r1, r9, 1 /* r1 := first slot */
> - cmp r1, #XEN_FIRST_SLOT
> - beq 1f
> - create_table_entry boot_pgtable, boot_second_id, r9, 1
> - b link_from_second_id
> -
> -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
> + cmp r1, #TEMPORARY_AREA_FIRST_SLOT
> + bne use_temporary_mapping
>
> -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_w r0, XEN_VIRT_START
> + create_table_entry boot_pgtable, boot_second, r0, 1
> mov r12, #0 /* r12 := temporary mapping not created
> */
> mov pc, lr
>
> -virtphys_clash:
> +use_temporary_mapping:
> /*
> - * 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.
> + * 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.
> */
> - 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
Do we need to duplicate this if we just did the same in create_page_tables
before branching to
use_temporary_mapping?
~Michal
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |