diff --git a/include/arm9/main.h b/include/arm9/main.h index ef7eba8..721b7a8 100644 --- a/include/arm9/main.h +++ b/include/arm9/main.h @@ -30,4 +30,4 @@ void devs_close(); u8 rng_get_byte(); noreturn void power_off_safe(); -void reboot_safe(); +noreturn void reboot_safe(); diff --git a/source/arm11/power.c b/source/arm11/power.c index fbe6cf5..387ec81 100644 --- a/source/arm11/power.c +++ b/source/arm11/power.c @@ -1,7 +1,7 @@ #include "types.h" #include "util.h" #include "arm11/i2c.h" -#include "arm11/start.h" +#include "cache.h" #include "arm11/interrupt.h" @@ -31,7 +31,8 @@ i2cmcu_lcd_poweroff(); i2cmcu_lcd_backlight_poweroff(); - deinitCpu(); + flushDCache(); + __asm__ __volatile__("cpsid aif" : :); i2c_writeregdata(3, 0x20, 1u); @@ -43,7 +44,8 @@ i2cmcu_lcd_poweroff(); i2cmcu_lcd_backlight_poweroff(); - deinitCpu(); + flushDCache(); + __asm__ __volatile__("cpsid aif" : :); i2c_writeregdata(3, 0x20, 1u << 2); diff --git a/source/arm9/main.c b/source/arm9/main.c index 56d068d..bc4c40b 100644 --- a/source/arm9/main.c +++ b/source/arm9/main.c @@ -17,6 +17,7 @@ #include "arm9/menu.h" #include "arm9/main.h" #include "arm9/start.h" +#include "cache.h" static void initWifiFlash(void); static u32 mount_fs(void); @@ -278,7 +279,8 @@ fsUnmountAll(); devs_close(); - deinitCpu(); + flushDCache(); + __asm__ __volatile__("msr cpsr_c, #0xDF" : :); // System mode, interrupts disabled // tell the arm11 we're done PXI_sendWord(PXI_CMD_POWER_OFF); @@ -286,18 +288,18 @@ while(1) waitForInterrupt(); } -void reboot_safe() +noreturn void reboot_safe() { - wait(0x100000); - uiClearConsoles(); - uiPrintIfVerbose("Attempting to reboot...\n"); fsUnmountAll(); devs_close(); - + + flushDCache(); + __asm__ __volatile__("msr cpsr_c, #0xDF" : :); // System mode, interrupts disabled + PXI_sendWord(PXI_CMD_REBOOT); - for(;;); + while(1) waitForInterrupt(); }