/** * \file * * * \brief ARM context switch * * * \author Stefano Fedrigo * \author Francesco Sacchi */ /* void asm_switch_context(void **new_sp [r0], void **save_sp [r1]) */ .globl asm_switch_context asm_switch_context: mrs r2, cpsr /* Save status. */ stmfd sp!, {r2, r4-r11, lr} /* Save registers. */ str sp, [r1] /* Save old stack pointer. */ ldr sp, [r0] /* Load new stack pointer */ ldmfd sp!, {r2, r4-r11, lr} /* Load new registers. */ msr cpsr, r2 /* restore flags reg. */ mov pc, lr /* proc_entry trampoline needed because ARM does not pop return addresses from the stack, but uses lr instead.*/ .globl asm_proc_entry asm_proc_entry: mov lr, pc /* In r11 we have the real process entry point as set up by CPU_CREATE_NEW_STACK */ bx r11 bl proc_exit