From 07f5d61d46874a88796614d15517de3e3f1f0410 Mon Sep 17 00:00:00 2001 From: red031000 Date: Wed, 6 May 2020 16:46:28 +0100 Subject: match OS_reset.c --- arm9/lib/src/OS_reset.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 arm9/lib/src/OS_reset.c (limited to 'arm9/lib/src/OS_reset.c') diff --git a/arm9/lib/src/OS_reset.c b/arm9/lib/src/OS_reset.c new file mode 100644 index 00000000..9f492328 --- /dev/null +++ b/arm9/lib/src/OS_reset.c @@ -0,0 +1,63 @@ +// +// Created by red031000 on 2020-05-06. +// + +#include "function_target.h" +#include "OS_reset.h" +#include "MB_mb.h" + +extern u16 OSi_IsInitReset; +extern vu16 OSi_IsResetOccurred; +extern void PXI_Init(); +extern u32 PXI_IsCallbackReady(u32 param1, u32 param2); +extern void PXI_SetFifoRecvCallback(u32 param1, void* callback); +extern void OS_Terminate(); +extern u32 PXI_SendWordByFifo(u32 param1, u32 data, u32 param2); +extern void CARD_LockRom(u16 lockId); +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(); + +ARM_FUNC void OS_InitReset() { + if (OSi_IsInitReset) { + return; + } + OSi_IsInitReset = TRUE; + PXI_Init(); + while (!PXI_IsCallbackReady(PXI_FIFO_TAG_OS, PXI_PROC_ARM7)) { } + + PXI_SetFifoRecvCallback(PXI_FIFO_TAG_OS, OSi_CommonCallback); +} + +ARM_FUNC static void OSi_CommonCallback(PXIFifoTag tag, u32 data, BOOL err) { +#pragma unused(tag, err) //needed because otherwise -W all errors + u16 command = (u16)((data & OS_PXI_COMMAND_MASK) >> OS_PXI_COMMAND_SHIFT); + if (command == OS_PXI_COMMAND_RESET) + { + OSi_IsResetOccurred = TRUE; + return; + } + OS_Terminate(); +} + +ARM_FUNC static void OSi_SendToPxi(u16 data) { + while (PXI_SendWordByFifo(PXI_FIFO_TAG_OS, (u32)data << 0x8, FALSE)) {} +} + +ARM_FUNC void OS_ResetSystem(u32 parameter) { + if (MB_IsMultiBootChild()) { + OS_Terminate(); + } + CARD_LockRom((u16)OS_GetLockID()); + MI_StopDma(0); + MI_StopDma(1); + MI_StopDma(2); + MI_StopDma(3); + OS_SetIrqMask(0x40000); + OS_ResetRequestIrqMask((u32)~0); + *(u32 *)HW_RESET_PARAMETER_BUF = parameter; + OSi_SendToPxi(OS_PXI_COMMAND_RESET); + OSi_DoResetSystem(); //oh boy this is in itcm, that's gonna be fun to deal with Kappa +} \ No newline at end of file -- cgit v1.2.3 From 41fb84123de93f49ea7da9b7c5d5d22cfd19878e Mon Sep 17 00:00:00 2001 From: red031000 Date: Wed, 6 May 2020 16:49:24 +0100 Subject: newline --- arm9/lib/src/OS_reset.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'arm9/lib/src/OS_reset.c') diff --git a/arm9/lib/src/OS_reset.c b/arm9/lib/src/OS_reset.c index 9f492328..b12703da 100644 --- a/arm9/lib/src/OS_reset.c +++ b/arm9/lib/src/OS_reset.c @@ -60,4 +60,4 @@ ARM_FUNC void OS_ResetSystem(u32 parameter) { *(u32 *)HW_RESET_PARAMETER_BUF = parameter; OSi_SendToPxi(OS_PXI_COMMAND_RESET); OSi_DoResetSystem(); //oh boy this is in itcm, that's gonna be fun to deal with Kappa -} \ No newline at end of file +} -- cgit v1.2.3 From c8255e7f323a58625992973f9777a9928947f310 Mon Sep 17 00:00:00 2001 From: red031000 Date: Thu, 7 May 2020 15:40:45 +0100 Subject: OS_terminate_proc --- arm9/lib/src/OS_reset.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'arm9/lib/src/OS_reset.c') diff --git a/arm9/lib/src/OS_reset.c b/arm9/lib/src/OS_reset.c index b12703da..bec2da22 100644 --- a/arm9/lib/src/OS_reset.c +++ b/arm9/lib/src/OS_reset.c @@ -5,13 +5,13 @@ #include "function_target.h" #include "OS_reset.h" #include "MB_mb.h" +#include "OS_terminate_proc.h" extern u16 OSi_IsInitReset; extern vu16 OSi_IsResetOccurred; extern void PXI_Init(); extern u32 PXI_IsCallbackReady(u32 param1, u32 param2); extern void PXI_SetFifoRecvCallback(u32 param1, void* callback); -extern void OS_Terminate(); extern u32 PXI_SendWordByFifo(u32 param1, u32 data, u32 param2); extern void CARD_LockRom(u16 lockId); extern u32 OS_GetLockID(); -- cgit v1.2.3 From be09adbcb7e47bbc0ccc3994fe405b72cf2a59c6 Mon Sep 17 00:00:00 2001 From: red031000 Date: Thu, 7 May 2020 19:16:27 +0100 Subject: partial OS_interrupt --- arm9/lib/src/OS_reset.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'arm9/lib/src/OS_reset.c') diff --git a/arm9/lib/src/OS_reset.c b/arm9/lib/src/OS_reset.c index bec2da22..28d815a9 100644 --- a/arm9/lib/src/OS_reset.c +++ b/arm9/lib/src/OS_reset.c @@ -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) { -- cgit v1.2.3