svn commit: r368633 - head/sys/arm64/arm64
Michal Meloun
mmel at FreeBSD.org
Mon Dec 14 11:57:44 UTC 2020
Author: mmel
Date: Mon Dec 14 11:57:43 2020
New Revision: 368633
URL: https://svnweb.freebsd.org/changeset/base/368633
Log:
Verify (and fix) the context_id argument passed to the mpentry () by PSCI.
Some older PSCI implementations corrupt (or do not pass) the context_id
argument to newly started secondary cores. Although the ideal solution to this
problem is u-boot update, we can find the correct value for the argument (cpuid)
by comparing of real core mpidr register with the value stored in pcu->mpidr.
MFC after: 2 weeks
Modified:
head/sys/arm64/arm64/mp_machdep.c
Modified: head/sys/arm64/arm64/mp_machdep.c
==============================================================================
--- head/sys/arm64/arm64/mp_machdep.c Mon Dec 14 11:56:16 2020 (r368632)
+++ head/sys/arm64/arm64/mp_machdep.c Mon Dec 14 11:57:43 2020 (r368633)
@@ -206,6 +206,21 @@ init_secondary(uint64_t cpu)
{
struct pcpu *pcpup;
pmap_t pmap0;
+ u_int mpidr;
+
+ /*
+ * 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 || __pcpu[cpu].pc_mpidr != mpidr) {
+ for (cpu = 0; cpu < mp_maxid; cpu++)
+ if (__pcpu[cpu].pc_mpidr == mpidr)
+ break;
+ if ( cpu >= MAXCPU)
+ panic("MPIDR for this CPU is not in pcpu table");
+ }
pcpup = &__pcpu[cpu];
/*
More information about the svn-src-head
mailing list