|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v1 repost 2/4] arm/smpboot: Move smp_up_cpu to a new section .data.idmap
Hi Julien,
On 16/01/2024 15:37, Julien Grall wrote:
>
>
> From: Julien Grall <jgrall@xxxxxxxxxx>
>
> With the upcoming work to color Xen, the binary will not be anymore
> physically contiguous. This will be a problem during boot as the
> assembly code will need to work out where each piece of Xen reside.
>
> An easy way to solve the issue is to have all code/data accessed
> by the secondary CPUs while the MMU is off within a single page.
>
> Right now, smp_up_cpu is used by secondary CPUs to wait there turn for
s/there/their ?
> booting before the MMU is on. Yet it is currently in .data which is
> unlikely to be within the same page as the rest of the idmap.
>
> Move smp_up_cpu to the recently create section .data.idmap. The idmap is
s/create/created
> currently part of the text section and therefore will be mapped read-onl
s/onl/only
> executable. This means that we need to temporarily remap
> smp_up_cpu in order to update it.
>
> Introduce a new function set_smp_up_cpu() for this purpose so the code
> is not duplicated between when opening and closing the gate.
>
> Signed-off-by: Julien Grall <jgrall@xxxxxxxxxx>
Reviewed-by: Michal Orzel <michal.orzel@xxxxxxx>
> ---
> xen/arch/arm/smpboot.c | 36 +++++++++++++++++++++++++++++++-----
> 1 file changed, 31 insertions(+), 5 deletions(-)
>
> diff --git a/xen/arch/arm/smpboot.c b/xen/arch/arm/smpboot.c
> index 7110bc11fc05..8d508a1bb258 100644
> --- a/xen/arch/arm/smpboot.c
> +++ b/xen/arch/arm/smpboot.c
> @@ -29,6 +29,10 @@
> #include <asm/psci.h>
> #include <asm/acpi.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))
> +
> cpumask_t cpu_online_map;
> cpumask_t cpu_present_map;
> cpumask_t cpu_possible_map;
> @@ -56,7 +60,7 @@ struct init_info init_data =
> };
>
> /* Shared state for coordinating CPU bringup */
> -unsigned long smp_up_cpu = MPIDR_INVALID;
> +unsigned long __section(".data.idmap") smp_up_cpu = MPIDR_INVALID;
> /* Shared state for coordinating CPU teardown */
> static bool cpu_is_dead;
>
> @@ -429,6 +433,28 @@ void stop_cpu(void)
> wfi();
> }
>
> +static void set_smp_up_cpu(unsigned long mpidr)
> +{
> + /*
> + * smp_up_cpu is part of the identity mapping which is read-only. So
> + * We need to re-map the region so it can be updated.
> + */
> + void *ptr = map_domain_page(virt_to_mfn(&smp_up_cpu));
> +
> + ptr += PAGE_OFFSET(&smp_up_cpu);
> +
> + *(unsigned long *)ptr = mpidr;
> +
> + /*
> + * init_ttbr will be accessed with the MMU off, so ensure the update
smp_up_cpu instead of init_ttbr
> + * is visible by cleaning the cache.
> + */
> + clean_dcache(ptr);
> +
> + unmap_domain_page(ptr);
> +
> +}
> +
> int __init cpu_up_send_sgi(int cpu)
> {
> /* We don't know the GIC ID of the CPU until it has woken up, so just
> @@ -460,8 +486,7 @@ int __cpu_up(unsigned int cpu)
> init_data.cpuid = cpu;
>
> /* Open the gate for this CPU */
> - smp_up_cpu = cpu_logical_map(cpu);
> - clean_dcache(smp_up_cpu);
> + set_smp_up_cpu(cpu_logical_map(cpu));
>
> rc = arch_cpu_up(cpu);
>
> @@ -497,8 +522,9 @@ int __cpu_up(unsigned int cpu)
> */
> init_data.stack = NULL;
> init_data.cpuid = ~0;
> - smp_up_cpu = MPIDR_INVALID;
> - clean_dcache(smp_up_cpu);
> +
> + set_smp_up_cpu(MPIDR_INVALID);
> +
> arch_cpu_up_finish();
>
> if ( !cpu_online(cpu) )
> --
> 2.40.1
>
~Michal
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |