diff options
-rw-r--r-- | arm9/arm9.lcf | 2 | ||||
-rw-r--r-- | arm9/asm/CTRDG.s | 6 | ||||
-rw-r--r-- | arm9/asm/CTRDG_backup.s | 2 | ||||
-rw-r--r-- | arm9/asm/CTRDG_flash_AT29LV512.s | 6 | ||||
-rw-r--r-- | arm9/asm/CTRDG_flash_LE39FW512.s | 8 | ||||
-rw-r--r-- | arm9/asm/CTRDG_flash_MX29L010.s | 6 | ||||
-rw-r--r-- | arm9/asm/CTRDG_flash_MX29L512.s | 2 | ||||
-rw-r--r-- | arm9/asm/CTRDG_flash_common.s | 4 | ||||
-rw-r--r-- | arm9/asm/OS_spinLock.s | 350 | ||||
-rw-r--r-- | arm9/data/bss_2.s | 56 | ||||
-rw-r--r-- | arm9/data/bss_2_2.s | 53 | ||||
-rw-r--r-- | arm9/global.inc | 7 | ||||
-rw-r--r-- | arm9/lib/include/MI_exMemory.h | 14 | ||||
-rw-r--r-- | arm9/lib/include/OS_init.h | 1 | ||||
-rw-r--r-- | arm9/lib/include/OS_spinLock.h | 29 | ||||
-rw-r--r-- | arm9/lib/include/mmap.h | 5 | ||||
-rw-r--r-- | arm9/lib/src/OS_init.c | 1 | ||||
-rw-r--r-- | arm9/lib/src/OS_spinLock.c | 217 |
18 files changed, 344 insertions, 425 deletions
diff --git a/arm9/arm9.lcf b/arm9/arm9.lcf index 66800b7a..ddba5c2b 100644 --- a/arm9/arm9.lcf +++ b/arm9/arm9.lcf @@ -584,6 +584,8 @@ SECTIONS { bss.o (.bss) FUN_020910A4.o (.bss) bss_2.o (.bss) + OS_spinLock.o (.bss) + bss_2_2.o (.bss) OS_alloc.o (.bss) bss_3.o (.bss) FS_archive.o (.bss) diff --git a/arm9/asm/CTRDG.s b/arm9/asm/CTRDG.s index 8a1b57d9..4c3fd3be 100644 --- a/arm9/asm/CTRDG.s +++ b/arm9/asm/CTRDG.s @@ -128,7 +128,7 @@ _020DB290: _020DB294: ldr r0, _020DB2BC ; =UNK_021D6944 ldrh r0, [r0, #0x2] - bl OS_UnlockCartridge + bl OS_UnLockCartridge bl CTRDG_IsExisting _020DB2A4: ; 0x020DB2A4 cmp r0, #0x0 @@ -241,7 +241,7 @@ _020DB3F0: _020DB404: ldr r0, _020DB42C ; =UNK_021D6944 ldrh r0, [r0, #0x2] - bl OS_UnlockCartridge + bl OS_UnLockCartridge bl CTRDG_IsExisting _020DB414: ; 0x020DB414 cmp r0, #0x0 @@ -355,7 +355,7 @@ CTRDGi_UnlockByProcessor: ; 0x020DB568 ldr r1, [r4, #0x0] cmp r1, #0x0 bne _020DB580 - bl OS_UnlockCartridge + bl OS_UnLockCartridge _020DB580: ldr r0, [r4, #0x4] bl OS_RestoreInterrupts diff --git a/arm9/asm/CTRDG_backup.s b/arm9/asm/CTRDG_backup.s index 946a8cd6..03ed704a 100644 --- a/arm9/asm/CTRDG_backup.s +++ b/arm9/asm/CTRDG_backup.s @@ -54,7 +54,7 @@ CTRDG_IdentifyAgbBackup: ; 0x020DBD50 strh r1, [r2, #0x0] ldrh r0, [r0, #0x0] ldreq r5, _020DBEEC ; =UNK_02103FE8 - bl OS_UnlockCartridge2 + bl OS_UnlockCartridge ldr r2, [r5, #0x0] mov r0, #0x1 ldrh r1, [r2, #0x38] diff --git a/arm9/asm/CTRDG_flash_AT29LV512.s b/arm9/asm/CTRDG_flash_AT29LV512.s index 1efaaf03..02585b07 100644 --- a/arm9/asm/CTRDG_flash_AT29LV512.s +++ b/arm9/asm/CTRDG_flash_AT29LV512.s @@ -287,7 +287,7 @@ _020DC92C: orr r0, r0, r5 strh r0, [r3, #0x0] ldrh r0, [r1, #0x0] - bl OS_UnlockCartridge2 + bl OS_UnlockCartridge mov r0, r4 add sp, sp, #0x24 ldmia sp!, {r4-r5,lr} @@ -428,7 +428,7 @@ _020DCB18: ldr r0, _020DCB84 ; =UNK_021D6B0C strh r1, [r2, #0x0] ldrh r0, [r0, #0x0] - bl OS_UnlockCartridge2 + bl OS_UnlockCartridge mov r0, r5 add sp, sp, #0x24 ldmia sp!, {r4-r5,lr} @@ -495,7 +495,7 @@ CTRDGi_EraseFlashChipCoreAT: ; 0x020DCBA0 orr r0, r0, r5 strh r0, [r3, #0x0] ldrh r0, [r1, #0x0] - bl OS_UnlockCartridge2 + bl OS_UnlockCartridge mov r0, r4 add sp, sp, #0x4 ldmia sp!, {r4-r5,lr} diff --git a/arm9/asm/CTRDG_flash_LE39FW512.s b/arm9/asm/CTRDG_flash_LE39FW512.s index cb702648..77071a6d 100644 --- a/arm9/asm/CTRDG_flash_LE39FW512.s +++ b/arm9/asm/CTRDG_flash_LE39FW512.s @@ -122,7 +122,7 @@ CTRDGi_VerifyFlashErase: ; 0x020DCD94 orr r1, r1, r6 strh r1, [r2, #0x0] ldrh r0, [r0, #0x0] - bl OS_UnlockCartridge2 + bl OS_UnlockCartridge mov r0, r4 ldmia sp!, {r4-r6,lr} bx lr @@ -267,7 +267,7 @@ _020DCFD4: orr r1, r1, r5 strh r1, [r2, #0x0] ldrh r0, [r0, #0x0] - bl OS_UnlockCartridge2 + bl OS_UnlockCartridge mov r0, r8 add sp, sp, #0x24 ldmia sp!, {r4-r9,lr} @@ -379,7 +379,7 @@ CTRDGi_EraseFlashSectorCoreLE: ; 0x020DD098 orr r0, r0, r5 strh r0, [r3, #0x0] ldrh r0, [r1, #0x0] - bl OS_UnlockCartridge2 + bl OS_UnlockCartridge mov r0, r4 add sp, sp, #0x28 ldmia sp!, {r4-r6,lr} @@ -447,7 +447,7 @@ CTRDGi_EraseFlashChipCoreLE: ; 0x020DD1DC orr r0, r0, r5 strh r0, [r3, #0x0] ldrh r0, [r1, #0x0] - bl OS_UnlockCartridge2 + bl OS_UnlockCartridge mov r0, r4 add sp, sp, #0x4 ldmia sp!, {r4-r5,lr} diff --git a/arm9/asm/CTRDG_flash_MX29L010.s b/arm9/asm/CTRDG_flash_MX29L010.s index 1b566288..646121f3 100644 --- a/arm9/asm/CTRDG_flash_MX29L010.s +++ b/arm9/asm/CTRDG_flash_MX29L010.s @@ -183,7 +183,7 @@ _020DD4FC: orr r1, r1, r7 strh r1, [r2, #0x0] ldrh r0, [r0, #0x0] - bl OS_UnlockCartridge2 + bl OS_UnlockCartridge mov r0, r6 add sp, sp, #0x28 ldmia sp!, {r4-r8,lr} @@ -323,7 +323,7 @@ _020DD714: orr r0, r3, r0 strh r0, [r2, #0x0] ldrh r0, [r1, #0x0] - bl OS_UnlockCartridge2 + bl OS_UnlockCartridge ldr r0, [sp, #0x4] add sp, sp, #0x34 ldmia sp!, {r4-r11,lr} @@ -391,7 +391,7 @@ CTRDGi_EraseFlashChipCoreMX: ; 0x020DD76C orr r0, r0, r5 strh r0, [r3, #0x0] ldrh r0, [r1, #0x0] - bl OS_UnlockCartridge2 + bl OS_UnlockCartridge mov r0, r4 add sp, sp, #0x4 ldmia sp!, {r4-r5,lr} diff --git a/arm9/asm/CTRDG_flash_MX29L512.s b/arm9/asm/CTRDG_flash_MX29L512.s index 38b1f5bf..f075c9f0 100644 --- a/arm9/asm/CTRDG_flash_MX29L512.s +++ b/arm9/asm/CTRDG_flash_MX29L512.s @@ -109,7 +109,7 @@ _020DD9B8: orr r1, r1, r7 strh r1, [r2, #0x0] ldrh r0, [r0, #0x0] - bl OS_UnlockCartridge2 + bl OS_UnlockCartridge mov r0, r6 add sp, sp, #0x28 ldmia sp!, {r4-r8,lr} diff --git a/arm9/asm/CTRDG_flash_common.s b/arm9/asm/CTRDG_flash_common.s index 80aff25a..8f1c400c 100644 --- a/arm9/asm/CTRDG_flash_common.s +++ b/arm9/asm/CTRDG_flash_common.s @@ -164,7 +164,7 @@ _020DC0D4: orr r0, r0, r7 strh r0, [r3, #0x0] ldrh r0, [r1, #0x0] - bl OS_UnlockCartridge2 + bl OS_UnlockCartridge mov r0, r4 add sp, sp, #0x24 ldmia sp!, {r4-r7,lr} @@ -253,7 +253,7 @@ _020DC22C: orr r1, r1, r8 strh r1, [r2, #0x0] ldrh r0, [r0, #0x0] - bl OS_UnlockCartridge2 + bl OS_UnlockCartridge mov r0, #0x0 add sp, sp, #0x28 ldmia sp!, {r4-r8,lr} diff --git a/arm9/asm/OS_spinLock.s b/arm9/asm/OS_spinLock.s deleted file mode 100644 index 3137a69b..00000000 --- a/arm9/asm/OS_spinLock.s +++ /dev/null @@ -1,350 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - .extern isInitialized - - .text - - arm_func_start OS_UnlockCartridge -OS_UnlockCartridge: ; 0x020CA094 - ldr r1, _020CA09C ; =OS_UnlockCartridge2 - bx r1 - .balign 4 -_020CA09C: .word OS_UnlockCartridge2 - - 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 - - arm_func_start OSi_FreeCartridgeBus -OSi_FreeCartridgeBus: ; 0x020CA198 - ldr r1, _020CA1AC ; =0x04000204 - ldrh r0, [r1, #0x0] - orr r0, r0, #0x80 - strh r0, [r1, #0x0] - bx lr - .balign 4 -_020CA1AC: .word 0x04000204 - - arm_func_start OSi_AllocateCartridgeBus -OSi_AllocateCartridgeBus: ; 0x020CA1B0 - ldr r1, _020CA1C4 ; =0x04000204 - ldrh r0, [r1, #0x0] - bic r0, r0, #0x80 - strh r0, [r1, #0x0] - bx lr - .balign 4 -_020CA1C4: .word 0x04000204 - - arm_func_start OS_TryLockCartridge -OS_TryLockCartridge: ; 0x020CA1C8 - ldr ip, _020CA1DC ; =OSi_DoTryLockByWord - ldr r1, _020CA1E0 ; =0x027FFFE8 - ldr r2, _020CA1E4 ; =OSi_AllocateCartridgeBus - mov r3, #0x1 - bx r12 - .balign 4 -_020CA1DC: .word OSi_DoTryLockByWord -_020CA1E0: .word 0x027FFFE8 -_020CA1E4: .word OSi_AllocateCartridgeBus - - arm_func_start OS_UnlockCartridge2 -OS_UnlockCartridge2: ; 0x020CA1E8 - ldr ip, _020CA1FC ; =FUN_020CA2B8 - ldr r1, _020CA200 ; =0x027FFFE8 - ldr r2, _020CA204 ; =OSi_FreeCartridgeBus - mov r3, #0x1 - bx r12 - .balign 4 -_020CA1FC: .word FUN_020CA2B8 -_020CA200: .word 0x027FFFE8 -_020CA204: .word OSi_FreeCartridgeBus - - arm_func_start OS_LockCartridge -OS_LockCartridge: ; 0x020CA208 - ldr ip, _020CA21C ; =FUN_020CA358 - ldr r1, _020CA220 ; =0x027FFFE8 - ldr r2, _020CA224 ; =OSi_AllocateCartridgeBus - mov r3, #0x1 - bx r12 - .balign 4 -_020CA21C: .word FUN_020CA358 -_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 ; =FUN_020CA2B8 - mov r3, #0x0 - bx r12 - .balign 4 -_020CA2B4: .word FUN_020CA2B8 - - arm_func_start FUN_020CA2B8 -FUN_020CA2B8: ; 0x020CA2B8 - stmdb sp!, {r4-r7,lr} - sub sp, sp, #0x4 - mov r7, r1 - ldrh r1, [r7, #0x4] - mov r6, r2 - mov r5, r3 - cmp r0, r1 - addne sp, sp, #0x4 - mvnne r0, #0x1 - ldmneia sp!, {r4-r7,lr} - bxne lr - cmp r5, #0x0 - beq _020CA2F8 - bl OS_DisableInterrupts_IrqAndFiq - mov r4, r0 - b _020CA300 -_020CA2F8: - bl OS_DisableInterrupts - mov r4, r0 -_020CA300: - mov r0, #0x0 - strh r0, [r7, #0x4] - cmp r6, #0x0 - beq _020CA314 - blx r6 -_020CA314: - mov r0, #0x0 - str r0, [r7, #0x0] - cmp r5, #0x0 - beq _020CA330 - mov r0, r4 - bl OS_RestoreInterrupts_IrqAndFiq - b _020CA338 -_020CA330: - mov r0, r4 - bl OS_RestoreInterrupts -_020CA338: - mov r0, #0x0 - add sp, sp, #0x4 - ldmia sp!, {r4-r7,lr} - bx lr - - arm_func_start OS_TryLockByWord -OS_TryLockByWord: ; 0x020CA348 - ldr ip, _020CA354 ; =FUN_020CA358 - mov r3, #0x0 - bx r12 - .balign 4 -_020CA354: .word FUN_020CA358 - - arm_func_start FUN_020CA358 -FUN_020CA358: ; 0x020CA358 - stmdb sp!, {r4-r8,lr} - mov r8, r0 - mov r7, r1 - mov r6, r2 - mov r5, r3 - bl OSi_DoTryLockByWord - cmp r0, #0x0 - ldmleia sp!, {r4-r8,lr} - bxle lr - mov r4, #0x400 -_020CA380: - mov r0, r4 - bl SVC_WaitByLoop - mov r0, r8 - mov r1, r7 - mov r2, r6 - mov r3, r5 - bl OSi_DoTryLockByWord - cmp r0, #0x0 - bgt _020CA380 - ldmia sp!, {r4-r8,lr} - bx lr - - arm_func_start OS_InitLock -OS_InitLock: ; 0x020CA3AC - stmdb sp!, {r4-r5,lr} - sub sp, sp, #0x4 - ldr r0, _020CA484 ; =isInitialized - ldr r1, [r0, #0x0] - cmp r1, #0x0 - addne sp, sp, #0x4 - ldmneia sp!, {r4-r5,lr} - bxne lr - mov r2, #0x1 - ldr r1, _020CA488 ; =0x027FFFF0 - str r2, [r0, #0x0] - mov r2, #0x0 - mov r0, #0x7e - str r2, [r1, #0x0] - bl OS_TryLockByWord - ldr r5, _020CA488 ; =0x027FFFF0 - ldrh r0, [r5, #0x6] - cmp r0, #0x0 - beq _020CA410 - mov r4, #0x400 -_020CA3FC: - mov r0, r4 - bl SVC_WaitByLoop - ldrh r0, [r5, #0x6] - cmp r0, #0x0 - bne _020CA3FC -_020CA410: - ldr r2, _020CA48C ; =0x027FFFB0 - mvn r12, #0x0 - mov r0, #0x10000 - ldr r3, _020CA490 ; =0x027FFFB4 - ldr r1, _020CA494 ; =0x027FFFC0 - str r12, [r2, #0x0] - rsb r12, r0, #0x0 - mov r0, #0x0 - mov r2, #0x28 - str r12, [r3, #0x0] - bl MIi_CpuClear32 - ldr ip, _020CA498 ; =0x04000204 - ldr r1, _020CA488 ; =0x027FFFF0 - ldrh r3, [r12, #0x0] - mov r0, #0x7e - mov r2, #0x0 - orr r3, r3, #0x800 - strh r3, [r12, #0x0] - ldrh r3, [r12, #0x0] - orr r3, r3, #0x80 - strh r3, [r12, #0x0] - bl OS_UnlockByWord - ldr r1, _020CA488 ; =0x027FFFF0 - mov r0, #0x7f - mov r2, #0x0 - bl OS_TryLockByWord - add sp, sp, #0x4 - ldmia sp!, {r4-r5,lr} - bx lr - .balign 4 -_020CA484: .word isInitialized -_020CA488: .word 0x027FFFF0 -_020CA48C: .word 0x027FFFB0 -_020CA490: .word 0x027FFFB4 -_020CA494: .word 0x027FFFC0 -_020CA498: .word 0x04000204 diff --git a/arm9/data/bss_2.s b/arm9/data/bss_2.s index 1a39bbf1..d5bea8ba 100644 --- a/arm9/data/bss_2.s +++ b/arm9/data/bss_2.s @@ -1075,59 +1075,3 @@ UNK_021D3450: ; 0x021D3450 .global UNK_021D3454 UNK_021D3454: ; 0x021D3454 .space 0x28 - - .global isInitialized -isInitialized: ; 0x021D347C - .space 0x4 - - .global OSi_StackForDestructor -OSi_StackForDestructor: ; 0x021D3480 - .space 0x4 - - .global OSi_RescheduleCount -OSi_RescheduleCount: ; 0x021D3484 - .space 0x4 - - .global OSi_ThreadIdCount -OSi_ThreadIdCount: ; 0x021D3488 - .space 0x4 - - .global OSi_SystemCallbackInSwitchThread -OSi_SystemCallbackInSwitchThread: ; 0x021D348C - .space 0x4 - - .global OSi_CurrentThreadPtr -OSi_CurrentThreadPtr: ; 0x021D3490 - .space 0x4 - - .global OSi_IsThreadInitialized -OSi_IsThreadInitialized: ; 0x021D3494 - .space 0x4 - - .global OSi_ThreadInfo -OSi_ThreadInfo: ; 0x021D3498 - .space 0x4 - - .global UNK_021D349C -UNK_021D349C: ; 0x021D349C - .space 0xc - - .global OSi_IdleThread -OSi_IdleThread: ; 0x021D34A8 - .space 0xc0 - - .global OSi_LauncherThread -OSi_LauncherThread: ; 0x021D3568 - .space 0xC0 - - .global OSi_IdleThreadStack -OSi_IdleThreadStack: ; 0x021D3628 - .space 0xC8 - - .global OSi_Initialized -OSi_Initialized: ; 0x021D36F0 - .space 0x4 - - .global OSi_MainExArenaEnabled -OSi_MainExArenaEnabled: ; 0x021D36F4 - .space 0x4 diff --git a/arm9/data/bss_2_2.s b/arm9/data/bss_2_2.s new file mode 100644 index 00000000..1938d318 --- /dev/null +++ b/arm9/data/bss_2_2.s @@ -0,0 +1,53 @@ + .section .bss + + .global OSi_StackForDestructor +OSi_StackForDestructor: ; 0x021D3480 + .space 0x4 + + .global OSi_RescheduleCount +OSi_RescheduleCount: ; 0x021D3484 + .space 0x4 + + .global OSi_ThreadIdCount +OSi_ThreadIdCount: ; 0x021D3488 + .space 0x4 + + .global OSi_SystemCallbackInSwitchThread +OSi_SystemCallbackInSwitchThread: ; 0x021D348C + .space 0x4 + + .global OSi_CurrentThreadPtr +OSi_CurrentThreadPtr: ; 0x021D3490 + .space 0x4 + + .global OSi_IsThreadInitialized +OSi_IsThreadInitialized: ; 0x021D3494 + .space 0x4 + + .global OSi_ThreadInfo +OSi_ThreadInfo: ; 0x021D3498 + .space 0x4 + + .global UNK_021D349C +UNK_021D349C: ; 0x021D349C + .space 0xc + + .global OSi_IdleThread +OSi_IdleThread: ; 0x021D34A8 + .space 0xc0 + + .global OSi_LauncherThread +OSi_LauncherThread: ; 0x021D3568 + .space 0xC0 + + .global OSi_IdleThreadStack +OSi_IdleThreadStack: ; 0x021D3628 + .space 0xC8 + + .global OSi_Initialized +OSi_Initialized: ; 0x021D36F0 + .space 0x4 + + .global OSi_MainExArenaEnabled +OSi_MainExArenaEnabled: ; 0x021D36F4 + .space 0x4 diff --git a/arm9/global.inc b/arm9/global.inc index 3185d0e4..c9776676 100644 --- a/arm9/global.inc +++ b/arm9/global.inc @@ -6432,12 +6432,14 @@ .extern OS_SleepThread
.extern OS_SpinWait
.extern OS_Terminate
+.extern OS_TryLockByWord
.extern OS_TryLockCard
.extern OS_TryLockCartridge
.extern OS_TryLockMutex
+.extern OS_UnlockByWord
.extern OS_UnlockCard
+.extern OS_UnLockCartridge
.extern OS_UnlockCartridge
-.extern OS_UnlockCartridge2
.extern OS_UnlockMutex
.extern OS_WaitIrq
.extern OS_WaitVBlankIntr
@@ -6447,7 +6449,10 @@ .extern OSi_AlarmQueue
.extern OSi_CurrentThreadPtr
.extern OSi_DebuggerHandler
+.extern OSi_DoLockByWord
.extern OSi_DoResetSystem
+.extern OSi_DoTryLockByWord
+.extern OSi_DoUnlockByWord
.extern OSi_EnterDmaCallback
.extern OSi_EnterTimerCallback
.extern OSi_ExContext
diff --git a/arm9/lib/include/MI_exMemory.h b/arm9/lib/include/MI_exMemory.h index 4a8a10a8..8bd355ac 100644 --- a/arm9/lib/include/MI_exMemory.h +++ b/arm9/lib/include/MI_exMemory.h @@ -1,9 +1,23 @@ #ifndef NITRO_MI_EXMEMORY_H_ #define NITRO_MI_EXMEMORY_H_ +#include "consts.h" + typedef enum { MI_PROCESSOR_ARM9 = 0, MI_PROCESSOR_ARM7 = 1 } MIProcessor; +static inline void MIi_SetCardProcessor(MIProcessor proc) +{ + reg_MI_EXMEMCNT = + (u16)((reg_MI_EXMEMCNT & ~0x0800) | (proc << 11)); +} + +static inline void MIi_SetCartridgeProcessor(MIProcessor proc) +{ + reg_MI_EXMEMCNT = + (u16)((reg_MI_EXMEMCNT & ~0x0080) | (proc << 7)); +} + #endif //NITRO_MI_EXMEMORY_H_ diff --git a/arm9/lib/include/OS_init.h b/arm9/lib/include/OS_init.h index a998b45e..69d21213 100644 --- a/arm9/lib/include/OS_init.h +++ b/arm9/lib/include/OS_init.h @@ -23,6 +23,7 @@ #include "OS_terminate_proc.h" #include "OS_interrupt.h" #include "OS_reset.h" +#include "OS_spinLock.h" void OS_Init(); diff --git a/arm9/lib/include/OS_spinLock.h b/arm9/lib/include/OS_spinLock.h index 3bb8a1c2..eccc502b 100644 --- a/arm9/lib/include/OS_spinLock.h +++ b/arm9/lib/include/OS_spinLock.h @@ -5,12 +5,41 @@ #ifndef POKEDIAMOND_OS_SPINLOCK_H #define POKEDIAMOND_OS_SPINLOCK_H +#include "types.h" +#include "syscall.h" + typedef volatile struct OSLockWord { u32 lockFlag; u16 ownerID; u16 extension; } OSLockWord; +static inline void OSi_WaitByLoop(void) +{ + SVC_WaitByLoop(0x1000 / 4); +} + +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)); +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_LockCartridge(u16 lockID); +s32 OS_UnlockCartridge(u16 lockID); +s32 OS_TryLockCartridge(u16 lockID); +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 27255115..207e0509 100644 --- a/arm9/lib/include/mmap.h +++ b/arm9/lib/include/mmap.h @@ -39,6 +39,11 @@ extern u32 SDK_AUTOLOAD_DTCM_START[]; #define HW_DTCM_SVC_STACK (HW_DTCM_SVC_STACK_END - HW_SVC_STACK_SIZE) #define HW_DTCM_IRQ_STACK_END (HW_DTCM_SVC_STACK) +#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) #define OSi_MAIN_ARENA_HI_DEFAULT (HW_MAIN_MEM_MAIN_END) diff --git a/arm9/lib/src/OS_init.c b/arm9/lib/src/OS_init.c index a1db8788..a34196f4 100644 --- a/arm9/lib/src/OS_init.c +++ b/arm9/lib/src/OS_init.c @@ -6,7 +6,6 @@ #include "OS_init.h" extern void PXI_Init(); -extern void OS_InitLock(); extern void OS_InitException(); extern void MI_Init(); extern void OS_InitVAlarm(); diff --git a/arm9/lib/src/OS_spinLock.c b/arm9/lib/src/OS_spinLock.c new file mode 100644 index 00000000..5050a7bd --- /dev/null +++ b/arm9/lib/src/OS_spinLock.c @@ -0,0 +1,217 @@ +// +// Created by red031000 on 2020-05-21. +// + +#include "OS_spinLock.h" +#include "OS_system.h" +#include "function_target.h" +#include "consts.h" +#include "MI_exMemory.h" + +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(void) +{ + 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); + + (void)OS_UnlockByWord(0x7e, lockp, NULL); + (void)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; +} + +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) + { + (void)OS_RestoreInterrupts_IrqAndFiq(lastIntrMode); + } + else + { + (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; +} + +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) +{ + MIi_SetCartridgeProcessor(MI_PROCESSOR_ARM9); +} + +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 +} |