From 14323b4d8d1a7ea05ddf92e9c138296d11acd903 Mon Sep 17 00:00:00 2001 From: d0k3 Date: Mon, 5 Feb 2018 01:19:50 +0100 Subject: [PATCH] Fix: FIRM from FCRAM handling --- arm9/source/godmode.c | 9 +++++---- arm9/source/system/memmap.h | 30 +++++++++++++++++++++++------- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/arm9/source/godmode.c b/arm9/source/godmode.c index 5073d2c..b4da5f5 100644 --- a/arm9/source/godmode.c +++ b/arm9/source/godmode.c @@ -1,4 +1,5 @@ #include "godmode.h" +#include "memmap.h" #include "support.h" #include "ui.h" #include "hid.h" @@ -1867,17 +1868,17 @@ u32 GodMode(int entrypoint) { bool bootloader = IS_SIGHAX && (entrypoint == ENTRY_NANDBOOT); bool bootmenu = bootloader && (BOOTMENU_KEY != BUTTON_START) && CheckButton(BOOTMENU_KEY); bool godmode9 = !bootloader; - /*FirmHeader* firm_in_mem = (FirmHeader*) (void*) (TEMP_BUFFER + TEMP_BUFFER_SIZE); // should be safe here + FirmHeader* firm_in_mem = (FirmHeader*) __FIRMTMP_ADDR; // should be safe here memcpy(firm_in_mem, "NOPE", 4); // to prevent bootloops if (bootloader) { // check for FIRM in FCRAM, but prevent bootloops - for (u8* addr = (u8*) 0x20000200; addr < (u8*) 0x22000000; addr += 0x400000) { + for (u8* addr = (u8*) __FCRAM0_ADDR + 0x200; addr < (u8*) __HEAP_END; addr += 0x400000) { // don't search the stack if (memcmp(addr - 0x200, "A9NC", 4) != 0) continue; u32 firm_size = GetFirmSize((FirmHeader*) (void*) addr); if (!firm_size || (firm_size > (0x400000 - 0x200))) continue; if (memcmp(firm_in_mem, "FIRM", 4) != 0) memmove(firm_in_mem, addr, firm_size); if (memcmp(addr, "FIRM", 4) == 0) memcpy(addr, "NOPE", 4); // prevent bootloops } - }*/ + } // get mode string for splash screen const char* disp_mode = NULL; @@ -1977,7 +1978,7 @@ u32 GodMode(int entrypoint) { // bootloader handler if (bootloader) { const char* bootfirm_paths[] = { BOOTFIRM_PATHS }; - // if (IsBootableFirm(firm_in_mem, FIRM_MAX_SIZE)) BootFirm(firm_in_mem, "sdmc:/bootonce.firm"); + if (IsBootableFirm(firm_in_mem, FIRM_MAX_SIZE)) BootFirm(firm_in_mem, "sdmc:/bootonce.firm"); for (u32 i = 0; i < sizeof(bootfirm_paths) / sizeof(char*); i++) { BootFirmHandler(bootfirm_paths[i], false, (BOOTFIRM_TEMPS >> i) & 0x1); } diff --git a/arm9/source/system/memmap.h b/arm9/source/system/memmap.h index 77c0a26..1a715cc 100644 --- a/arm9/source/system/memmap.h +++ b/arm9/source/system/memmap.h @@ -1,12 +1,28 @@ # pragma once -// not complete! (!!!) -#define __RAMDRV_ADDR 0x22800000 -#define __RAMDRV_END 0x28000000 +// general memory areas -#define __STACK_ADDR (__RAMDRV_ADDR - 0x800000) -#define __STACK_END __RAMDRV_ADDR +#define __FCRAM0_ADDR 0x20000000 +#define __FCRAM0_END 0x28000000 -#define __HEAP_ADDR 0x20700000 -#define __HEAP_END __STACK_ADDR +#define __FCRAM1_ADDR 0x28000000 +#define __FCRAM1_END 0x30000000 + + +// stuff in FCRAM + +#define __FIRMTMP_ADDR (__FCRAM0_END - 0x0800000) +#define __FIRMTMP_END (__FIRMTMP_ADDR + 0x0400000) + +#define __RAMDRV_ADDR (__FCRAM0_ADDR + 0x2800000) +#define __RAMDRV_END __FCRAM0_END // can be bigger on N3DS + +#define __STACK_TOP __RAMDRV_ADDR +#define __STACK_SIZE 0x7F0000 + +#define __STACKABT_TOP (__STACK_TOP - __STACK_SIZE) +#define __STACKABT_SIZE 0x10000 + +#define __HEAP_ADDR (__FCRAM0_ADDR + 0x0700000) +#define __HEAP_END (__STACKABT_TOP - __STACKABT_SIZE)