X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=kern%2Fswitch_arm.S;fp=kern%2Fswitch_arm.S;h=808b712faad8ab6eaba51383d4c0d6f2249a0361;hb=567718e7a363d331a9d5a90834679e64822f475a;hp=0000000000000000000000000000000000000000;hpb=96bda3a8889719af5e4475aaf853487f2e99e01f;p=bertos.git diff --git a/kern/switch_arm.S b/kern/switch_arm.S new file mode 100644 index 00000000..808b712f --- /dev/null +++ b/kern/switch_arm.S @@ -0,0 +1,68 @@ +/** + * \file + * + * + * \brief ARM context switch + * + * \version $Id: proc.c 18271 2007-10-11 14:51:31Z batt $ + * + * \author Stefano Fedrigo + * \author Francesco Sacchi + */ + + +/* + * NOTE: At each change of this function affecting proc.c + * (i.e. arguments, data stored in the stack) bump up version + * number in asm_switch_version(). + */ + +/* void asm_switch_context(void **new_sp, void **save_sp) */ +.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 + + +/* int asm_switch_version(void) */ +.globl asm_switch_version +asm_switch_version: + mov r0, #1 + mov pc, lr