From b4d6f1314b3b322afabe85d848e09a36d4e7a47a Mon Sep 17 00:00:00 2001 From: red031000 Date: Thu, 21 May 2020 20:23:26 +0100 Subject: OS_InitLock --- arm9/lib/src/OS_spinLock.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 arm9/lib/src/OS_spinLock.c (limited to 'arm9/lib/src/OS_spinLock.c') diff --git a/arm9/lib/src/OS_spinLock.c b/arm9/lib/src/OS_spinLock.c new file mode 100644 index 00000000..46309c42 --- /dev/null +++ b/arm9/lib/src/OS_spinLock.c @@ -0,0 +1,46 @@ +// +// Created by red031000 on 2020-05-21. +// + +#include "OS_spinLock.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 + +ARM_FUNC void OS_InitLock() +{ + static BOOL isInitialized = FALSE; + + if (isInitialized) + { + return; + } + isInitialized = TRUE; + + OSLockWord* lockp = (OSLockWord *)0x027FFFF0; + + lockp->lockFlag = 0; + + (void)OS_TryLockByWord(0x7e, lockp, NULL); + + while (lockp->extension) + { + OSi_WaitByLoop(); + } + + ((u32 *)HW_LOCK_ID_FLAG_MAIN)[0] = 0xffffffff; + ((u32 *)HW_LOCK_ID_FLAG_MAIN)[1] = 0xffff0000; + + MIi_CpuClear32(0x0, (void *)HW_SHARED_LOCK_BUF, 0x28); + + MIi_SetCardProcessor(MI_PROCESSOR_ARM7); + + MIi_SetCartridgeProcessor(MI_PROCESSOR_ARM7); + + OS_UnlockByWord(0x7e, lockp, NULL); + OS_TryLockByWord(0x7f, lockp, NULL); +} -- cgit v1.2.3 From 3c62c1ee513696153e6c554c0d97557b56a4c997 Mon Sep 17 00:00:00 2001 From: red031000 Date: Thu, 21 May 2020 23:30:24 +0100 Subject: OSi_DoLockByWord --- arm9/lib/src/OS_spinLock.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'arm9/lib/src/OS_spinLock.c') 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; +} -- cgit v1.2.3 From 4516f9c24789221cb1a065d054520884f35c5a3d Mon Sep 17 00:00:00 2001 From: red031000 Date: Fri, 22 May 2020 16:59:05 +0100 Subject: OSi_DoUnlockByWord and OS_TryLockByWord --- arm9/lib/src/OS_spinLock.c | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) (limited to 'arm9/lib/src/OS_spinLock.c') 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; +} -- cgit v1.2.3 From 1a45d65f162615b48fd56d60af37ed5483aa9bba Mon Sep 17 00:00:00 2001 From: red031000 Date: Fri, 22 May 2020 19:04:33 +0100 Subject: OSi_DoTryLockByWord and OS_UnlockByWord --- arm9/lib/src/OS_spinLock.c | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) (limited to 'arm9/lib/src/OS_spinLock.c') 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; +} -- cgit v1.2.3 From d5bff2f511cd2657e62c0ba3fec0e6efd044bd08 Mon Sep 17 00:00:00 2001 From: red031000 Date: Fri, 22 May 2020 20:30:37 +0100 Subject: bunch of small cartridge funcs --- arm9/lib/src/OS_spinLock.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) (limited to 'arm9/lib/src/OS_spinLock.c') diff --git a/arm9/lib/src/OS_spinLock.c b/arm9/lib/src/OS_spinLock.c index aac5b295..9cda667f 100644 --- a/arm9/lib/src/OS_spinLock.c +++ b/arm9/lib/src/OS_spinLock.c @@ -9,8 +9,6 @@ #include "MI_exMemory.h" 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() @@ -121,3 +119,28 @@ ARM_FUNC s32 OSi_DoTryLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp return lastLockFlag; } + +ARM_FUNC s32 OS_LockCartridge(u16 lockID) +{ + return OSi_DoLockByWord(lockID, (OSLockWord *)HW_CTRDG_LOCK_BUF, OSi_AllocateCartridgeBus, TRUE); +} + +ARM_FUNC s32 OS_UnlockCartridge(u16 lockID) +{ + return OSi_DoUnlockByWord(lockID, (OSLockWord *)HW_CTRDG_LOCK_BUF, OSi_FreeCartridgeBus, TRUE); +} + +ARM_FUNC s32 OS_TryLockCartridge(u16 lockID) +{ + return OSi_DoTryLockByWord(lockID, (OSLockWord *)HW_CTRDG_LOCK_BUF, OSi_AllocateCartridgeBus, TRUE); +} + +ARM_FUNC void OSi_AllocateCartridgeBus() +{ + MIi_SetCartridgeProcessor(MI_PROCESSOR_ARM9); +} + +ARM_FUNC void OSi_FreeCartridgeBus() +{ + MIi_SetCartridgeProcessor(MI_PROCESSOR_ARM7); +} -- cgit v1.2.3 From 565fa0f53aaa22e30d5566e7c8bed1ac912f78ba Mon Sep 17 00:00:00 2001 From: red031000 Date: Fri, 22 May 2020 23:56:59 +0100 Subject: finish OS_spinLock --- arm9/lib/src/OS_spinLock.c | 77 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 74 insertions(+), 3 deletions(-) (limited to 'arm9/lib/src/OS_spinLock.c') diff --git a/arm9/lib/src/OS_spinLock.c b/arm9/lib/src/OS_spinLock.c index 9cda667f..5050a7bd 100644 --- a/arm9/lib/src/OS_spinLock.c +++ b/arm9/lib/src/OS_spinLock.c @@ -11,7 +11,7 @@ extern void MIi_CpuClear32(u32 param1, void * addr, u32 length); //not too sure about names extern u32 MI_SwapWord(u32 data, volatile u32* destp); -ARM_FUNC void OS_InitLock() +ARM_FUNC void OS_InitLock(void) { static BOOL isInitialized = FALSE; @@ -135,12 +135,83 @@ ARM_FUNC s32 OS_TryLockCartridge(u16 lockID) return OSi_DoTryLockByWord(lockID, (OSLockWord *)HW_CTRDG_LOCK_BUF, OSi_AllocateCartridgeBus, TRUE); } -ARM_FUNC void OSi_AllocateCartridgeBus() +ARM_FUNC void OSi_AllocateCartridgeBus(void) { MIi_SetCartridgeProcessor(MI_PROCESSOR_ARM9); } -ARM_FUNC void OSi_FreeCartridgeBus() +ARM_FUNC void OSi_FreeCartridgeBus(void) { MIi_SetCartridgeProcessor(MI_PROCESSOR_ARM7); } + +ARM_FUNC s32 OS_TryLockCard(u16 lockID) +{ + return OS_TryLockByWord(lockID, (OSLockWord *)HW_CARD_LOCK_BUF, OSi_AllocateCardBus); +} + +ARM_FUNC s32 OS_UnlockCard(u16 lockID) +{ + return OS_UnlockByWord(lockID, (OSLockWord *)HW_CARD_LOCK_BUF, OSi_FreeCardBus); +} + +ARM_FUNC void OSi_AllocateCardBus(void) +{ + MIi_SetCardProcessor(MI_PROCESSOR_ARM9); +} + +ARM_FUNC void OSi_FreeCardBus(void) +{ + MIi_SetCardProcessor(MI_PROCESSOR_ARM7); +} + +ARM_FUNC u16 OS_ReadOwnerOfLockWord(OSLockWord * lock) +{ + return lock->ownerID; +} + +ARM_FUNC asm s32 OS_UnLockCartridge(u16 lockID) +{ + ldr r1, =OS_UnlockCartridge + bx r1 +} + +ARM_FUNC asm s32 OS_GetLockID(void) +{ + ldr r3, =HW_LOCK_ID_FLAG_MAIN + ldr r1, [r3, #0x0] + clz r2, r1 + cmp r2, #0x20 + movne r0, #0x40 + bne _020CA0D4 + add r3, r3, #0x4 + ldr r1, [r3, #0x0] + clz r2, r1 + cmp r2, #0x20 + ldr r0, =0xFFFFFFFD + bxeq lr + mov r0, #0x60 +_020CA0D4: + add r0, r0, r2 + mov r1, #0x80000000 + mov r1, r1, lsr r2 + ldr r2, [r3, #0x0] + bic r2, r2, r1 + str r2, [r3, #0x0] + bx lr +} + +ARM_FUNC asm void OS_ReleaseLockID(register u16 lockID) +{ + ldr r3, =HW_LOCK_ID_FLAG_MAIN + cmp r0, #0x60 + addpl r3, r3, #0x4 + subpl r0, r0, #0x60 + submi r0, r0, #0x40 + mov r1, #0x80000000 + mov r1, r1, lsr r0 + ldr r2, [r3, #0x0] + orr r2, r2, r1 + str r2, [r3, #0x0] + bx lr +} -- cgit v1.2.3