summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm9/arm9.lcf3
-rw-r--r--arm9/asm/OS_spinLock_asm.s (renamed from arm9/asm/OS_spinLock.s)66
-rw-r--r--arm9/data/bss_2.s56
-rw-r--r--arm9/data/bss_2_2.s53
-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.h9
-rw-r--r--arm9/lib/include/mmap.h3
-rw-r--r--arm9/lib/src/OS_init.c1
-rw-r--r--arm9/lib/src/OS_spinLock.c46
10 files changed, 129 insertions, 123 deletions
diff --git a/arm9/arm9.lcf b/arm9/arm9.lcf
index 4bdb86db..4c9c4044 100644
--- a/arm9/arm9.lcf
+++ b/arm9/arm9.lcf
@@ -457,6 +457,7 @@ 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)
@@ -584,6 +585,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/OS_spinLock.s b/arm9/asm/OS_spinLock_asm.s
index 3137a69b..dd8ada80 100644
--- a/arm9/asm/OS_spinLock.s
+++ b/arm9/asm/OS_spinLock_asm.s
@@ -282,69 +282,3 @@ _020CA380:
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/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..7711b423 100644
--- a/arm9/lib/include/OS_spinLock.h
+++ b/arm9/lib/include/OS_spinLock.h
@@ -5,12 +5,21 @@
#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()
+{
+ SVC_WaitByLoop(0x1000 / 4);
+}
+
+void OS_InitLock();
s32 OS_GetLockID(void);
#endif //POKEDIAMOND_OS_SPINLOCK_H
diff --git a/arm9/lib/include/mmap.h b/arm9/lib/include/mmap.h
index 27255115..b316a1fa 100644
--- a/arm9/lib/include/mmap.h
+++ b/arm9/lib/include/mmap.h
@@ -39,6 +39,9 @@ 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_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..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);
+}