diff options
-rw-r--r-- | arm9/arm9.lcf | 6 | ||||
-rw-r--r-- | arm9/asm/CP_context.s | 4 | ||||
-rw-r--r-- | arm9/asm/OS_context.s | 4 | ||||
-rw-r--r-- | arm9/asm/OS_irqHandler.s | 63 | ||||
-rw-r--r-- | arm9/asm/OS_irqTable.s | 12 | ||||
-rw-r--r-- | arm9/asm/arm9_itcm.s | 123 | ||||
-rw-r--r-- | arm9/global.inc | 2 | ||||
-rw-r--r-- | arm9/lib/include/CP_context.h | 3 | ||||
-rw-r--r-- | arm9/lib/include/OS_init.h | 1 | ||||
-rw-r--r-- | arm9/lib/include/OS_irqHandler.h | 21 | ||||
-rw-r--r-- | arm9/lib/include/OS_system.h | 1 | ||||
-rw-r--r-- | arm9/lib/include/OS_thread.h | 2 | ||||
-rw-r--r-- | arm9/lib/include/mmap.h | 3 | ||||
-rw-r--r-- | arm9/lib/src/OS_interrupt.c | 4 | ||||
-rw-r--r-- | arm9/lib/src/OS_irqHandler.c | 145 | ||||
-rw-r--r-- | arm9/lib/src/OS_system.c | 1 | ||||
-rw-r--r-- | arm9/src/main.c | 1 |
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" |