summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm9/arm9.lcf6
-rw-r--r--arm9/asm/CP_context.s4
-rw-r--r--arm9/asm/OS_context.s4
-rw-r--r--arm9/asm/OS_irqHandler.s63
-rw-r--r--arm9/asm/OS_irqTable.s12
-rw-r--r--arm9/asm/arm9_itcm.s123
-rw-r--r--arm9/global.inc2
-rw-r--r--arm9/lib/include/CP_context.h3
-rw-r--r--arm9/lib/include/OS_init.h1
-rw-r--r--arm9/lib/include/OS_irqHandler.h21
-rw-r--r--arm9/lib/include/OS_system.h1
-rw-r--r--arm9/lib/include/OS_thread.h2
-rw-r--r--arm9/lib/include/mmap.h3
-rw-r--r--arm9/lib/src/OS_interrupt.c4
-rw-r--r--arm9/lib/src/OS_irqHandler.c145
-rw-r--r--arm9/lib/src/OS_system.c1
-rw-r--r--arm9/src/main.c1
17 files changed, 196 insertions, 200 deletions
diff --git a/arm9/arm9.lcf b/arm9/arm9.lcf
index 57c4e18a..1153d481 100644
--- a/arm9/arm9.lcf
+++ b/arm9/arm9.lcf
@@ -815,7 +815,7 @@ SECTIONS {
libVCT.o (.data)
unk_020ADA84.o (.data)
GX.o (.data)
- OS_irqHandler.o (.data)
+ OS_irqTable.o (.data)
OS_emulator.o (.data)
FS_command.o (.data)
FS_command_default.o (.data)
@@ -963,6 +963,7 @@ SECTIONS {
{
. = ALIGN(32);
SDK_AUTOLOAD.ITCM.START = .;
+ OS_irqHandler.o (.itcm)
arm9_itcm.o (.text)
. = ALIGN(32);
SDK_AUTOLOAD.ITCM.END = .;
@@ -983,7 +984,6 @@ SECTIONS {
.DTCM : {
. = ALIGN(32);
SDK_AUTOLOAD.DTCM.START = .;
- OS_irqHandler.o (.dtcm)
OS_irqTable.o (.dtcm)
. = ALIGN(32);
SDK_AUTOLOAD.DTCM.END = .;
@@ -995,7 +995,7 @@ SECTIONS {
{
. = ALIGN(32);
SDK_AUTOLOAD.DTCM.BSS_START = .;
- OS_irqHandler.o (.bss)
+ OS_irqHandler.o (.dtcm.bss)
. = ALIGN(32);
SDK_AUTOLOAD.DTCM.BSS_END = .;
SDK_AUTOLOAD.DTCM.BSS_SIZE = SDK_AUTOLOAD.DTCM.BSS_END - SDK_AUTOLOAD.DTCM.BSS_START;
diff --git a/arm9/asm/CP_context.s b/arm9/asm/CP_context.s
index c756e8e2..6ab2c53f 100644
--- a/arm9/asm/CP_context.s
+++ b/arm9/asm/CP_context.s
@@ -22,8 +22,8 @@ CP_SaveContext: ; 0x020D3648
.balign 4
_020D3684: .word 0x04000290
- arm_func_start CP_RestoreContext
-CP_RestoreContext: ; 0x020D3688
+ arm_func_start CPi_RestoreContext
+CPi_RestoreContext: ; 0x020D3688
stmdb sp!, {r4}
ldr r1, _020D36C0 ; =0x04000290
ldmia r0, {r2-r4,r12}
diff --git a/arm9/asm/OS_context.s b/arm9/asm/OS_context.s
index 1b7db498..2c8feeb8 100644
--- a/arm9/asm/OS_context.s
+++ b/arm9/asm/OS_context.s
@@ -60,7 +60,7 @@ _020CBB78: .word CP_SaveContext
OS_LoadContext: ; 0x020CBB7C
stmdb sp!, {r0,lr}
add r0, r0, #0x48
- ldr r1, _020CBBBC ; =CP_RestoreContext
+ ldr r1, _020CBBBC ; =CPi_RestoreContext
blx r1
ldmia sp!, {r0,lr}
mrs r1, cpsr
@@ -75,4 +75,4 @@ OS_LoadContext: ; 0x020CBB7C
mov r0, r0
subs pc, lr, #0x4
.balign 4
-_020CBBBC: .word CP_RestoreContext
+_020CBBBC: .word CPi_RestoreContext
diff --git a/arm9/asm/OS_irqHandler.s b/arm9/asm/OS_irqHandler.s
deleted file mode 100644
index d0e563fb..00000000
--- a/arm9/asm/OS_irqHandler.s
+++ /dev/null
@@ -1,63 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .section .data
-
- .global OSi_IrqCallbackInfoIndex
-OSi_IrqCallbackInfoIndex: ; 0x02106818
- .short 8
- .short 9
- .short 10
- .short 11
- .short 3
- .short 4
- .short 5
- .short 6
-
- ; pragma section DTCM begin
- .section .bss
- .balign 16, 0
- .global OSi_IrqThreadQueue
-OSi_IrqThreadQueue: ; 027E0060
- .space 4
- ; pragma section DTCM end
-
- .section .text
-
- arm_func_start OS_WaitIrq
-OS_WaitIrq:
- stmdb sp!, {r4-r6,lr}
- mov r5, r0
- mov r4, r1
- bl OS_DisableInterrupts
- cmp r5, #0x0
- beq _020C9C3C
- ldr r1, _020C9C80 ; =0x027E0000
- mvn r2, r4
- add r1, r1, #0x3000
- ldr r3, [r1, #0xff8]
- and r2, r3, r2
- str r2, [r1, #0xff8]
-_020C9C3C:
- bl OS_RestoreInterrupts
- ldr r1, _020C9C80 ; =0x027E0000
- add r0, r1, #0x3000
- ldr r0, [r0, #0xff8]
- ands r0, r4, r0
- ldmneia sp!, {r4-r6,lr}
- bxne lr
- ldr r0, _020C9C84 ; =0x00003FF8
- add r6, r1, r0
- ldr r5, _020C9C88 ; =0x027E0060
-_020C9C64:
- mov r0, r5
- bl OS_SleepThread
- ldr r0, [r6, #0x0]
- ands r0, r4, r0
- beq _020C9C64
- ldmia sp!, {r4-r6,lr}
- bx lr
- .balign 4
-_020C9C80: .word 0x027E0000
-_020C9C84: .word 0x00003FF8
-_020C9C88: .word 0x027E0060
diff --git a/arm9/asm/OS_irqTable.s b/arm9/asm/OS_irqTable.s
index 6c106c92..e42d600b 100644
--- a/arm9/asm/OS_irqTable.s
+++ b/arm9/asm/OS_irqTable.s
@@ -36,6 +36,18 @@ OS_IRQTable: ; 027E0000 ;10b6a0
OSi_IrqCallbackInfo: ; 0x021D341C
.space 0x60
+ .section .data
+ .global OSi_IrqCallbackInfoIndex
+OSi_IrqCallbackInfoIndex: ; 0x02106818
+ .short 8
+ .short 9
+ .short 10
+ .short 11
+ .short 3
+ .short 4
+ .short 5
+ .short 6
+
.section .text
arm_func_start OSi_IrqTimer3
diff --git a/arm9/asm/arm9_itcm.s b/arm9/asm/arm9_itcm.s
index 7db3d194..e53c9b74 100644
--- a/arm9/asm/arm9_itcm.s
+++ b/arm9/asm/arm9_itcm.s
@@ -3,129 +3,6 @@
.section .text
; OS
- arm_func_start OS_IrqHandler
-OS_IrqHandler: ; 0x01FF8000
- stmfd sp!, {lr}
- mov ip, #0x04000000
- add ip, ip, #0x210
- ldr r1, [ip, #-8]
- cmp r1, #0
- ldmeqfd sp!, {pc}
- ldmia ip, {r1, r2}
- ands r1, r1, r2
- ldmeqfd sp!, {pc}
- mov r3, #0x80000000
-_01FF8028:
- clz r0, r1
- bics r1, r1, r3, lsr r0
- bne _01FF8028
- mov r1, r3, lsr r0
- str r1, [ip, #0x4]
- rsbs r0, r0, #0x1f
- ldr r1, _01FF8050 ; =0x027E0000
- ldr r0, [r1, r0, lsl #2]
- ldr lr, _01FF8054 ; =0x01FF70B8
- bx r0
-_01FF8050: .word OS_IRQTable
-_01FF8054: .word OS_IrqHandler_ThreadSwitch
-
- arm_func_start OS_IrqHandler_ThreadSwitch
-OS_IrqHandler_ThreadSwitch: ; 01FF8058
- ldr ip, _01FF81A4
- mov r3, #0x0
- ldr ip, [ip]
- mov r2, #0x1
- cmp ip, #0x0
- beq _01FF80A8
-_01FF8070:
- str r2, [ip, #0x64]
- str r3, [ip, #0x78]
- str r3, [ip, #0x7c]
- ldr r0, [ip, #0x80]
- str r3, [ip, #0x80]
- mov ip, r0
- cmp ip, #0x0
- bne _01FF8070
- ldr ip, _01FF81A4
- str r3, [ip]
- str r3, [ip, #0x4]
- ldr ip, _01FF81A8
- mov r1, #0x1
- strh r1, [ip]
-_01FF80A8:
- ldr ip, _01FF81A8
- ldrh r1, [ip]
- cmp r1, #0x0
- ldreq pc, [sp], #0x4
- mov r1, #0x0
- strh r1, [ip]
- mov r3, #0xd2
- msr CPSR_c, r3
- add r2, ip, #0x8
- ldr r1, [r2]
-_01FF80D0:
- cmp r1, #0x0
- ldrneh r0, [r1, #0x64]
- cmpne r0, #0x1
- ldrne r1, [r1, #0x68]
- bne _01FF80D0
- cmp r1, #0x0
- bne _01FF80F8
-_01FF80EC:
- mov r3, #0x92
- msr CPSR_c, r3
- ldr pc, [sp], #0x4
-_01FF80F8:
- ldr r0, [ip, #0x4]
- cmp r1, r0
- beq _01FF80EC
- ldr r3, [ip, #0xC]
- cmp r3, #0x0
- beq _01FF8120
- stmdb sp!, {r0, r1, ip}
- mov lr, pc
- bx r3
- ldmia sp!, {r0, r1, ip}
-_01FF8120:
- str r1, [ip, #0x4]
- mrs r2, SPSR
- str r2, [r0, #0x0]!
- stmdb sp!, {r0, r1}
- add r0, r0, #0x0
- add r0, r0, #0x48
- ldr r1, _01FF81AC
- blx r1
- ldmia sp!, {r0, r1}
- ldmib sp!, {r2, r3}
- stmib r0!, {r2, r3}
- ldmib sp!, {r2, r3, ip, lr}
- stmib r0!, {r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, sp, lr}^
- stmib r0!, {lr}
- mov r3, #0xd3
- msr CPSR_c, r3
- stmib r0!, {sp}
- stmfd sp!, {r1}
- add r0, r1, #0x0
- add r0, r0, #0x48
- ldr r1, _01FF81B0
- blx r1
- ldmfd sp!, {r1}
- ldr sp, [r1, #0x44]
- mov r3, #0xd2
- msr CPSR_c, r3
- ldr r2, [r1, #0x0]!
- msr SPSR_fc, r2
- ldr lr, [r1, #0x40]
- ldmib r1!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, sp, lr}^
- nop
- stmda sp!, {r0, r1, r2, r3, ip, lr}
- ldmfd sp!, {pc}
-_01FF81A4: .word OSi_IrqThreadQueue
-_01FF81A8: .word OSi_ThreadInfo
-_01FF81AC: .word CP_SaveContext
-_01FF81B0: .word CP_RestoreContext
-
- .section .text
arm_func_start OSi_DoBoot
OSi_DoBoot: ; 0x01FF81B4
mov ip, #0x04000000
diff --git a/arm9/global.inc b/arm9/global.inc
index 41378676..67ee8f6b 100644
--- a/arm9/global.inc
+++ b/arm9/global.inc
@@ -93,7 +93,7 @@
.extern CPSi_sha1_init
.extern CPSi_sha1_result
.extern CPSi_sha1_result_prng
-.extern CP_RestoreContext
+.extern CPi_RestoreContext
.extern CP_SaveContext
.extern CTRDG_CpuCopy16
.extern CTRDG_CpuCopy32
diff --git a/arm9/lib/include/CP_context.h b/arm9/lib/include/CP_context.h
index d1e0062c..cfed9735 100644
--- a/arm9/lib/include/CP_context.h
+++ b/arm9/lib/include/CP_context.h
@@ -15,4 +15,7 @@ typedef struct CPContext {
u16 sqrt_mode;
} CPContext;
+void CP_SaveContext(CPContext *context);
+void CPi_RestoreContext(const CPContext* context);
+
#endif //POKEDIAMOND_CP_CONTEXT_H
diff --git a/arm9/lib/include/OS_init.h b/arm9/lib/include/OS_init.h
index 40685513..88c696cd 100644
--- a/arm9/lib/include/OS_init.h
+++ b/arm9/lib/include/OS_init.h
@@ -22,6 +22,7 @@
#include "OS_alloc.h"
#include "OS_system.h"
#include "OS_terminate_proc.h"
+#include "OS_irqHandler.h"
#include "OS_interrupt.h"
#include "OS_reset.h"
#include "OS_spinLock.h"
diff --git a/arm9/lib/include/OS_irqHandler.h b/arm9/lib/include/OS_irqHandler.h
new file mode 100644
index 00000000..f052016d
--- /dev/null
+++ b/arm9/lib/include/OS_irqHandler.h
@@ -0,0 +1,21 @@
+#ifndef POKEDIAMOND_OS_IRQHANDLER_H
+#define POKEDIAMOND_OS_IRQHANDLER_H
+
+#include "consts.h"
+#include "OS_interrupt.h"
+
+static inline void OS_ClearIrqCheckFlag(OSIrqMask intr)
+{
+ *(vu32 *)HW_INTR_CHECK_BUF &= (u32)~intr;
+}
+
+static inline OSIrqMask OS_GetIrqCheckFlag(void)
+{
+ return *(OSIrqMask *)HW_INTR_CHECK_BUF;
+}
+
+void OS_IrqHandler(void);
+void OS_IrqHandler_ThreadSwitch(void);
+void OS_WaitIrq(BOOL param1, u32 param2);
+
+#endif //POKEDIAMOND_OS_IRQHANDLER_H
diff --git a/arm9/lib/include/OS_system.h b/arm9/lib/include/OS_system.h
index f71c6f98..6e156f9d 100644
--- a/arm9/lib/include/OS_system.h
+++ b/arm9/lib/include/OS_system.h
@@ -35,6 +35,5 @@ OSIntrMode OS_GetCpsrIrq(void);
OSProcMode OS_GetProcMode(void);
void OS_SpinWait(void);
void OS_WaitVBlankIntr(void);
-void OS_WaitIrq(BOOL, u32);
#endif //POKEDIAMOND_OS_SYSTEM_H
diff --git a/arm9/lib/include/OS_thread.h b/arm9/lib/include/OS_thread.h
index adcadf2e..bbdb33c9 100644
--- a/arm9/lib/include/OS_thread.h
+++ b/arm9/lib/include/OS_thread.h
@@ -87,6 +87,8 @@ struct _OSThread
u32 systemErrno;
};
+extern OSThreadInfo OSi_ThreadInfo;
+
void OS_SleepThread(OSThreadQueue * queue);
void OS_WakeupThread(OSThreadQueue * queue);
diff --git a/arm9/lib/include/mmap.h b/arm9/lib/include/mmap.h
index 65b93e1e..8eb3f623 100644
--- a/arm9/lib/include/mmap.h
+++ b/arm9/lib/include/mmap.h
@@ -22,6 +22,9 @@ extern u32 SDK_AUTOLOAD_DTCM_START[];
#define HW_DTCM ((u32)SDK_AUTOLOAD_DTCM_START)
#define HW_DTCM_SIZE 0x00004000
+#define HW_DTCM_SYSRV (HW_DTCM + 0x00003fc0)
+#define HW_INTR_CHECK_BUF (HW_DTCM_SYSRV + 0x38)
+
#define HW_CARD_ROM_HEADER_SIZE 0x00000160
#define HW_DOWNLOAD_PARAMETER_SIZE 0x00000020
diff --git a/arm9/lib/src/OS_interrupt.c b/arm9/lib/src/OS_interrupt.c
index 4692fd54..c7c0704d 100644
--- a/arm9/lib/src/OS_interrupt.c
+++ b/arm9/lib/src/OS_interrupt.c
@@ -1,7 +1,3 @@
-//
-// Created by red031000 on 2020-05-07.
-//
-
#include "consts.h"
#include "function_target.h"
#include "OS_interrupt.h"
diff --git a/arm9/lib/src/OS_irqHandler.c b/arm9/lib/src/OS_irqHandler.c
new file mode 100644
index 00000000..b1211b98
--- /dev/null
+++ b/arm9/lib/src/OS_irqHandler.c
@@ -0,0 +1,145 @@
+#include "function_target.h"
+#include "OS_irqHandler.h"
+#include "OS_system.h"
+#include "OS_thread.h"
+#include "sections.h"
+#include "CP_context.h"
+
+#pragma section DTCM begin
+OSThreadQueue OSi_IrqThreadQueue = { NULL, NULL };
+#pragma section DTCM end
+
+#pragma section ITCM begin
+ARM_FUNC asm void OS_IrqHandler(void)
+{
+ stmfd sp!, {lr}
+ mov ip, #0x04000000
+ add ip, ip, #0x210
+ ldr r1, [ip, #-8]
+ cmp r1, #0
+ ldmeqfd sp!, {pc}
+ ldmia ip, {r1, r2}
+ ands r1, r1, r2
+ ldmeqfd sp!, {pc}
+ mov r3, #0x80000000
+_01FF8028:
+ clz r0, r1
+ bics r1, r1, r3, lsr r0
+ bne _01FF8028
+ mov r1, r3, lsr r0
+ str r1, [ip, #0x4]
+ rsbs r0, r0, #0x1f
+ ldr r1, =OS_IRQTable
+ ldr r0, [r1, r0, lsl #2]
+ ldr lr, =OS_IrqHandler_ThreadSwitch
+ bx r0
+}
+
+ARM_FUNC asm void OS_IrqHandler_ThreadSwitch(void)
+{
+ ldr ip, =OSi_IrqThreadQueue
+ mov r3, #0x0
+ ldr ip, [ip]
+ mov r2, #0x1
+ cmp ip, #0x0
+ beq _01FF80A8
+_01FF8070:
+ str r2, [ip, #0x64]
+ str r3, [ip, #0x78]
+ str r3, [ip, #0x7c]
+ ldr r0, [ip, #0x80]
+ str r3, [ip, #0x80]
+ mov ip, r0
+ cmp ip, #0x0
+bne _01FF8070
+ ldr ip, =OSi_IrqThreadQueue
+ str r3, [ip]
+ str r3, [ip, #0x4]
+ ldr ip, =OSi_ThreadInfo
+ mov r1, #0x1
+ strh r1, [ip]
+_01FF80A8:
+ ldr ip, =OSi_ThreadInfo
+ ldrh r1, [ip]
+ cmp r1, #0x0
+ ldreq pc, [sp], #0x4
+ mov r1, #0x0
+ strh r1, [ip]
+ mov r3, #0xd2
+ msr CPSR_c, r3
+ add r2, ip, #0x8
+ ldr r1, [r2]
+_01FF80D0:
+ cmp r1, #0x0
+ ldrneh r0, [r1, #0x64]
+ cmpne r0, #0x1
+ ldrne r1, [r1, #0x68]
+ bne _01FF80D0
+ cmp r1, #0x0
+ bne _01FF80F8
+_01FF80EC:
+ mov r3, #0x92
+ msr CPSR_c, r3
+ ldr pc, [sp], #0x4
+_01FF80F8:
+ ldr r0, [ip, #0x4]
+ cmp r1, r0
+ beq _01FF80EC
+ ldr r3, [ip, #0xC]
+ cmp r3, #0x0
+ beq _01FF8120
+ stmdb sp!, {r0, r1, ip}
+ mov lr, pc
+ bx r3
+ ldmia sp!, {r0, r1, ip}
+_01FF8120:
+ str r1, [ip, #0x4]
+ mrs r2, SPSR
+ str r2, [r0, #0x0]!
+ stmdb sp!, {r0, r1}
+ add r0, r0, #0x0
+ add r0, r0, #0x48
+ ldr r1, =CP_SaveContext
+ blx r1
+ ldmia sp!, {r0, r1}
+ ldmib sp!, {r2, r3}
+ stmib r0!, {r2, r3}
+ ldmib sp!, {r2, r3, ip, lr}
+ stmib r0!, {r2-r14}^
+ stmib r0!, {lr}
+ mov r3, #0xd3
+ msr CPSR_c, r3
+ stmib r0!, {sp}
+ stmfd sp!, {r1}
+ add r0, r1, #0x0
+ add r0, r0, #0x48
+ ldr r1, =CPi_RestoreContext
+ blx r1
+ ldmfd sp!, {r1}
+ ldr sp, [r1, #0x44]
+ mov r3, #0xd2
+ msr CPSR_c, r3
+ ldr r2, [r1, #0x0]!
+ msr SPSR_fc, r2
+ ldr lr, [r1, #0x40]
+ ldmib r1!, {r0-r14}^
+ nop
+ stmda sp!, {r0, r1, r2, r3, ip, lr}
+ ldmfd sp!, {pc}
+}
+#pragma section ITCM end
+
+ARM_FUNC void OS_WaitIrq(BOOL clear, OSIrqMask irqFlags)
+{
+ OSIntrMode lastIntrMode = OS_DisableInterrupts();
+ if (clear)
+ {
+ OS_ClearIrqCheckFlag(irqFlags);
+ }
+ (void)OS_RestoreInterrupts(lastIntrMode);
+
+ while (!(OS_GetIrqCheckFlag() & irqFlags))
+ {
+ OS_SleepThread(&OSi_IrqThreadQueue);
+ }
+}
diff --git a/arm9/lib/src/OS_system.c b/arm9/lib/src/OS_system.c
index 1d257679..b703fc38 100644
--- a/arm9/lib/src/OS_system.c
+++ b/arm9/lib/src/OS_system.c
@@ -3,6 +3,7 @@
//
#include "OS_system.h"
+#include "OS_irqHandler.h"
#include "syscall.h"
ARM_FUNC asm OSIntrMode OS_EnableInterrupts(void) {
diff --git a/arm9/src/main.c b/arm9/src/main.c
index a038cd9a..ae3961cd 100644
--- a/arm9/src/main.c
+++ b/arm9/src/main.c
@@ -1,6 +1,5 @@
#include "global.h"
#include "SPI_pm.h"
-#include "OS_system.h"
#include "CARD_backup.h"
#include "CARD_pullOut.h"
#include "CTRDG_common.h"