.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. */
ldmfd sp!, {r2, r4-r11, lr} /* Load new registers. */
msr cpsr, r2 /* restore flags reg. */
- mov pc, lr
+ pop {r0} /* pop on stack address of the process that we want to jump */
+ mov pc, r0
#elif CPU_ARM
- #define CPU_SAVED_REGS_CNT 9
+ #define CPU_SAVED_REGS_CNT 10
#define CPU_STACK_GROWS_UPWARD 0
#define CPU_SP_ON_EMPTY_SLOT 0
* - ARM state.
* - CPU in Supervisor Mode (SVC).
*/
- #define CPU_REG_INIT_VALUE(reg) (reg == (CPU_SAVED_REGS_CNT - 1) ? 0x13 : 0)
+ #define CPU_REG_INIT_VALUE(reg) \
+ ({ int a = 0; \
+ if(reg == 0) \
+ a = (int)proc_exit; \
+ else if(reg == (CPU_SAVED_REGS_CNT - 1)) \
+ a = 0x13; \
+ a; \
+ })
#elif CPU_PPC