summaryrefslogtreecommitdiff
path: root/arm9/lib/src
diff options
context:
space:
mode:
authorred031000 <rubenru09@aol.com>2020-05-22 16:59:05 +0100
committerred031000 <rubenru09@aol.com>2020-05-22 16:59:05 +0100
commit4516f9c24789221cb1a065d054520884f35c5a3d (patch)
tree1f790e1ec4dfb79e67fe3f3c6c9282b673f83142 /arm9/lib/src
parent3c62c1ee513696153e6c554c0d97557b56a4c997 (diff)
OSi_DoUnlockByWord and OS_TryLockByWord
Diffstat (limited to 'arm9/lib/src')
-rw-r--r--arm9/lib/src/OS_spinLock.c35
1 files changed, 33 insertions, 2 deletions
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;
+}