partial OS_interrupt

This commit is contained in:
red031000
2020-05-07 19:16:27 +01:00
parent c8255e7f32
commit be09adbcb7
8 changed files with 114 additions and 100 deletions

View File

@@ -144,6 +144,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

@@ -139,101 +139,3 @@ OSi_EnterDmaCallback: ; 0x020C9F14
_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

@@ -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,28 @@
//
// 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);
#endif //POKEDIAMOND_OS_INTERRUPT_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,69 @@
//
// 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;
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;
}

View File

@@ -18,7 +18,7 @@ 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) {