/** * \file * * * \brief ARM context switch * * \version $Id: proc.c 18271 2007-10-11 14:51:31Z batt $ * * \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. */ /* * To work correctly the lr should point to proc_exit, so when process finish * could be return */ push {lr} /* Add one element on stack, for next switching */ 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. */ pop {r0} /* pop on stack address of the process that we want to jump */ mov pc, r0