Target startup code: CONTROL_S.SPSEL and PSP?
Open, Needs TriagePublic

Description

While investigating Mbed OS startup code, I stumbled across the following anomalous (within Mbed OS) code, derived from TF-M:

MRS     R0, control    ; Get control value
MOVS    R1, #2
ORRS    R0, R0, R1     ; Select switch to PSP
MSR     control, R0

This caused (me) some confusion, and I deleted it assuming it to be dead code (https://github.com/ARMmbed/mbed-os/pull/11698). But it looks like TF-M is relying on it, as it never seems to manipulate CONTROL_S.SPSEL itself.

It seems strange that TF-M is getting each target to do that itself. Why isn't TF-M setting this up itself in common code, just as it sets up PSP and PSPLIM?

I see some TF-M startups like mps2_an519 go on to do

LDR     R0, =|Image$$ARM_LIB_STACK$$ZI$$Limit|
MOVS    R1, #7
BICS    R0, R1         ; Make sure that the SP address is aligned to 8
MOV     SP, R0         ; Initialise PSP

And that seems wrong to me. That is running in Handler mode, so SPSEL will not have had any effect, so that's actually setting MSP, not PSP. Isn't it? And PSP doesn't need initialising anyway?

kjbracey-arm updated the task description. (Show Details)