diff options
author | red031000 <rubenru09@aol.com> | 2020-05-22 23:56:59 +0100 |
---|---|---|
committer | red031000 <rubenru09@aol.com> | 2020-05-22 23:56:59 +0100 |
commit | 565fa0f53aaa22e30d5566e7c8bed1ac912f78ba (patch) | |
tree | a5eedc06eef4e6126ebff5696f6a27fc4ad1ae15 | |
parent | d5bff2f511cd2657e62c0ba3fec0e6efd044bd08 (diff) |
finish OS_spinLock
-rw-r--r-- | arm9/arm9.lcf | 1 | ||||
-rw-r--r-- | arm9/asm/OS_spinLock_asm.s | 101 | ||||
-rw-r--r-- | arm9/lib/include/OS_spinLock.h | 15 | ||||
-rw-r--r-- | arm9/lib/include/mmap.h | 1 | ||||
-rw-r--r-- | arm9/lib/src/OS_spinLock.c | 77 |
5 files changed, 86 insertions, 109 deletions
diff --git a/arm9/arm9.lcf b/arm9/arm9.lcf index 4c9c4044..f5634de3 100644 --- a/arm9/arm9.lcf +++ b/arm9/arm9.lcf @@ -457,7 +457,6 @@ SECTIONS { OS_irqHandler.o (.text) OS_irqTable.o (.text) OS_interrupt.o (.text) - OS_spinLock_asm.o (.text) OS_spinLock.o (.text) OS_printf.o (.text) OS_thread.o (.text) diff --git a/arm9/asm/OS_spinLock_asm.s b/arm9/asm/OS_spinLock_asm.s deleted file mode 100644 index 783123fe..00000000 --- a/arm9/asm/OS_spinLock_asm.s +++ /dev/null @@ -1,101 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .text - - arm_func_start OS_UnLockCartridge -OS_UnLockCartridge: ; 0x020CA094 - ldr r1, _020CA09C ; =OS_UnlockCartridge - bx r1 - .balign 4 -_020CA09C: .word OS_UnlockCartridge - - arm_func_start OS_GetLockID -OS_GetLockID: ; 0x020CA0A0 - ldr r3, _020CA0F0 ; =0x027FFFB0 - 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, _020CA0F4 ; =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 - .balign 4 -_020CA0F0: .word 0x027FFFB0 -_020CA0F4: .word 0xFFFFFFFD - - arm_func_start OS_ReleaseLockID -OS_ReleaseLockID: ; 0x020CA0F8 - ldr r3, _020CA124 ; =0x027FFFB0 - 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 - .balign 4 -_020CA124: .word 0x027FFFB0 - - arm_func_start OS_ReadOwnerOfLockWord -OS_ReadOwnerOfLockWord: ; 0x020CA128 - ldrh r0, [r0, #0x4] - bx lr - - arm_func_start OSi_FreeCardBus -OSi_FreeCardBus: ; 0x020CA130 - ldr r1, _020CA144 ; =0x04000204 - ldrh r0, [r1, #0x0] - orr r0, r0, #0x800 - strh r0, [r1, #0x0] - bx lr - .balign 4 -_020CA144: .word 0x04000204 - - arm_func_start OSi_AllocateCardBus -OSi_AllocateCardBus: ; 0x020CA148 - ldr r1, _020CA15C ; =0x04000204 - ldrh r0, [r1, #0x0] - bic r0, r0, #0x800 - strh r0, [r1, #0x0] - bx lr - .balign 4 -_020CA15C: .word 0x04000204 - - arm_func_start OS_UnlockCard -OS_UnlockCard: ; 0x020CA160 - ldr ip, _020CA170 ; =OS_UnlockByWord - ldr r1, _020CA174 ; =0x027FFFE0 - ldr r2, _020CA178 ; =OSi_FreeCardBus - bx r12 - .balign 4 -_020CA170: .word OS_UnlockByWord -_020CA174: .word 0x027FFFE0 -_020CA178: .word OSi_FreeCardBus - - arm_func_start OS_TryLockCard -OS_TryLockCard: ; 0x020CA17C - ldr ip, _020CA18C ; =OS_TryLockByWord - ldr r1, _020CA190 ; =0x027FFFE0 - ldr r2, _020CA194 ; =OSi_AllocateCardBus - bx r12 - .balign 4 -_020CA18C: .word OS_TryLockByWord -_020CA190: .word 0x027FFFE0 -_020CA194: .word OSi_AllocateCardBus diff --git a/arm9/lib/include/OS_spinLock.h b/arm9/lib/include/OS_spinLock.h index eb94a010..eccc502b 100644 --- a/arm9/lib/include/OS_spinLock.h +++ b/arm9/lib/include/OS_spinLock.h @@ -14,12 +14,12 @@ typedef volatile struct OSLockWord { u16 extension; } OSLockWord; -static inline void OSi_WaitByLoop() +static inline void OSi_WaitByLoop(void) { SVC_WaitByLoop(0x1000 / 4); } -void OS_InitLock(); +void OS_InitLock(void); s32 OSi_DoLockByWord(u16 lockId, OSLockWord *lockp, void (*ctrlFuncp) (void), BOOL disableFiq); s32 OS_TryLockByWord(u16 lockId, OSLockWord *lockp, void (*ctrlFuncp) (void)); @@ -31,8 +31,15 @@ s32 OSi_DoTryLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void), s32 OS_LockCartridge(u16 lockID); s32 OS_UnlockCartridge(u16 lockID); s32 OS_TryLockCartridge(u16 lockID); -void OSi_AllocateCartridgeBus(); -void OSi_FreeCartridgeBus(); +void OSi_AllocateCartridgeBus(void); +void OSi_FreeCartridgeBus(void); +s32 OS_TryLockCard(u16 lockID); +s32 OS_UnlockCard(u16 lockID); +void OSi_AllocateCardBus(void); +void OSi_FreeCardBus(void); +u16 OS_ReadOwnerOfLockWord(OSLockWord * lock); +s32 OS_UnLockCartridge(u16 lockID); s32 OS_GetLockID(void); +void OS_ReleaseLockID(register u16 lockID); #endif //POKEDIAMOND_OS_SPINLOCK_H diff --git a/arm9/lib/include/mmap.h b/arm9/lib/include/mmap.h index b47d88b4..207e0509 100644 --- a/arm9/lib/include/mmap.h +++ b/arm9/lib/include/mmap.h @@ -41,6 +41,7 @@ extern u32 SDK_AUTOLOAD_DTCM_START[]; #define HW_LOCK_ID_FLAG_MAIN (HW_MAIN_MEM + 0x007fffb0) #define HW_SHARED_LOCK_BUF (HW_MAIN_MEM + 0x007fffc0) +#define HW_CARD_LOCK_BUF (HW_MAIN_MEM + 0x007fffe0) #define HW_CTRDG_LOCK_BUF (HW_MAIN_MEM + 0x007fffe8) #define HW_BUTTON_XY_BUF (HW_MAIN_MEM + 0x007fffa8) 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 +} |