summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorred031000 <rubenru09@aol.com>2020-05-22 19:04:33 +0100
committerred031000 <rubenru09@aol.com>2020-05-22 19:04:33 +0100
commit1a45d65f162615b48fd56d60af37ed5483aa9bba (patch)
tree147c5c5b14f1c82fa2919ea98cd40714bd5c06b4
parent4516f9c24789221cb1a065d054520884f35c5a3d (diff)
OSi_DoTryLockByWord and OS_UnlockByWord
-rw-r--r--arm9/asm/OS_spinLock_asm.s49
-rw-r--r--arm9/global.inc2
-rw-r--r--arm9/lib/include/OS_spinLock.h3
-rw-r--r--arm9/lib/src/OS_spinLock.c41
4 files changed, 42 insertions, 53 deletions
diff --git a/arm9/asm/OS_spinLock_asm.s b/arm9/asm/OS_spinLock_asm.s
index 65063819..653c8380 100644
--- a/arm9/asm/OS_spinLock_asm.s
+++ b/arm9/asm/OS_spinLock_asm.s
@@ -155,52 +155,3 @@ OS_LockCartridge: ; 0x020CA208
_020CA21C: .word OSi_DoLockByWord
_020CA220: .word 0x027FFFE8
_020CA224: .word OSi_AllocateCartridgeBus
-
- arm_func_start OSi_DoTryLockByWord
-OSi_DoTryLockByWord:
- stmdb sp!, {r4-r9,lr}
- sub sp, sp, #0x4
- movs r6, r3
- mov r9, r0
- mov r8, r1
- mov r7, r2
- beq _020CA250
- bl OS_DisableInterrupts_IrqAndFiq
- mov r5, r0
- b _020CA258
-_020CA250:
- bl OS_DisableInterrupts
- mov r5, r0
-_020CA258:
- mov r0, r9
- mov r1, r8
- bl MI_SwapWord
- movs r4, r0
- bne _020CA27C
- cmp r7, #0x0
- beq _020CA278
- blx r7
-_020CA278:
- strh r9, [r8, #0x4]
-_020CA27C:
- cmp r6, #0x0
- beq _020CA290
- mov r0, r5
- bl OS_RestoreInterrupts_IrqAndFiq
- b _020CA298
-_020CA290:
- mov r0, r5
- bl OS_RestoreInterrupts
-_020CA298:
- mov r0, r4
- add sp, sp, #0x4
- ldmia sp!, {r4-r9,lr}
- bx lr
-
- arm_func_start OS_UnlockByWord
-OS_UnlockByWord: ; 0x020CA2A8
- ldr ip, _020CA2B4 ; =OSi_DoUnlockByWord
- mov r3, #0x0
- bx r12
- .balign 4
-_020CA2B4: .word OSi_DoUnlockByWord
diff --git a/arm9/global.inc b/arm9/global.inc
index 57a462d3..e1be4932 100644
--- a/arm9/global.inc
+++ b/arm9/global.inc
@@ -6436,6 +6436,7 @@
.extern OS_TryLockCard
.extern OS_TryLockCartridge
.extern OS_TryLockMutex
+.extern OS_UnlockByWord
.extern OS_UnlockCard
.extern OS_UnlockCartridge
.extern OS_UnlockCartridge2
@@ -6450,6 +6451,7 @@
.extern OSi_DebuggerHandler
.extern OSi_DoLockByWord
.extern OSi_DoResetSystem
+.extern OSi_DoTryLockByWord
.extern OSi_DoUnlockByWord
.extern OSi_EnterDmaCallback
.extern OSi_EnterTimerCallback
diff --git a/arm9/lib/include/OS_spinLock.h b/arm9/lib/include/OS_spinLock.h
index c6e0e1fd..520b7b2f 100644
--- a/arm9/lib/include/OS_spinLock.h
+++ b/arm9/lib/include/OS_spinLock.h
@@ -25,6 +25,9 @@ s32 OSi_DoLockByWord(u16 lockId, OSLockWord *lockp, void (*ctrlFuncp) (void),
s32 OS_TryLockByWord(u16 lockId, OSLockWord *lockp, void (*ctrlFuncp) (void));
s32 OSi_DoUnlockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void),
BOOL disableFIQ);
+s32 OS_UnlockByWord(u16 lockId, OSLockWord *lockp, void (*ctrlFuncp) (void));
+s32 OSi_DoTryLockByWord(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 bf9204cb..aac5b295 100644
--- a/arm9/lib/src/OS_spinLock.c
+++ b/arm9/lib/src/OS_spinLock.c
@@ -8,10 +8,10 @@
#include "consts.h"
#include "MI_exMemory.h"
-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);
+extern u32 MI_SwapWord(u32 data, volatile u32* destp);
ARM_FUNC void OS_InitLock()
{
@@ -43,7 +43,7 @@ ARM_FUNC void OS_InitLock()
MIi_SetCartridgeProcessor(MI_PROCESSOR_ARM7);
- OS_UnlockByWord(0x7e, lockp, NULL);
+ (void)OS_UnlockByWord(0x7e, lockp, NULL);
(void)OS_TryLockByWord(0x7f, lockp, NULL);
}
@@ -80,11 +80,44 @@ ARM_FUNC s32 OSi_DoUnlockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp)
lockp->lockFlag = 0;
if (disableFIQ)
{
- OS_RestoreInterrupts_IrqAndFiq(lastIntrMode);
+ (void)OS_RestoreInterrupts_IrqAndFiq(lastIntrMode);
}
else
{
- OS_RestoreInterrupts(lastIntrMode);
+ (void)OS_RestoreInterrupts(lastIntrMode);
}
return 0;
}
+
+ARM_FUNC s32 OS_UnlockByWord(u16 lockID, OSLockWord* lockp, void (*ctrlFuncp) (void))
+{
+ return OSi_DoUnlockByWord(lockID, lockp, ctrlFuncp, FALSE);
+}
+
+ARM_FUNC s32 OSi_DoTryLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void),
+ BOOL disableFiq)
+{
+ OSIntrMode lastIntrMode = (disableFiq) ? OS_DisableInterrupts_IrqAndFiq() : OS_DisableInterrupts();
+
+ s32 lastLockFlag = (s32)MI_SwapWord(lockID, &lockp->lockFlag);
+
+ if (!lastLockFlag)
+ {
+ if (ctrlFuncp)
+ {
+ ctrlFuncp();
+ }
+ lockp->ownerID = lockID;
+ }
+
+ if (disableFiq)
+ {
+ (void)OS_RestoreInterrupts_IrqAndFiq(lastIntrMode);
+ }
+ else
+ {
+ (void)OS_RestoreInterrupts(lastIntrMode);
+ }
+
+ return lastLockFlag;
+}