diff options
author | red031000 <rubenru09@aol.com> | 2020-05-16 20:15:41 +0100 |
---|---|---|
committer | red031000 <rubenru09@aol.com> | 2020-05-16 20:16:09 +0100 |
commit | 157c523cb52b6564612298ebe10c260fa0cbffc4 (patch) | |
tree | a88bbca940a0e185b5d0140bccce4258f79d871c /arm9/lib/src/OS_interrupt.c | |
parent | c19beb3d17121a509121949f5f0893971c61bb66 (diff) |
match OS_interrupt (finally)
Diffstat (limited to 'arm9/lib/src/OS_interrupt.c')
-rw-r--r-- | arm9/lib/src/OS_interrupt.c | 56 |
1 files changed, 55 insertions, 1 deletions
diff --git a/arm9/lib/src/OS_interrupt.c b/arm9/lib/src/OS_interrupt.c index 1fb43821..76deb069 100644 --- a/arm9/lib/src/OS_interrupt.c +++ b/arm9/lib/src/OS_interrupt.c @@ -10,7 +10,6 @@ #pragma optimize_for_size on extern OSThreadQueue OSi_IrqThreadQueue; -extern OSIrqMask OS_EnableIrqMask(OSIrqMask intr); ARM_FUNC void OS_InitIrqTable() { OS_InitThreadQueue(&OSi_IrqThreadQueue); @@ -87,3 +86,58 @@ ARM_FUNC void OSi_EnterTimerCallback(u32 timerNo, void (*callback) (void *), voi (void)OS_EnableIrqMask(mask); OSi_IrqCallbackInfo[timerNo + 4].enable = TRUE; } + +ARM_FUNC OSIrqMask OS_SetIrqMask(OSIrqMask mask) +{ + u16 regIme = reg_OS_IME; + reg_OS_IME = 0; + OSIrqMask regIe = reg_OS_IE; + reg_OS_IE = mask; + u16 unused = reg_OS_IME; //needed because otherwise it doesn't match + reg_OS_IME = regIme; + return regIe; +} + +ARM_FUNC OSIrqMask OS_EnableIrqMask(OSIrqMask mask) +{ + u16 regIme = reg_OS_IME; + reg_OS_IME = 0; + OSIrqMask regIe = reg_OS_IE; + reg_OS_IE = regIe | mask; + u16 unused = reg_OS_IME; + reg_OS_IME = regIme; + return regIe; +} + +ARM_FUNC OSIrqMask OS_DisableIrqMask(OSIrqMask mask) +{ + u16 regIme = reg_OS_IME; + reg_OS_IME = 0; + OSIrqMask regIe = reg_OS_IE; + reg_OS_IE = regIe & ~mask; + u16 unused = reg_OS_IME; + reg_OS_IME = regIme; + return regIe; +} + +ARM_FUNC OSIrqMask OS_ResetRequestIrqMask(OSIrqMask mask) +{ + u16 regIme = reg_OS_IME; + reg_OS_IME = 0; + OSIrqMask regIf = reg_OS_IF; + reg_OS_IF = mask; + u16 unused = reg_OS_IME; + reg_OS_IME = regIme; + return regIf; +} + +extern void SDK_IRQ_STACKSIZE(void); + +#define OSi_IRQ_STACK_TOP (HW_DTCM_SVC_STACK - ((s32)SDK_IRQ_STACKSIZE)) +#define OSi_IRQ_STACK_BOTTOM HW_DTCM_SVC_STACK + +ARM_FUNC void OS_SetIrqStackChecker(void) +{ + *(u32 *)(OSi_IRQ_STACK_BOTTOM - sizeof(u32)) = 0xfddb597dUL; + *(u32 *)(OSi_IRQ_STACK_TOP) = 0x7bf9dd5bUL; +} |