summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorred031000 <rubenru09@aol.com>2020-05-21 23:30:24 +0100
committerred031000 <rubenru09@aol.com>2020-05-21 23:30:24 +0100
commit3c62c1ee513696153e6c554c0d97557b56a4c997 (patch)
treedf84b50deef93a23939e9410afdc3d7998de97fd
parentb4d6f1314b3b322afabe85d848e09a36d4e7a47a (diff)
OSi_DoLockByWord
-rw-r--r--arm9/asm/OS_spinLock_asm.s34
-rw-r--r--arm9/global.inc1
-rw-r--r--arm9/lib/include/OS_spinLock.h2
-rw-r--r--arm9/lib/src/OS_spinLock.c13
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;
+}