OS_InitLock

This commit is contained in:
red031000
2020-05-21 20:23:26 +01:00
parent 79a7e3dac8
commit b4d6f1314b
10 changed files with 129 additions and 123 deletions

View File

@@ -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)

View File

@@ -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

View File

@@ -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

53
arm9/data/bss_2_2.s Normal file
View File

@@ -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

View File

@@ -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_

View File

@@ -23,6 +23,7 @@
#include "OS_terminate_proc.h"
#include "OS_interrupt.h"
#include "OS_reset.h"
#include "OS_spinLock.h"
void OS_Init();

View File

@@ -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

View File

@@ -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)

View File

@@ -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();

View File

@@ -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);
}