解读TF-M中Arch V8m的一段汇编代码
汇编看不懂,就去问ChatGPT。
这是一段v8m mainline的汇编代码
__naked void arch_non_preempt_call(uintptr_t fn_addr, uintptr_t frame_addr,
uint32_t stk_base, uint32_t stk_limit)
{
__asm volatile(
SYNTAX_UNIFIED
" push {r4-r6, lr} \n"
" cpsid i \n"
" isb \n"
" mov r4, r2 \n"
" mrs r5, psplim \n"
" movs r12, #0 \n"
" cmp r2, #0 \n"
" itttt ne \n" /* To callee stack */
" msrne psplim, r12 \n"
" movne r4, sp \n"
" movne sp, r2 \n"
" msrne psplim, r3 \n"
" ldr r2, =scheduler_lock \n" /* To lock sched */
" movs r3, #"M2S(SCHEDULER_LOCKED)" \n"
" str r3, [r2, #0] \n"
" cpsie i \n"
" isb \n"
" mov r6, r1 \n"
" bl cross_call_entering_c \n"
" cpsid i \n"
" isb \n"
" mov r1, r6 \n"
" bl cross_call_exiting_c \n"
" movs r12, #0 \n"
" cmp r4, #0 \n"
" ittt ne \n" /* To caller stack */
" msrne psplim, r12 \n"
" movne sp, r4 \n"
" msrne psplim, r5 \n"
" cpsie i \n"
" isb \n"
" pop {r4-r6, pc} \n"
);
}
__naked
void arch_cross_call_entry(uint32_t a0, uint32_t a1, uint32_t a2, uint32_t a3)
{
__asm volatile(
SYNTAX_UNIFIED
" push {r4-r6, lr} \n"
" mov r4, r12 \n"
" push {r0-r5} \n"
" cpsid i \n"
" isb \n"
" bl cross_call_entering_c \n" /* r0: new SP, r1: new PSPLIM */
" mov r6, sp \n"
" mov r4, r0 \n"
" mrs r5, psplim \n"
" cmp r4, #0 \n"
" itttt ne \n"
" movsne r2, #0 \n"
" msrne psplim, r2 \n"
" movne sp, r0 \n" /* To SPM stack */
" msrne psplim, r1 \n"
" cpsie i \n"
" isb \n"
" push {r4, r5} \n"
" ldmia r6!, {r0-r5} \n" /* Load PSA interface input args
* and target function
*/
" blx r4 \n"
" cpsid i \n"
" isb \n"
" bl cross_call_exiting_c \n"
" pop {r4, r5} \n"
" cmp r4, #0 \n"
" ittt ne \n"
" movsne r2, #0 \n"
" msrne psplim, r2 \n"
" msrne psplim, r5 \n" /* To caller stack */
" mov sp, r6 \n"
" cpsie i \n"
" isb \n"
" pop {r4-r6, pc} \n"
);
}