diff options
-rw-r--r-- | arm9/asm/OS_spinLock_asm.s | 60 | ||||
-rw-r--r-- | arm9/global.inc | 2 | ||||
-rw-r--r-- | arm9/lib/include/OS_spinLock.h | 3 | ||||
-rw-r--r-- | arm9/lib/src/OS_spinLock.c | 35 |
4 files changed, 42 insertions, 58 deletions
diff --git a/arm9/asm/OS_spinLock_asm.s b/arm9/asm/OS_spinLock_asm.s index d469ed75..65063819 100644 --- a/arm9/asm/OS_spinLock_asm.s +++ b/arm9/asm/OS_spinLock_asm.s @@ -134,13 +134,13 @@ _020CA1E4: .word OSi_AllocateCartridgeBus arm_func_start OS_UnlockCartridge2 OS_UnlockCartridge2: ; 0x020CA1E8 - ldr ip, _020CA1FC ; =FUN_020CA2B8 + ldr ip, _020CA1FC ; =OSi_DoUnlockByWord ldr r1, _020CA200 ; =0x027FFFE8 ldr r2, _020CA204 ; =OSi_FreeCartridgeBus mov r3, #0x1 bx r12 .balign 4 -_020CA1FC: .word FUN_020CA2B8 +_020CA1FC: .word OSi_DoUnlockByWord _020CA200: .word 0x027FFFE8 _020CA204: .word OSi_FreeCartridgeBus @@ -199,60 +199,8 @@ _020CA298: arm_func_start OS_UnlockByWord OS_UnlockByWord: ; 0x020CA2A8 - ldr ip, _020CA2B4 ; =FUN_020CA2B8 + ldr ip, _020CA2B4 ; =OSi_DoUnlockByWord mov r3, #0x0 bx r12 .balign 4 -_020CA2B4: .word FUN_020CA2B8 - - arm_func_start FUN_020CA2B8 -FUN_020CA2B8: ; 0x020CA2B8 - stmdb sp!, {r4-r7,lr} - sub sp, sp, #0x4 - mov r7, r1 - ldrh r1, [r7, #0x4] - mov r6, r2 - mov r5, r3 - cmp r0, r1 - addne sp, sp, #0x4 - mvnne r0, #0x1 - ldmneia sp!, {r4-r7,lr} - bxne lr - cmp r5, #0x0 - beq _020CA2F8 - bl OS_DisableInterrupts_IrqAndFiq - mov r4, r0 - b _020CA300 -_020CA2F8: - bl OS_DisableInterrupts - mov r4, r0 -_020CA300: - mov r0, #0x0 - strh r0, [r7, #0x4] - cmp r6, #0x0 - beq _020CA314 - blx r6 -_020CA314: - mov r0, #0x0 - str r0, [r7, #0x0] - cmp r5, #0x0 - beq _020CA330 - mov r0, r4 - bl OS_RestoreInterrupts_IrqAndFiq - b _020CA338 -_020CA330: - mov r0, r4 - bl OS_RestoreInterrupts -_020CA338: - mov r0, #0x0 - add sp, sp, #0x4 - ldmia sp!, {r4-r7,lr} - bx lr - - arm_func_start OS_TryLockByWord -OS_TryLockByWord: ; 0x020CA348 - ldr ip, _020CA354 ; =OSi_DoLockByWord - mov r3, #0x0 - bx r12 - .balign 4 -_020CA354: .word OSi_DoLockByWord +_020CA2B4: .word OSi_DoUnlockByWord diff --git a/arm9/global.inc b/arm9/global.inc index 1d474f13..57a462d3 100644 --- a/arm9/global.inc +++ b/arm9/global.inc @@ -6432,6 +6432,7 @@ .extern OS_SleepThread
.extern OS_SpinWait
.extern OS_Terminate
+.extern OS_TryLockByWord
.extern OS_TryLockCard
.extern OS_TryLockCartridge
.extern OS_TryLockMutex
@@ -6449,6 +6450,7 @@ .extern OSi_DebuggerHandler
.extern OSi_DoLockByWord
.extern OSi_DoResetSystem
+.extern OSi_DoUnlockByWord
.extern OSi_EnterDmaCallback
.extern OSi_EnterTimerCallback
.extern OSi_ExContext
diff --git a/arm9/lib/include/OS_spinLock.h b/arm9/lib/include/OS_spinLock.h index 208cb677..c6e0e1fd 100644 --- a/arm9/lib/include/OS_spinLock.h +++ b/arm9/lib/include/OS_spinLock.h @@ -22,6 +22,9 @@ static inline void OSi_WaitByLoop() void OS_InitLock(); s32 OSi_DoLockByWord(u16 lockId, OSLockWord *lockp, void (*ctrlFuncp) (void), BOOL disableFiq); +s32 OS_TryLockByWord(u16 lockId, OSLockWord *lockp, void (*ctrlFuncp) (void)); +s32 OSi_DoUnlockByWord(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 45e29ab8..bf9204cb 100644 --- a/arm9/lib/src/OS_spinLock.c +++ b/arm9/lib/src/OS_spinLock.c @@ -3,11 +3,11 @@ // #include "OS_spinLock.h" +#include "OS_system.h" #include "function_target.h" #include "consts.h" #include "MI_exMemory.h" -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), @@ -44,7 +44,7 @@ ARM_FUNC void OS_InitLock() MIi_SetCartridgeProcessor(MI_PROCESSOR_ARM7); OS_UnlockByWord(0x7e, lockp, NULL); - OS_TryLockByWord(0x7f, lockp, NULL); + (void)OS_TryLockByWord(0x7f, lockp, NULL); } ARM_FUNC s32 OSi_DoLockByWord(u16 lockId, OSLockWord *lockp, void (*ctrlFuncp) (void), //should be static @@ -57,3 +57,34 @@ ARM_FUNC s32 OSi_DoLockByWord(u16 lockId, OSLockWord *lockp, void (*ctrlFuncp) ( return lastLockFlag; } + +ARM_FUNC s32 OS_TryLockByWord(u16 lockId, OSLockWord *lockp, void (*ctrlFuncp) (void)) +{ + return OSi_DoLockByWord(lockId, lockp, ctrlFuncp, FALSE); +} + +ARM_FUNC s32 OSi_DoUnlockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void), + BOOL disableFIQ) +{ + if (lockID != lockp->ownerID) + { + return -2; + } + + OSIntrMode lastIntrMode = (disableFIQ) ? OS_DisableInterrupts_IrqAndFiq() : OS_DisableInterrupts(); + lockp->ownerID = 0; + if (ctrlFuncp) + { + ctrlFuncp(); + } + lockp->lockFlag = 0; + if (disableFIQ) + { + OS_RestoreInterrupts_IrqAndFiq(lastIntrMode); + } + else + { + OS_RestoreInterrupts(lastIntrMode); + } + return 0; +} |