diff --git a/arch/arm64/include/arch/arm64/mp.h b/arch/arm64/include/arch/arm64/mp.h index 0b99d02a..fdd8a769 100644 --- a/arch/arm64/include/arch/arm64/mp.h +++ b/arch/arm64/include/arch/arm64/mp.h @@ -42,4 +42,7 @@ static inline uint arch_curr_cpu_num(void) { return pc->cpu_num; } +// Translate a CPU number back to the MPIDR of the CPU. +uint64_t arm64_cpu_num_to_mpidr(uint cpu_num); + __END_CDECLS diff --git a/arch/arm64/mp.c b/arch/arm64/mp.c index 70dc6f69..de10b82f 100644 --- a/arch/arm64/mp.c +++ b/arch/arm64/mp.c @@ -11,12 +11,12 @@ #include #include #include +#include #include #include #include #include #include -#include #include #include @@ -143,6 +143,20 @@ void arm64_secondary_entry(ulong asm_cpu_num) { } #endif // WITH_SMP +uint64_t arm64_cpu_num_to_mpidr(uint cpu_num) { +#if WITH_SMP + if (cpu_num == 0) { + return boot_percpu.mpidr; + } else if (unlikely(cpu_num > secondaries_to_init)) { + return UINT64_MAX; + } else { + return secondary_percpu[cpu_num - 1].mpidr; + } +#else + return boot_percpu.mpidr; +#endif +} + void arm64_mp_init(void) { #if WITH_SMP arm64_mp_init_percpu();