diff --git a/trunk/bootrom/build/libraries/os/common/os_context.c b/trunk/bootrom/build/libraries/os/common/os_context.c index 8df225e..578acf3 100644 --- a/trunk/bootrom/build/libraries/os/common/os_context.c +++ b/trunk/bootrom/build/libraries/os/common/os_context.c @@ -30,17 +30,16 @@ Returns: none *---------------------------------------------------------------------------*/ #include -asm void osInitContext( - register OSContext* context, - register u32 newpc, - register u32 newsp - ) +asm void osInitContext( OSContext* context, u32 newpc, u32 newsp ) { -#define context r0 +#define context r12 #define newpc r1 #define newsp r2 - // ---- 実行位置保存 (r0 = context) + stmfd sp!, { r4-r7, lr } + mov context, r0 + + // ---- 実行位置保存 (r12 = context) add newpc, newpc, #4 str newpc, [ context, #OS_CONTEXT_PC_PLUS4 ] @@ -60,27 +59,29 @@ asm void osInitContext( str r1, [ context, #OS_CONTEXT_CPSR ] // ---- 他のレジスタをクリア + mov r0, #0 mov r1, #0 - str r1, [ context, #OS_CONTEXT_R0 ] - str r1, [ context, #OS_CONTEXT_R1 ] - str r1, [ context, #OS_CONTEXT_R2 ] - str r1, [ context, #OS_CONTEXT_R3 ] - str r1, [ context, #OS_CONTEXT_R4 ] - str r1, [ context, #OS_CONTEXT_R5 ] - str r1, [ context, #OS_CONTEXT_R6 ] - str r1, [ context, #OS_CONTEXT_R7 ] - str r1, [ context, #OS_CONTEXT_R8 ] - str r1, [ context, #OS_CONTEXT_R9 ] - str r1, [ context, #OS_CONTEXT_R10 ] - str r1, [ context, #OS_CONTEXT_R11 ] - str r1, [ context, #OS_CONTEXT_R12 ] - str r1, [ context, #OS_CONTEXT_LR ] + mov r2, #0 + mov r3, #0 + stmfd sp!, { r0-r3 } + ldmia sp, { r4-r7 } - // ---- VFPレジスタを初期化 + add lr, context, #__cpp(offsetof(OSContext,r[0])) + stmia lr!, { r0-r7 } // r0-r7 + stmia lr!, { r0-r4 } // r8-r12 + str r1, [ context, #__cpp(offsetof(OSContext,lr)) ] // lr + + // ---- VFPレジスタをクリア(VFP例外で初期化) #ifdef SDK_CONTEXT_HAS_VFP - str r1, [ context, #__cpp(offsetof(OSContext,fpexc)) ] + add lr, context, #__cpp(offsetof(OSContext,fpexc)) + stmia lr!, { r0-r1 } // fpexc, fpscr + stmia lr!, { r0-r7 } // f0-f7 + stmia lr!, { r0-r7 } // f8-f15 + stmia lr!, { r0-r7 } // f16-f23 + stmia lr!, { r0-r7 } // f24-f31 #endif + ldmfd sp!, { r0-r7, lr } bx lr // start here and swicth arm/thumb mode #undef context