fix: cactus entry point get core linear id
In the cactus entry point there is remnant call to the platform specific
physical MPIDR to linear id conversion routine. This is incorrect
because S-EL1 read of MPIDR is emulated by the SPMC and returns the vCPU
linear id rather than the physical MPIDR.
Add a check that the core linear id inferred by MPIDR is matching the id
passed by the SPMC through x4. This feature was added to support legacy
TEEs expecting the core linear id to be passed by TF-A.
Signed-off-by: Olivier Deprez <olivier.deprez@arm.com>
Change-Id: I6902e8f06ab6c79953f6891e582fc8975825a6c4
diff --git a/spm/cactus/aarch64/cactus_entrypoint.S b/spm/cactus/aarch64/cactus_entrypoint.S
index 6eff65e..17f0798 100644
--- a/spm/cactus/aarch64/cactus_entrypoint.S
+++ b/spm/cactus/aarch64/cactus_entrypoint.S
@@ -20,22 +20,33 @@
func cactus_entrypoint
/* Entry reason is primary EC cold boot */
mov x19, #1
+
+ /* Fall-through. */
+
secondary_cold_entry:
/*
+ * Entry reason is secondary EC cold boot (or primary EC cold
+ * boot from above).
+ */
+
+ /*
* x0 holds a pointer to the Boot Information Blob.
* Save it for later usage.
*/
mov x20, x0
- /* Get the vMPIDR. The SPMC passes the vCPU linear id in lower bits. */
+ /* The SPMC passes the vCPU id in vMPIDR low bits. */
mrs x0, mpidr_el1
bic x0, x0, #0x80000000
- /* Entry reason is secondary EC cold boot */
- mrs x0, mpidr_el1
- bl platform_get_core_pos
+ /*
+ * To maintain legacy, the SPMC passes the physical core id through x4.
+ * For a MP SP check the physical core id matches the vCPU id.
+ */
+ cmp x4, x0
+ bne .
- /* Setup the stack pointer. */
+ /* Setup the stack pointer (from the linear id stored in x0). */
adr x1, stacks_end
mov x2, #SP_STACKS_SIZE
mul x2, x0, x2