summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm9/asm/OS_spinLock_asm.s60
-rw-r--r--arm9/global.inc2
-rw-r--r--arm9/lib/include/OS_spinLock.h3
-rw-r--r--arm9/lib/src/OS_spinLock.c35
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;
+}