summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm9/arm9.lcf2
-rw-r--r--arm9/asm/CTRDG.s6
-rw-r--r--arm9/asm/CTRDG_backup.s2
-rw-r--r--arm9/asm/CTRDG_flash_AT29LV512.s6
-rw-r--r--arm9/asm/CTRDG_flash_LE39FW512.s8
-rw-r--r--arm9/asm/CTRDG_flash_MX29L010.s6
-rw-r--r--arm9/asm/CTRDG_flash_MX29L512.s2
-rw-r--r--arm9/asm/CTRDG_flash_common.s4
-rw-r--r--arm9/asm/OS_spinLock.s350
-rw-r--r--arm9/data/bss_2.s56
-rw-r--r--arm9/data/bss_2_2.s53
-rw-r--r--arm9/global.inc7
-rw-r--r--arm9/lib/include/MI_exMemory.h14
-rw-r--r--arm9/lib/include/OS_init.h1
-rw-r--r--arm9/lib/include/OS_spinLock.h29
-rw-r--r--arm9/lib/include/mmap.h5
-rw-r--r--arm9/lib/src/OS_init.c1
-rw-r--r--arm9/lib/src/OS_spinLock.c217
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
+}