summaryrefslogtreecommitdiff
path: root/arm9/lib/src
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/lib/src')
-rw-r--r--arm9/lib/src/OS_init.c1
-rw-r--r--arm9/lib/src/OS_interrupt.c56
-rw-r--r--arm9/lib/src/OS_reset.c5
3 files changed, 57 insertions, 5 deletions
diff --git a/arm9/lib/src/OS_init.c b/arm9/lib/src/OS_init.c
index 7467c672..a1db8788 100644
--- a/arm9/lib/src/OS_init.c
+++ b/arm9/lib/src/OS_init.c
@@ -7,7 +7,6 @@
extern void PXI_Init();
extern void OS_InitLock();
-extern void OS_SetIrqStackChecker();
extern void OS_InitException();
extern void MI_Init();
extern void OS_InitVAlarm();
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;
+}
diff --git a/arm9/lib/src/OS_reset.c b/arm9/lib/src/OS_reset.c
index c21d20ab..d4254ce3 100644
--- a/arm9/lib/src/OS_reset.c
+++ b/arm9/lib/src/OS_reset.c
@@ -6,6 +6,7 @@
#include "OS_reset.h"
#include "MB_mb.h"
#include "OS_terminate_proc.h"
+#include "OS_interrupt.h"
extern u16 OSi_IsInitReset;
extern vu16 OSi_IsResetOccurred;
@@ -15,8 +16,6 @@ extern void PXI_SetFifoRecvCallback(u32 param1, void* callback);
extern u32 PXI_SendWordByFifo(u32 param1, u32 data, u32 param2);
extern void CARD_LockRom(u16 lockId);
extern void MI_StopDma(u32 dma);
-extern void OS_SetIrqMask(u32 mask);
-extern void OS_ResetRequestIrqMask(u32 mask);
extern void OSi_DoResetSystem(); //in itcm, should technically be in this file
ARM_FUNC void OS_InitReset() {
@@ -54,7 +53,7 @@ ARM_FUNC void OS_ResetSystem(u32 parameter) {
MI_StopDma(1);
MI_StopDma(2);
MI_StopDma(3);
- OS_SetIrqMask(0x40000);
+ (void)OS_SetIrqMask(0x40000);
OS_ResetRequestIrqMask((u32)~0);
*(u32 *)HW_RESET_PARAMETER_BUF = parameter;
OSi_SendToPxi(OS_PXI_COMMAND_RESET);