diff options
-rw-r--r-- | arm9/arm9.lcf | 3 | ||||
-rw-r--r-- | arm9/asm/OS_spinLock_asm.s (renamed from arm9/asm/OS_spinLock.s) | 66 | ||||
-rw-r--r-- | arm9/data/bss_2.s | 56 | ||||
-rw-r--r-- | arm9/data/bss_2_2.s | 53 | ||||
-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 | 9 | ||||
-rw-r--r-- | arm9/lib/include/mmap.h | 3 | ||||
-rw-r--r-- | arm9/lib/src/OS_init.c | 1 | ||||
-rw-r--r-- | arm9/lib/src/OS_spinLock.c | 46 |
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); +} |