Re: git: b9c0003f0fa3 - main - arm64: Initialize x18 for APs earlier during boot
- In reply to: Mark Johnston : "git: b9c0003f0fa3 - main - arm64: Initialize x18 for APs earlier during boot"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 29 Feb 2024 17:17:56 UTC
On 11/13/23 7:51 AM, Mark Johnston wrote:
> The branch main has been updated by markj:
>
> URL: https://cgit.FreeBSD.org/src/commit/?id=b9c0003f0fa39ead4bb3953b9118ae6f08e560f8
>
> commit b9c0003f0fa39ead4bb3953b9118ae6f08e560f8
> Author: Mark Johnston <markj@FreeBSD.org>
> AuthorDate: 2023-11-13 15:44:45 +0000
> Commit: Mark Johnston <markj@FreeBSD.org>
> CommitDate: 2023-11-13 15:44:45 +0000
>
> arm64: Initialize x18 for APs earlier during boot
>
> When KMSAN is configured, the instrumentation inserts calls to
> __msan_get_context_state() into all function prologues. The
> implementation dereferences curthread and thus assumes that x18 points
> to the PCPU area. This applies in particular to init_secondary(), which
> currently is responsible for initializing x18 for APs.
>
> Move initialization into locore to avoid this problem. No functional
> change intended.
>
> Reviewed by: kib, andrew
> MFC after: 2 weeks
> Sponsored by: Juniper Networks, Inc.
> Sponsored by: Klara, Inc.
> Differential Revision: https://reviews.freebsd.org/D42533
(Sorry for just now replying, I'm looking at this in more detail while merging
to CheriBSD)
I think we can remove a bunch of now-dead code from init_secondary after
this, and probably don't even need to pass the cpu number to init_secondary
either? That is:
void
init_secondary(uint64_t cpu)
{
struct pcpu *pcpup;
pmap_t pmap0;
uint64_t mpidr;
ptrauth_mp_start(cpu);
/*
* Verify that the value passed in 'cpu' argument (aka context_id) is
* valid. Some older U-Boot based PSCI implementations are buggy,
* they can pass random value in it.
*/
mpidr = READ_SPECIALREG(mpidr_el1) & CPU_AFF_MASK;
if (cpu >= MAXCPU || cpuid_to_pcpu[cpu] == NULL ||
PCPU_GET_MPIDR(cpuid_to_pcpu[cpu]) != mpidr) {
for (cpu = 0; cpu < mp_maxid; cpu++)
if (cpuid_to_pcpu[cpu] != NULL &&
PCPU_GET_MPIDR(cpuid_to_pcpu[cpu]) == mpidr)
break;
if ( cpu >= MAXCPU)
panic("MPIDR for this CPU is not in pcpu table");
}
/*
* Identify current CPU. This is necessary to setup
* affinity registers and to provide support for
* runtime chip identification.
*
* We need this before signalling the CPU is ready to
* let the boot CPU use the results.
*/
pcpup = cpuid_to_pcpu[cpu];
pcpup->pc_midr = get_midr();
identify_cpu(cpu);
Can I think instead become something like:
void
init_secondary(void)
{
struct pcpu *pcpup;
pmap_t pmap0;
uint64_t cpu;
cpu = PCPU_GET(cpuid);
ptrauth_mp_start(cpu);
/*
* Identify current CPU. This is necessary to setup
* affinity registers and to provide support for
* runtime chip identification.
*
* We need this before signalling the CPU is ready to
* let the boot CPU use the results.
*/
pcpup = get_pcpu();
pcpup->pc_midr = get_midr();
identify_cpu(cpu);
Maybe we want to keep an explicit panic if PCPU_GET_MPIDR(pcpup) doesn't
match the mpidr from the register?
--
John Baldwin