Merge pull request #70 from red031000/master

OS_terminate_proc and partial OS_interrupt
This commit is contained in:
Revo
2020-05-08 10:44:07 -04:00
committed by GitHub
11 changed files with 158 additions and 143 deletions

View File

@@ -155,6 +155,7 @@ SECTIONS {
GX_asm.o (.text)
OS_irqHandler.o (.text)
OS_irqTable.o (.text)
OS_interrupt_asm.o (.text)
OS_interrupt.o (.text)
OS_spinLock.o (.text)
OS_printf.o (.text)

View File

@@ -116,124 +116,3 @@ OSi_EnterTimerCallback: ; 0x020C9EC8
_020C9F08: .word OSi_IrqCallbackInfo+0x30
_020C9F0C: .word OSi_IrqCallbackInfo+0x38
_020C9F10: .word OSi_IrqCallbackInfo+0x34
arm_func_start OSi_EnterDmaCallback
OSi_EnterDmaCallback: ; 0x020C9F14
stmdb sp!, {r4-r6,lr}
mov r3, #0xc
mul r6, r0, r3
ldr ip, _020C9F54 ; =OSi_IrqCallbackInfo
add r4, r0, #0x8
mov r5, #0x1
mov r0, r5, lsl r4
ldr r3, _020C9F58 ; =0x021D3424
str r1, [r12, r6]
str r2, [r3, r6]
bl OS_EnableIrqMask
and r1, r0, r5, lsl r4
ldr r0, _020C9F5C ; =0x021D3420
str r1, [r0, r6]
ldmia sp!, {r4-r6,lr}
bx lr
.balign 4
_020C9F54: .word OSi_IrqCallbackInfo
_020C9F58: .word OSi_IrqCallbackInfo + 8
_020C9F5C: .word OSi_IrqCallbackInfo + 4
arm_func_start OS_GetIrqFunction
OS_GetIrqFunction: ; 0x020C9F60
ldr r2, _020C9FE4 ; =0x027E0000
mov r3, #0x0
_020C9F68:
ands r1, r0, #0x1
beq _020C9FC8
cmp r3, #0x8
blt _020C9F98
cmp r3, #0xb
bgt _020C9F98
sub r1, r3, #0x8
mov r0, #0xc
mul r2, r1, r0
ldr r0, _020C9FE8 ; =OSi_IrqCallbackInfo
ldr r0, [r0, r2]
bx lr
_020C9F98:
cmp r3, #0x3
blt _020C9FC0
cmp r3, #0x6
bgt _020C9FC0
add r1, r3, #0x1
mov r0, #0xc
mul r2, r1, r0
ldr r0, _020C9FE8 ; =OSi_IrqCallbackInfo
ldr r0, [r0, r2]
bx lr
_020C9FC0:
ldr r0, [r2, #0x0]
bx lr
_020C9FC8:
add r3, r3, #0x1
cmp r3, #0x16
mov r0, r0, lsr #0x1
add r2, r2, #0x4
blt _020C9F68
mov r0, #0x0
bx lr
.balign 4
_020C9FE4: .word 0x027E0000
_020C9FE8: .word OSi_IrqCallbackInfo
arm_func_start OS_SetIrqFunction
OS_SetIrqFunction: ; 0x020C9FEC
stmdb sp!, {r4-r8,lr}
mov r8, #0x0
ldr lr, _020CA074 ; =0x027E0000
ldr r5, _020CA078 ; =OSi_IrqCallbackInfo
mov r6, r8
mov r12, r8
mov r3, #0x1
mov r2, #0xc
_020CA00C:
ands r4, r0, #0x1
beq _020CA05C
mov r7, r6
cmp r8, #0x8
blt _020CA030
cmp r8, #0xb
suble r4, r8, #0x8
mlale r7, r4, r2, r5
ble _020CA04C
_020CA030:
cmp r8, #0x3
blt _020CA048
cmp r8, #0x6
addle r4, r8, #0x1
mlale r7, r4, r2, r5
ble _020CA04C
_020CA048:
str r1, [lr, r8, lsl #0x2]
_020CA04C:
cmp r7, #0x0
strne r1, [r7, #0x0]
strne r12, [r7, #0x8]
strne r3, [r7, #0x4]
_020CA05C:
add r8, r8, #0x1
cmp r8, #0x16
mov r0, r0, lsr #0x1
blt _020CA00C
ldmia sp!, {r4-r8,lr}
bx lr
.balign 4
_020CA074: .word 0x027E0000
_020CA078: .word OSi_IrqCallbackInfo
arm_func_start OS_InitIrqTable
OS_InitIrqTable: ; 0x020CA07C
ldr r0, _020CA090 ; =0x027E0060
mov r1, #0x0
str r1, [r0, #0x4]
str r1, [r0, #0x0]
bx lr
.balign 4
_020CA090: .word 0x027E0060

View File

@@ -1,19 +0,0 @@
.include "asm/macros.inc"
.include "global.inc"
.text
arm_func_start OS_Halt
OS_Halt: ; 0x020CD844
mov r0, #0x0
mcr p15, 0x0, r0, c7, c0, 0x4
bx lr
arm_func_start OS_Terminate
OS_Terminate: ; 0x020CD850
stmdb sp!, {lr}
sub sp, sp, #0x4
_020CD858:
bl OS_DisableInterrupts
bl OS_Halt
b _020CD858

View File

@@ -16,6 +16,8 @@
#include "OS_arena.h"
#include "OS_alloc.h"
#include "OS_system.h"
#include "OS_terminate_proc.h"
#include "OS_interrupt.h"
#include "OS_reset.h"
void OS_Init();

View File

@@ -0,0 +1,29 @@
//
// Created by red031000 on 2020-05-07.
//
#ifndef POKEDIAMOND_OS_INTERRUPT_H
#define POKEDIAMOND_OS_INTERRUPT_H
#include "types.h"
typedef void (*OSIrqFunction) (void);
typedef struct
{
void (*func) (void *);
u32 enable;
void* arg;
} OSIrqCallbackInfo;
typedef u32 OSIrqMask;
extern OSIrqFunction OS_IRQTable[];
extern OSIrqCallbackInfo OSi_IrqCallbackInfo[7+1];
void OS_InitIrqTable();
void OS_SetIrqFunction(OSIrqMask intrBit, OSIrqFunction function);
OSIrqFunction OS_GetIrqFunction(OSIrqMask intrBit);
void OSi_EnterDmaCallback(u32 dmaNo, void (*callback) (void *), void *arg);
#endif //POKEDIAMOND_OS_INTERRUPT_H

View File

@@ -0,0 +1,11 @@
//
// Created by red031000 on 2020-05-07.
//
#ifndef POKEDIAMOND_OS_TERMINATE_PROC_H
#define POKEDIAMOND_OS_TERMINATE_PROC_H
void OS_Terminate();
void OS_Halt();
#endif //POKEDIAMOND_OS_TERMINATE_PROC_H

View File

@@ -7,6 +7,14 @@
typedef struct _OSThread OSThread;
struct _OSThreadQueue
{
OSThread *head;
OSThread *tail;
};
typedef struct _OSThreadQueue OSThreadQueue;
typedef struct OSThreadInfo {
u16 isNeedRescheduling;
u16 irqDepth;
@@ -20,4 +28,9 @@ struct _OSThread
u8 padding[0x80]; //todo: not the correct size but idfk
};
static inline void OS_InitThreadQueue(OSThreadQueue * queue)
{
queue->head = queue->tail = NULL;
}
#endif //POKEDIAMOND_OS_THREAD_H

View File

@@ -7,7 +7,6 @@
extern void PXI_Init();
extern void OS_InitLock();
extern void OS_InitIrqTable();
extern void OS_SetIrqStackChecker();
extern void OS_InitException();
extern void MI_Init();

View File

@@ -0,0 +1,79 @@
//
// Created by red031000 on 2020-05-07.
//
#include "consts.h"
#include "function_target.h"
#include "OS_interrupt.h"
#include "OS_thread.h"
#pragma optimize_for_size on
extern OSThreadQueue OSi_IrqThreadQueue;
extern OSIrqMask OS_EnableIrqMask(OSIrqMask intr);
ARM_FUNC void OS_InitIrqTable() {
OS_InitThreadQueue(&OSi_IrqThreadQueue);
}
ARM_FUNC void OS_SetIrqFunction(OSIrqMask intrBit, OSIrqFunction function) {
s32 i;
OSIrqCallbackInfo *info;
for (i = 0; i < 0x16; i++) {
if (intrBit & 1) {
info = NULL;
if (8 <= i && i <= 11) {
info = &OSi_IrqCallbackInfo[i - 8];
}
else if (3 <= i && i <= 6) {
info = &OSi_IrqCallbackInfo[i - 3 + 4];
}
else {
OS_IRQTable[i] = function;
}
if (info) {
info->func = (void (*)(void *))function;
info->arg = 0;
info->enable = TRUE;
}
}
intrBit >>= 1;
}
}
ARM_FUNC OSIrqFunction OS_GetIrqFunction(OSIrqMask intrBit) {
s32 i = 0;
OSIrqFunction *funcPtr = &OS_IRQTable[0];
do {
if (intrBit & 1)
{
if (8 <= i && i <= 11) {
i = i - 8;
return (void (*)(void))OSi_IrqCallbackInfo[i].func;
}
else if (3 <= i && i <= 6) {
i++;
return (void (*)(void))OSi_IrqCallbackInfo[i].func;
}
return *funcPtr;
}
intrBit >>= 1;
funcPtr++;
i++;
} while (i < 0x16);
return 0;
}
ARM_FUNC void OSi_EnterDmaCallback(u32 dmaNo, void (*callback) (void *), void *arg)
{
OSIrqMask mask = 1UL << (dmaNo + 8);
OSi_IrqCallbackInfo[dmaNo].func = callback;
OSi_IrqCallbackInfo[dmaNo].arg = arg;
OSi_IrqCallbackInfo[dmaNo].enable = OS_EnableIrqMask(mask) & mask;
}

View File

@@ -5,20 +5,20 @@
#include "function_target.h"
#include "OS_reset.h"
#include "MB_mb.h"
#include "OS_terminate_proc.h"
extern u16 OSi_IsInitReset;
extern vu16 OSi_IsResetOccurred;
extern void PXI_Init();
extern u32 PXI_IsCallbackReady(u32 param1, u32 param2);
extern void PXI_SetFifoRecvCallback(u32 param1, void* callback);
extern void OS_Terminate();
extern u32 PXI_SendWordByFifo(u32 param1, u32 data, u32 param2);
extern void CARD_LockRom(u16 lockId);
extern u32 OS_GetLockID();
extern void MI_StopDma(u32 dma);
extern void OS_SetIrqMask(u32 mask);
extern void OS_ResetRequestIrqMask(u32 mask);
extern void OSi_DoResetSystem();
extern void OSi_DoResetSystem(); //in itcm, should technically be in this file
ARM_FUNC void OS_InitReset() {
if (OSi_IsInitReset) {

View File

@@ -0,0 +1,21 @@
//
// Created by red031000 on 2020-05-07.
//
#include "types.h"
#include "OS_terminate_proc.h"
#include "function_target.h"
#include "OS_system.h"
ARM_FUNC void OS_Terminate() {
while (TRUE) {
(void)OS_DisableInterrupts();
OS_Halt();
}
}
ARM_FUNC asm void OS_Halt() {
mov r0, #0x0
mcr p15, 0x0, r0, c7, c0, 0x4
bx lr
}