diff options
author | red031000 <rubenru09@aol.com> | 2020-05-21 23:30:24 +0100 |
---|---|---|
committer | red031000 <rubenru09@aol.com> | 2020-05-21 23:30:24 +0100 |
commit | 3c62c1ee513696153e6c554c0d97557b56a4c997 (patch) | |
tree | df84b50deef93a23939e9410afdc3d7998de97fd | |
parent | b4d6f1314b3b322afabe85d848e09a36d4e7a47a (diff) |
OSi_DoLockByWord
-rw-r--r-- | arm9/asm/OS_spinLock_asm.s | 34 | ||||
-rw-r--r-- | arm9/global.inc | 1 | ||||
-rw-r--r-- | arm9/lib/include/OS_spinLock.h | 2 | ||||
-rw-r--r-- | arm9/lib/src/OS_spinLock.c | 13 |
4 files changed, 20 insertions, 30 deletions
diff --git a/arm9/asm/OS_spinLock_asm.s b/arm9/asm/OS_spinLock_asm.s index dd8ada80..d469ed75 100644 --- a/arm9/asm/OS_spinLock_asm.s +++ b/arm9/asm/OS_spinLock_asm.s @@ -1,6 +1,5 @@ .include "asm/macros.inc" .include "global.inc" - .extern isInitialized .text @@ -147,13 +146,13 @@ _020CA204: .word OSi_FreeCartridgeBus arm_func_start OS_LockCartridge OS_LockCartridge: ; 0x020CA208 - ldr ip, _020CA21C ; =FUN_020CA358 + ldr ip, _020CA21C ; =OSi_DoLockByWord ldr r1, _020CA220 ; =0x027FFFE8 ldr r2, _020CA224 ; =OSi_AllocateCartridgeBus mov r3, #0x1 bx r12 .balign 4 -_020CA21C: .word FUN_020CA358 +_020CA21C: .word OSi_DoLockByWord _020CA220: .word 0x027FFFE8 _020CA224: .word OSi_AllocateCartridgeBus @@ -252,33 +251,8 @@ _020CA338: arm_func_start OS_TryLockByWord OS_TryLockByWord: ; 0x020CA348 - ldr ip, _020CA354 ; =FUN_020CA358 + ldr ip, _020CA354 ; =OSi_DoLockByWord mov r3, #0x0 bx r12 .balign 4 -_020CA354: .word FUN_020CA358 - - arm_func_start FUN_020CA358 -FUN_020CA358: ; 0x020CA358 - stmdb sp!, {r4-r8,lr} - mov r8, r0 - mov r7, r1 - mov r6, r2 - mov r5, r3 - bl OSi_DoTryLockByWord - cmp r0, #0x0 - ldmleia sp!, {r4-r8,lr} - bxle lr - mov r4, #0x400 -_020CA380: - mov r0, r4 - bl SVC_WaitByLoop - mov r0, r8 - mov r1, r7 - mov r2, r6 - mov r3, r5 - bl OSi_DoTryLockByWord - cmp r0, #0x0 - bgt _020CA380 - ldmia sp!, {r4-r8,lr} - bx lr +_020CA354: .word OSi_DoLockByWord diff --git a/arm9/global.inc b/arm9/global.inc index 3185d0e4..1d474f13 100644 --- a/arm9/global.inc +++ b/arm9/global.inc @@ -6447,6 +6447,7 @@ .extern OSi_AlarmQueue
.extern OSi_CurrentThreadPtr
.extern OSi_DebuggerHandler
+.extern OSi_DoLockByWord
.extern OSi_DoResetSystem
.extern OSi_EnterDmaCallback
.extern OSi_EnterTimerCallback
diff --git a/arm9/lib/include/OS_spinLock.h b/arm9/lib/include/OS_spinLock.h index 7711b423..208cb677 100644 --- a/arm9/lib/include/OS_spinLock.h +++ b/arm9/lib/include/OS_spinLock.h @@ -20,6 +20,8 @@ static inline void OSi_WaitByLoop() } void OS_InitLock(); +s32 OSi_DoLockByWord(u16 lockId, OSLockWord *lockp, void (*ctrlFuncp) (void), + BOOL disableFiq); s32 OS_GetLockID(void); #endif //POKEDIAMOND_OS_SPINLOCK_H diff --git a/arm9/lib/src/OS_spinLock.c b/arm9/lib/src/OS_spinLock.c index 46309c42..45e29ab8 100644 --- a/arm9/lib/src/OS_spinLock.c +++ b/arm9/lib/src/OS_spinLock.c @@ -10,6 +10,8 @@ extern void OS_TryLockByWord(u16 param1, OSLockWord* lockp, void* func); extern void OS_UnlockByWord(u16 param1, OSLockWord* lockp, void* func); extern void MIi_CpuClear32(u32 param1, void * addr, u32 length); //not too sure about names +extern s32 OSi_DoTryLockByWord(u16 lockId, OSLockWord *lockp, void (*ctrlFuncp) (void), + BOOL disableFiq); ARM_FUNC void OS_InitLock() { @@ -44,3 +46,14 @@ ARM_FUNC void OS_InitLock() OS_UnlockByWord(0x7e, lockp, NULL); OS_TryLockByWord(0x7f, lockp, NULL); } + +ARM_FUNC s32 OSi_DoLockByWord(u16 lockId, OSLockWord *lockp, void (*ctrlFuncp) (void), //should be static + BOOL disableFiq) +{ + s32 lastLockFlag; + while ((lastLockFlag = OSi_DoTryLockByWord(lockId, lockp, ctrlFuncp, disableFiq)) > 0) { + OSi_WaitByLoop(); + } + + return lastLockFlag; +} |