|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v4 12/14] xen/arm64: mm: Introduce helpers to prepare/enable/disable the identity mapping
Hi Julien,
On 13/01/2023 11:11, Julien Grall wrote:
>
>
> From: Julien Grall <jgrall@xxxxxxxxxx>
>
> In follow-up patches we will need to have part of Xen identity mapped in
> order to safely switch the TTBR.
>
> On some platform, the identity mapping may have to start at 0. If we always
> keep the identity region mapped, NULL pointer dereference would lead to
> access to valid mapping.
>
> It would be possible to relocate Xen to avoid clashing with address 0.
> However the identity mapping is only meant to be used in very limited
> places. Therefore it would be better to keep the identity region invalid
> for most of the time.
>
> Two new external helpers are introduced:
> - arch_setup_page_tables() will setup the page-tables so it is
> easy to create the mapping afterwards.
> - update_identity_mapping() will create/remove the identity mapping
>
> Signed-off-by: Julien Grall <jgrall@xxxxxxxxxx>
>
> ----
> Changes in v4:
> - Fix typo in a comment
> - Clarify which page-tables are updated
>
> Changes in v2:
> - Remove the arm32 part
> - Use a different logic for the boot page tables and runtime
> one because Xen may be running in a different place.
> ---
> xen/arch/arm/arm64/Makefile | 1 +
> xen/arch/arm/arm64/mm.c | 130 ++++++++++++++++++++++++++++
> xen/arch/arm/include/asm/arm32/mm.h | 4 +
> xen/arch/arm/include/asm/arm64/mm.h | 13 +++
> xen/arch/arm/include/asm/setup.h | 11 +++
> xen/arch/arm/mm.c | 6 +-
> 6 files changed, 163 insertions(+), 2 deletions(-)
> create mode 100644 xen/arch/arm/arm64/mm.c
>
> diff --git a/xen/arch/arm/arm64/Makefile b/xen/arch/arm/arm64/Makefile
> index 6d507da0d44d..28481393e98f 100644
> --- a/xen/arch/arm/arm64/Makefile
> +++ b/xen/arch/arm/arm64/Makefile
> @@ -10,6 +10,7 @@ obj-y += entry.o
> obj-y += head.o
> obj-y += insn.o
> obj-$(CONFIG_LIVEPATCH) += livepatch.o
> +obj-y += mm.o
> obj-y += smc.o
> obj-y += smpboot.o
> obj-y += traps.o
> diff --git a/xen/arch/arm/arm64/mm.c b/xen/arch/arm/arm64/mm.c
> new file mode 100644
> index 000000000000..798ae93ad73c
> --- /dev/null
> +++ b/xen/arch/arm/arm64/mm.c
> @@ -0,0 +1,130 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +
> +#include <xen/init.h>
> +#include <xen/mm.h>
> +
> +#include <asm/setup.h>
> +
> +/* Override macros from asm/page.h to make them work with mfn_t */
> +#undef virt_to_mfn
> +#define virt_to_mfn(va) _mfn(__virt_to_mfn(va))
> +
> +static DEFINE_PAGE_TABLE(xen_first_id);
> +static DEFINE_PAGE_TABLE(xen_second_id);
> +static DEFINE_PAGE_TABLE(xen_third_id);
> +
> +/*
> + * The identity mapping may start at physical address 0. So we don't want
> + * to keep it mapped longer than necessary.
> + *
> + * When this is called, we are still using the boot_pgtable.
> + *
> + * We need to prepare the identity mapping for both the boot page tables
> + * and runtime page tables.
> + *
> + * The logic to create the entry is slightly different because Xen may
> + * be running at a different location at runtime.
> + */
> +static void __init prepare_boot_identity_mapping(void)
> +{
> + paddr_t id_addr = virt_to_maddr(_start);
> + lpae_t pte;
> + DECLARE_OFFSETS(id_offsets, id_addr);
> +
> + /*
> + * We will be re-using the boot ID tables. They may not have been
> + * zeroed but they should be unlinked. So it is fine to use
> + * clear_page().
> + */
> + clear_page(boot_first_id);
> + clear_page(boot_second_id);
> + clear_page(boot_third_id);
> +
> + if ( id_offsets[0] != 0 )
> + panic("Cannot handled ID mapping above 512GB\n");
I might be lost but didn't we say before that we can load Xen in the first 2TB?
Then, how does this check correspond to it?
~Michal
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |