diff --git a/source/arm9/cache.s b/source/arm9/cache.s index 753edb6..fbfe988 100644 --- a/source/arm9/cache.s +++ b/source/arm9/cache.s @@ -19,9 +19,9 @@ .section ".text" -#define ICACHE_SIZE 0x2000 -#define DCACHE_SIZE 0x1000 -#define CACHE_LINE_SIZE 32 +#define ICACHE_SIZE (0x2000) +#define DCACHE_SIZE (0x1000) +#define CACHE_LINE_SIZE (32) @@ -33,7 +33,7 @@ invalidateICacheRange: add r1, r1, r0 - bic r0, r0, #CACHE_LINE_SIZE - 1 + bic r0, r0, #(CACHE_LINE_SIZE - 1) invalidateI: mcr p15, 0, r0, c7, c5, 1 add r0, r0, #CACHE_LINE_SIZE @@ -50,7 +50,7 @@ orr r2, r1, r0 @ Generate segment and line address mcr p15, 0, r2, c7, c14, 2 @ Clean and flush the line add r0, r0, #CACHE_LINE_SIZE - cmp r0, #DCACHE_SIZE/4 + cmp r0, #(DCACHE_SIZE / 4) bne inner_loop add r1, r1, #0x40000000 cmp r1, #0 @@ -81,11 +81,11 @@ invalidateDCacheRange: add r1, r1, r0 - tst r0, #CACHE_LINE_SIZE - 1 + tst r0, #(CACHE_LINE_SIZE - 1) mcrne p15, 0, r0, c7, c10, 1 @ Clean D entry - tst r1, #CACHE_LINE_SIZE - 1 + tst r1, #(CACHE_LINE_SIZE - 1) mcrne p15, 0, r1, c7, c10, 1 @ Clean D entry - bic r0, r0, #CACHE_LINE_SIZE - 1 + bic r0, r0, #(CACHE_LINE_SIZE - 1) invalidateD: mcr p15, 0, r0, c7, c6, 1 add r0, r0, #CACHE_LINE_SIZE diff --git a/source/arm9/crypto.c b/source/arm9/crypto.c index 353eccb..b04c3fd 100644 --- a/source/arm9/crypto.c +++ b/source/arm9/crypto.c @@ -149,9 +149,11 @@ // All writes must finish before using DMA flushDCacheRange(in, size); + // Save the original out pointer for later invalidation + const u32 *savedOut = out; u32 offset = 0; - u32 aesParams = AES_ENABLE | AES_IRQ_ENABLE | ctx->aesParams | AES_FLUSH_READ_FIFO | AES_FLUSH_WRITE_FIFO; + const u32 aesParams = AES_ENABLE | AES_IRQ_ENABLE | ctx->aesParams | AES_FLUSH_READ_FIFO | AES_FLUSH_WRITE_FIFO; while(offset < size) { u32 blockSize = ((size - offset > AES_MAX_BUF_SIZE) ? AES_MAX_BUF_SIZE : size - offset); @@ -219,11 +221,10 @@ } // Disable the NDMA channels - REG_NDMA0_CNT = 0; - REG_NDMA1_CNT = 0; + REG_NDMA0_CNT = REG_NDMA1_CNT = 0; // Throw possibly cached lines out of the window - invalidateDCacheRange(out, size); + invalidateDCacheRange(savedOut, size); } void AES_addCounter(AES_ctx *restrict ctx, u32 val) diff --git a/source/arm9/fatfs/diskio.c b/source/arm9/fatfs/diskio.c index 9b39004..8ce898d 100644 --- a/source/arm9/fatfs/diskio.c +++ b/source/arm9/fatfs/diskio.c @@ -44,18 +44,16 @@ switch(pdrv) { case FATFS_DEV_NUM_SD: - if(!dev_sdcard->init()) return STA_NOINIT | STA_NODISK; + if(!dev_sdcard->init()) return STA_NOINIT; break; case FATFS_DEV_NUM_TWL_NAND: - if(!dev_rawnand->init()) return STA_NOINIT | STA_NODISK; - if(!dev_decnand->init()) return STA_NOINIT | STA_NODISK; + if(!dev_decnand->init()) return STA_NOINIT; break; case FATFS_DEV_NUM_CTR_NAND: - if(!dev_rawnand->init()) return STA_NOINIT | STA_NODISK; - if(!dev_decnand->init()) return STA_NOINIT | STA_NODISK; + if(!dev_decnand->init()) return STA_NOINIT; break; default: - return STA_NOINIT; + return STA_NOINIT | STA_NODISK; } return 0; diff --git a/source/arm9/main.c b/source/arm9/main.c index 7e730d9..3122473 100644 --- a/source/arm9/main.c +++ b/source/arm9/main.c @@ -1,15 +1,13 @@ #include #include +#include #include "types.h" -#include "mem_map.h" -#include "io.h" -#include "util.h" -#include "arm9/dev.h" -#include "arm9/fatfs/diskio.h" -#include "arm9/firm.h" -#include "hid.h" #include "arm9/main.h" -#include "arm9/spiflash.h" +#include "util.h" +#include "io.h" +#include "arm9/fatfs/ff.h" +#include "arm9/dev.h" +#include "arm9/firm.h" // PrintConsole for each screen PrintConsole con_top, con_bottom; @@ -74,13 +72,15 @@ bool res; const char *res_str[2] = {"\x1B[31mFailed!", "\x1B[32mOK!"}; + printf(" Initializing raw NAND... "); + printf("%s\e[0m\n", res_str[dev_rawnand->init()]); printf(" Initializing Wifi flash... "); printf("%s\e[0m\n", res_str[(res = dev_flash->init())]); - + bootInfo.sd_status = dev_sdcard->is_active(); bootInfo.nand_status = dev_rawnand->is_active(); bootInfo.wififlash_status = dev_flash->is_active(); - + if(!res) sleep_wait(0x8000000); // mmc or wififlash init fail } @@ -154,8 +154,8 @@ static void fw_detect() { - u8 nand_sector[0x200]; - + u8 *nand_sector = (u8*)malloc(0x200); + if(!bootInfo.nand_status) printf("\x1B[31mFailed!\e[0m\n"); else @@ -165,6 +165,8 @@ strcpy(bootInfo.fw_ver1, "Unknown"); strcpy(bootInfo.fw_ver2, "Unknown"); } + + free(nand_sector); } u8 rng_get_byte()