diff options
Diffstat (limited to 'arm7')
-rw-r--r-- | arm7/asm/OS_spinLock.s | 278 | ||||
-rw-r--r-- | arm7/lib/include/MI_dma.h | 6 | ||||
-rw-r--r-- | arm7/lib/include/OS_spinLock.h | 28 | ||||
-rw-r--r-- | arm7/lib/include/mmap.h | 2 | ||||
-rw-r--r-- | arm7/lib/include/syscall.h | 6 | ||||
-rw-r--r-- | arm7/lib/src/OS_spinLock.c | 192 | ||||
-rw-r--r-- | arm7/lib/src/OS_system.c | 3 |
7 files changed, 232 insertions, 283 deletions
diff --git a/arm7/asm/OS_spinLock.s b/arm7/asm/OS_spinLock.s deleted file mode 100644 index bb15916e..00000000 --- a/arm7/asm/OS_spinLock.s +++ /dev/null @@ -1,278 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .section .bss - - .global _03807780 -_03807780: ;0x03807780 - .space 0x03807784 - 0x03807780 - - .section .text - - arm_func_start OS_UnLockCartridge -OS_UnLockCartridge: ; 0x037F8A18 - ldr r1, _037F8A20 ; =OS_UnlockCartridge - bx r1 -_037F8A20: .word OS_UnlockCartridge - - arm_func_start OS_GetLockID -OS_GetLockID: ; 0x037F8A24 - ldr r3, _037F8AB4 ; =0x027FFFB8 - ldr r1, [r3] - mov r2, #0 - mov r0, #-2147483648 ; 0x80000000 -_037F8A34: - tst r1, r0 - bne _037F8A50 - add r2, r2, #1 - cmp r2, #32 - beq _037F8A50 - mov r0, r0, lsr #1 - b _037F8A34 -_037F8A50: - cmp r2, #32 - movne r0, #128 ; 0x80 - bne _037F8A98 - add r3, r3, #4 - ldr r1, [r3] - mov r2, #0 - mov r0, #-2147483648 ; 0x80000000 -_037F8A6C: - tst r1, r0 - bne _037F8A88 - add r2, r2, #1 - cmp r2, #32 - beq _037F8A88 - mov r0, r0, lsr #1 - b _037F8A6C -_037F8A88: - cmp r2, #32 - ldr r0, _037F8AB8 ; =0xFFFFFFFD - bxeq lr - mov r0, #160 ; 0xa0 -_037F8A98: - add r0, r0, r2 - mov r1, #-2147483648 ; 0x80000000 - mov r1, r1, lsr r2 - ldr r2, [r3] - bic r2, r2, r1 - str r2, [r3] - bx lr -_037F8AB4: .word 0x027FFFB8 -_037F8AB8: .word 0xFFFFFFFD - - arm_func_start OS_ReleaseLockID -OS_ReleaseLockID: ; 0x037F8ABC - ldr r3, _037F8AE8 ; =0x027FFFB8 - cmp r0, #160 ; 0xa0 - addpl r3, r3, #4 - subpl r0, r0, #160 ; 0xa0 - submi r0, r0, #128 ; 0x80 - mov r1, #-2147483648 ; 0x80000000 - mov r1, r1, lsr r0 - ldr r2, [r3] - orr r2, r2, r1 - str r2, [r3] - bx lr -_037F8AE8: .word 0x027FFFB8 - - arm_func_start OS_ReadOwnerOfLockWord -OS_ReadOwnerOfLockWord: ; 0x037F8AEC - ldrh r0, [r0, #4] - bx lr - - arm_func_start OSi_FreeCartridgeBus -OSi_FreeCartridgeBus: ;0x037F8AF4 - bx lr - - arm_func_start OSi_AllocateCartridgeBus -OSi_AllocateCartridgeBus: ;0x037F8AF8 - bx lr - - arm_func_start OS_TryLockCartridge -OS_TryLockCartridge: ; 0x037F8AFC - ldr r1, _037F8B10 ; =0x027FFFE8 - ldr r2, _037F8B14 ; =OSi_AllocateCartridgeBus - mov r3, #1 - ldr ip, _037F8B18 ; =OSi_DoTryLockByWord - bx ip -_037F8B10: .word 0x027FFFE8 -_037F8B14: .word OSi_AllocateCartridgeBus -_037F8B18: .word OSi_DoTryLockByWord - - arm_func_start OS_UnlockCartridge -OS_UnlockCartridge: ; 0x037F8B1C - ldr r1, _037F8B30 ; =0x027FFFE8 - ldr r2, _037F8B34 ; =OSi_FreeCartridgeBus - mov r3, #1 - ldr ip, _037F8B38 ; =OSi_DoUnlockByWord - bx ip -_037F8B30: .word 0x027FFFE8 -_037F8B34: .word OSi_FreeCartridgeBus -_037F8B38: .word OSi_DoUnlockByWord - - arm_func_start OS_LockCartridge -OS_LockCartridge: ; 0x037F8B3C - ldr r1, _037F8B50 ; =0x027FFFE8 - ldr r2, _037F8B54 ; =OSi_AllocateCartridgeBus - mov r3, #1 - ldr ip, _037F8B58 ; =OSi_DoLockByWord - bx ip -_037F8B50: .word 0x027FFFE8 -_037F8B54: .word OSi_AllocateCartridgeBus -_037F8B58: .word OSi_DoLockByWord - - arm_func_start OSi_DoTryLockByWord -OSi_DoTryLockByWord: ; 0x037F8B5C - stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} - sub sp, sp, #4 - mov r9, r0 - mov r8, r1 - mov r7, r2 - movs r6, r3 - beq _037F8B84 - bl OS_DisableInterrupts_IrqAndFiq - mov r5, r0 - b _037F8B8C -_037F8B84: - bl OS_DisableInterrupts - mov r5, r0 -_037F8B8C: - mov r0, r9 - mov r1, r8 - bl MI_SwapWord - movs r4, r0 - bne _037F8BB4 - cmp r7, #0 - beq _037F8BB0 - mov lr, pc - bx r7 -_037F8BB0: - strh r9, [r8, #4] -_037F8BB4: - cmp r6, #0 - beq _037F8BC8 - mov r0, r5 - bl OS_RestoreInterrupts_IrqAndFiq - b _037F8BD0 -_037F8BC8: - mov r0, r5 - bl OS_RestoreInterrupts -_037F8BD0: - mov r0, r4 - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, r8, r9, lr} - bx lr - - arm_func_start OSi_DoUnlockByWord -OSi_DoUnlockByWord: ; 0x037F8BE0 - stmdb sp!, {r4, r5, r6, r7, lr} - sub sp, sp, #4 - mov r7, r1 - mov r6, r2 - mov r5, r3 - ldrh r1, [r7, #4] - cmp r0, r1 - mvnne r0, #1 - bne _037F8C60 - cmp r5, #0 - beq _037F8C18 - bl OS_DisableInterrupts_IrqAndFiq - mov r4, r0 - b _037F8C20 -_037F8C18: - bl OS_DisableInterrupts - mov r4, r0 -_037F8C20: - mov r0, #0 - strh r0, [r7, #4] - cmp r6, #0 - beq _037F8C38 - mov lr, pc - bx r6 -_037F8C38: - mov r0, #0 - str r0, [r7] - cmp r5, #0 - beq _037F8C54 - mov r0, r4 - bl OS_RestoreInterrupts_IrqAndFiq - b _037F8C5C -_037F8C54: - mov r0, r4 - bl OS_RestoreInterrupts -_037F8C5C: - mov r0, #0 -_037F8C60: - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, lr} - bx lr - - arm_func_start OSi_DoLockByWord -OSi_DoLockByWord: ; 0x037F8C6C - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r8, r0 - mov r7, r1 - mov r6, r2 - mov r5, r3 - mov r4, #1024 ; 0x400 - b _037F8C90 -_037F8C88: - mov r0, r4 - bl FUN_037F8CB4 -_037F8C90: - mov r0, r8 - mov r1, r7 - mov r2, r6 - mov r3, r5 - bl OSi_DoTryLockByWord - cmp r0, #0 - bgt _037F8C88 - ldmia sp!, {r4, r5, r6, r7, r8, lr} - bx lr - - arm_func_start FUN_037F8CB4 -FUN_037F8CB4: ; 0x037F8CB4 ;part of the above func? - ldr ip, _037F8CBC ; =SVC_WaitByLoop - bx ip -_037F8CBC: .word SVC_WaitByLoop - - arm_func_start OS_InitLock -OS_InitLock: ; 0x037F8CC0 - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - ldr r0, _037F8D38 ; =_03807780 - ldr r1, [r0] - cmp r1, #0 - bne _037F8D2C - mov r1, #1 - str r1, [r0] - mov r0, #0 - ldr r4, _037F8D3C ; =0x027FFFF0 - strh r0, [r4, #6] - mov r5, #1024 ; 0x400 - b _037F8CFC -_037F8CF4: - mov r0, r5 - bl FUN_037F8CB4 -_037F8CFC: - ldrh r0, [r4, #4] - cmp r0, #127 ; 0x7f - bne _037F8CF4 - mvn r1, #0 - ldr r0, _037F8D40 ; =0x027FFFB8 - str r1, [r0] - mov r0, #65536 ; 0x10000 - rsb r1, r0, #0 - ldr r0, _037F8D44 ; =0x027FFFBC - str r1, [r0] - mov r0, #191 ; 0xbf - strh r0, [r4, #6] -_037F8D2C: - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr -_037F8D38: .word _03807780 -_037F8D3C: .word 0x027FFFF0 -_037F8D40: .word 0x027FFFB8 -_037F8D44: .word 0x027FFFBC diff --git a/arm7/lib/include/MI_dma.h b/arm7/lib/include/MI_dma.h index b728f814..e65f0b89 100644 --- a/arm7/lib/include/MI_dma.h +++ b/arm7/lib/include/MI_dma.h @@ -1,7 +1,7 @@ -#ifndef GUARD_MI_DMA_H -#define GUARD_MI_DMA_H +#ifndef POKEDIAMOND_ARM7_MI_DMA_H +#define POKEDIAMOND_ARM7_MI_DMA_H -#include "nitro/dma.h" +#include "nitro/MI_dma_shared.h" #include "nitro/types.h" void MI_StopDma(u32 channel); diff --git a/arm7/lib/include/OS_spinLock.h b/arm7/lib/include/OS_spinLock.h new file mode 100644 index 00000000..f7366d1f --- /dev/null +++ b/arm7/lib/include/OS_spinLock.h @@ -0,0 +1,28 @@ +#ifndef POKEDIAMOND_ARM7_OS_SPINLOCK_H +#define POKEDIAMOND_ARM7_OS_SPINLOCK_H + +#include "consts.h" +#include "nitro/OS_spinLock_shared.h" +#include "syscall.h" + +void OS_InitLock(void); +void FUN_037F8CB4(s32 ct); +s32 OSi_DoLockByWord(u16 lockId, OSLockWord *lockp, void (*ctrlFuncp) (void), BOOL disableFiq); +s32 OSi_DoUnlockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void), BOOL disableFIQ); +s32 OSi_DoTryLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void), BOOL disableFiq); +s32 OS_LockCartridge(u16 lockID); +s32 OS_UnlockCartridge(u16 lockID); +s32 OS_TryLockCartridge(u16 lockID); +void OSi_AllocateCartridgeBus(void); +void OSi_FreeCartridgeBus(void); +u16 OS_ReadOwnerOfLockWord(OSLockWord * lock); +s32 OS_UnLockCartridge(u16 lockID); +s32 OS_GetLockID(void); +void OS_ReleaseLockID(register u16 lockID); + +static inline void OSi_WaitByLoop(void) +{ + FUN_037F8CB4(0x1000 / 4); +} + +#endif //POKEDIAMOND_ARM7_OS_SPINLOCK_H diff --git a/arm7/lib/include/mmap.h b/arm7/lib/include/mmap.h index 24d15ad7..064938e2 100644 --- a/arm7/lib/include/mmap.h +++ b/arm7/lib/include/mmap.h @@ -23,4 +23,6 @@ #define HW_PRV_WRAM_SYSRV (HW_PRV_WRAM + HW_PRV_WRAM_SIZE - HW_PRV_WRAM_SYSRV_SIZE) +#define HW_LOCK_ID_FLAG_SUB (HW_MAIN_MEM + 0x007fffb8) + #endif //POKEDIAMOND_ARM7_MMAP_H diff --git a/arm7/lib/include/syscall.h b/arm7/lib/include/syscall.h new file mode 100644 index 00000000..55462cc7 --- /dev/null +++ b/arm7/lib/include/syscall.h @@ -0,0 +1,6 @@ +#ifndef POKEDIAMOND_ARM7_SYSCALL_H +#define POKEDIAMOND_ARM7_SYSCALL_H + +void SVC_WaitByLoop(u32 ct); + +#endif //POKEDIAMOND_ARM7_SYSCALL_H diff --git a/arm7/lib/src/OS_spinLock.c b/arm7/lib/src/OS_spinLock.c new file mode 100644 index 00000000..2857de05 --- /dev/null +++ b/arm7/lib/src/OS_spinLock.c @@ -0,0 +1,192 @@ +#include "function_target.h" +#include "OS_spinLock.h" +#include "OS_system.h" +#include "MI_swap.h" + +ARM_FUNC void OS_InitLock(void) +{ + static BOOL isInitialized = FALSE; + + if (isInitialized) + return; + isInitialized = TRUE; + + OSLockWord *lockp = (OSLockWord *)HW_INIT_LOCK_BUF; + + lockp->extension = 0; + while (lockp->ownerID != 0x7f) + { + OSi_WaitByLoop(); + } + + ((u32 *)HW_LOCK_ID_FLAG_SUB)[0] = 0xffffffff; + ((u32 *)HW_LOCK_ID_FLAG_SUB)[1] = 0xffff0000; + + lockp->extension = 0xbf; +} + +ARM_FUNC void FUN_037F8CB4(s32 ct) +{ + SVC_WaitByLoop((u32)ct); //todo this should be linker generated, figure out why it broke +} + +ARM_FUNC s32 OSi_DoLockByWord(u16 lockId, OSLockWord *lockp, void (*ctrlFuncp) (void), + BOOL disableFiq) +{ + s32 lastLockFlag; + while ((lastLockFlag = OSi_DoTryLockByWord(lockId, lockp, ctrlFuncp, disableFiq)) > 0) { + OSi_WaitByLoop(); + } + + return lastLockFlag; +} + +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) + { + (void)OS_RestoreInterrupts_IrqAndFiq(lastIntrMode); + } + else + { + (void)OS_RestoreInterrupts(lastIntrMode); + } + return 0; +} + +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, (u32 *)&lockp->lockFlag); + + if (!lastLockFlag) + { + if (ctrlFuncp) + { + ctrlFuncp(); + } + lockp->ownerID = lockID; + } + + if (disableFiq) + { + (void)OS_RestoreInterrupts_IrqAndFiq(lastIntrMode); + } + else + { + (void)OS_RestoreInterrupts(lastIntrMode); + } + + 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(void) +{ + //noop +} + +ARM_FUNC void OSi_FreeCartridgeBus(void) +{ + //noop +} + +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_SUB + ldr r1, [r3] + mov r2, #0 + mov r0, #0x80000000 +_037F8A34: + tst r1, r0 + bne _037F8A50 + add r2, r2, #1 + cmp r2, #32 + beq _037F8A50 + mov r0, r0, lsr #1 + b _037F8A34 +_037F8A50: + cmp r2, #32 + movne r0, #0x80 + bne _037F8A98 + add r3, r3, #4 + ldr r1, [r3] + mov r2, #0 + mov r0, #0x80000000 +_037F8A6C: + tst r1, r0 + bne _037F8A88 + add r2, r2, #1 + cmp r2, #32 + beq _037F8A88 + mov r0, r0, lsr #1 + b _037F8A6C +_037F8A88: + cmp r2, #32 + ldr r0, =0xFFFFFFFD + bxeq lr + mov r0, #160 +_037F8A98: + add r0, r0, r2 + mov r1, #0x80000000 + mov r1, r1, lsr r2 + ldr r2, [r3] + bic r2, r2, r1 + str r2, [r3] + bx lr +} + +ARM_FUNC asm void OS_ReleaseLockID(register u16 lockID) +{ + ldr r3, =HW_LOCK_ID_FLAG_SUB + cmp r0, #0xa0 + addpl r3, r3, #0x4 + subpl r0, r0, #0xa0 + submi r0, r0, #0x80 + mov r1, #0x80000000 + mov r1, r1, lsr r0 + ldr r2, [r3, #0x0] + orr r2, r2, r1 + str r2, [r3, #0x0] + bx lr +} diff --git a/arm7/lib/src/OS_system.c b/arm7/lib/src/OS_system.c index 11417e91..503bd854 100644 --- a/arm7/lib/src/OS_system.c +++ b/arm7/lib/src/OS_system.c @@ -1,7 +1,6 @@ #include "function_target.h" #include "OS_system.h" - -extern void FUN_037F8CB4(s32 count); +#include "OS_spinLock.h" ARM_FUNC asm OSIntrMode OS_EnableInterrupts(void) { |