コンテキスト初期化時にVFPレジスタバッファを全クリア。

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@159 b871894f-2f95-9b40-918c-086798483c85
This commit is contained in:
nakasima 2009-01-07 03:07:55 +00:00
parent 0485b1ff1e
commit 8de797bd19

View File

@ -30,17 +30,16 @@
Returns: none
*---------------------------------------------------------------------------*/
#include <brom/code32.h>
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