|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3 11/18] xen/arm: Enable use of dump_pt_walk() early during boot
On Mon, 12 Dec 2022, Julien Grall wrote:
> From: Julien Grall <jgrall@xxxxxxxxxx>
>
> At the moment, dump_pt_walk() is using map_domain_page() to map
> the page tables.
>
> map_domain_page() is only usuable after init_domheap_mappings() is called
> (arm32) or the xenheap has been initialized (arm64).
>
> This means it can be hard to diagnose incorrect page-tables during
> early boot. So update dump_pt_walk() to xen_{, un}map_table() instead.
>
> Note that the two helpers are moved earlier to avoid forward declaring
> them.
>
> Signed-off-by: Julien Grall <jgrall@xxxxxxxxxx>
Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
> ---
> xen/arch/arm/mm.c | 56 +++++++++++++++++++++++------------------------
> 1 file changed, 28 insertions(+), 28 deletions(-)
>
> diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c
> index 1315a2c87db7..d0b1cf55f550 100644
> --- a/xen/arch/arm/mm.c
> +++ b/xen/arch/arm/mm.c
> @@ -191,6 +191,30 @@ static void __init __maybe_unused build_assertions(void)
> #undef CHECK_DIFFERENT_SLOT
> }
>
> +static lpae_t *xen_map_table(mfn_t mfn)
> +{
> + /*
> + * During early boot, map_domain_page() may be unusable. Use the
> + * PMAP to map temporarily a page-table.
> + */
> + if ( system_state == SYS_STATE_early_boot )
> + return pmap_map(mfn);
> +
> + return map_domain_page(mfn);
> +}
> +
> +static void xen_unmap_table(const lpae_t *table)
> +{
> + /*
> + * During early boot, xen_map_table() will not use map_domain_page()
> + * but the PMAP.
> + */
> + if ( system_state == SYS_STATE_early_boot )
> + pmap_unmap(table);
> + else
> + unmap_domain_page(table);
> +}
> +
> void dump_pt_walk(paddr_t ttbr, paddr_t addr,
> unsigned int root_level,
> unsigned int nr_root_tables)
> @@ -230,7 +254,7 @@ void dump_pt_walk(paddr_t ttbr, paddr_t addr,
> else
> root_table = 0;
>
> - mapping = map_domain_page(mfn_add(root_mfn, root_table));
> + mapping = xen_map_table(mfn_add(root_mfn, root_table));
>
> for ( level = root_level; ; level++ )
> {
> @@ -246,11 +270,11 @@ void dump_pt_walk(paddr_t ttbr, paddr_t addr,
> break;
>
> /* For next iteration */
> - unmap_domain_page(mapping);
> - mapping = map_domain_page(lpae_get_mfn(pte));
> + xen_unmap_table(mapping);
> + mapping = xen_map_table(lpae_get_mfn(pte));
> }
>
> - unmap_domain_page(mapping);
> + xen_unmap_table(mapping);
> }
>
> void dump_hyp_walk(vaddr_t addr)
> @@ -713,30 +737,6 @@ void *ioremap(paddr_t pa, size_t len)
> return ioremap_attr(pa, len, PAGE_HYPERVISOR_NOCACHE);
> }
>
> -static lpae_t *xen_map_table(mfn_t mfn)
> -{
> - /*
> - * During early boot, map_domain_page() may be unusable. Use the
> - * PMAP to map temporarily a page-table.
> - */
> - if ( system_state == SYS_STATE_early_boot )
> - return pmap_map(mfn);
> -
> - return map_domain_page(mfn);
> -}
> -
> -static void xen_unmap_table(const lpae_t *table)
> -{
> - /*
> - * During early boot, xen_map_table() will not use map_domain_page()
> - * but the PMAP.
> - */
> - if ( system_state == SYS_STATE_early_boot )
> - pmap_unmap(table);
> - else
> - unmap_domain_page(table);
> -}
> -
> static int create_xen_table(lpae_t *entry)
> {
> mfn_t mfn;
> --
> 2.38.1
>
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |