|
|
|
|
@@ -53,8 +53,8 @@ gfx_ctxt_t gfx_ctxt;
|
|
|
|
|
gfx_con_t gfx_con;
|
|
|
|
|
|
|
|
|
|
//TODO: Create more macros (info, header, debug, etc) with different colors and utilize them for consistency.
|
|
|
|
|
#define EPRINTF(text) gfx_printf(&gfx_con, "%k"text"%k\n", 0xFF0000FF, 0xFFFFFFFF)
|
|
|
|
|
#define EPRINTFARGS(text, args...) gfx_printf(&gfx_con, "%k"text"%k\n", 0xFF0000FF, args, 0xFFFFFFFF)
|
|
|
|
|
#define EPRINTF(text) gfx_printf(&gfx_con, "%k"text"%k\n", 0xFF0000FF, 0xFFCCCCCC)
|
|
|
|
|
#define EPRINTFARGS(text, args...) gfx_printf(&gfx_con, "%k"text"%k\n", 0xFF0000FF, args, 0xFFCCCCCC)
|
|
|
|
|
|
|
|
|
|
//TODO: ugly.
|
|
|
|
|
sdmmc_t sd_sdmmc;
|
|
|
|
|
@@ -339,19 +339,16 @@ void print_fuseinfo()
|
|
|
|
|
gfx_clear(&gfx_ctxt, 0xFF1B1B1B);
|
|
|
|
|
gfx_con_setpos(&gfx_con, 0, 0);
|
|
|
|
|
|
|
|
|
|
gfx_printf(&gfx_con, "%k(Unlocked) fuse cache:\n\n%k", 0xFFFF9955, 0xFFFFFFFF);
|
|
|
|
|
gfx_printf(&gfx_con, "%k(Unlocked) fuse cache:\n\n%k", 0xFFFF9955, 0xFFCCCCCC);
|
|
|
|
|
gfx_hexdump(&gfx_con, 0x7000F900, (u8 *)0x7000F900, 0x2FC);
|
|
|
|
|
|
|
|
|
|
gfx_puts(&gfx_con, "\nPress POWER to dump them to SD Card.\nPress VOL to go to the menu.\n");
|
|
|
|
|
|
|
|
|
|
sleep(1000000);
|
|
|
|
|
|
|
|
|
|
u32 btn = btn_wait();
|
|
|
|
|
if (btn & BTN_POWER)
|
|
|
|
|
{
|
|
|
|
|
if (sd_mount())
|
|
|
|
|
{
|
|
|
|
|
FIL fuseFp;
|
|
|
|
|
char fuseFilename[9];
|
|
|
|
|
memcpy(fuseFilename, "fuse.bin", 8);
|
|
|
|
|
fuseFilename[8] = 0;
|
|
|
|
|
@@ -361,7 +358,7 @@ void print_fuseinfo()
|
|
|
|
|
else
|
|
|
|
|
gfx_puts(&gfx_con, "\nDone!\n");
|
|
|
|
|
}
|
|
|
|
|
sleep(2000000);
|
|
|
|
|
|
|
|
|
|
btn_wait();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@@ -371,7 +368,7 @@ void print_kfuseinfo()
|
|
|
|
|
gfx_clear(&gfx_ctxt, 0xFF1B1B1B);
|
|
|
|
|
gfx_con_setpos(&gfx_con, 0, 0);
|
|
|
|
|
|
|
|
|
|
gfx_printf(&gfx_con, "%kKFuse contents:\n\n%k", 0xFFFF9955, 0xFFFFFFFF);
|
|
|
|
|
gfx_printf(&gfx_con, "%kKFuse contents:\n\n%k", 0xFFFF9955, 0xFFCCCCCC);
|
|
|
|
|
u32 buf[KFUSE_NUM_WORDS];
|
|
|
|
|
if (!kfuse_read(buf))
|
|
|
|
|
EPRINTF("CRC fail.");
|
|
|
|
|
@@ -380,14 +377,11 @@ void print_kfuseinfo()
|
|
|
|
|
|
|
|
|
|
gfx_puts(&gfx_con, "\nPress POWER to dump them to SD Card.\nPress VOL to go to the menu.\n");
|
|
|
|
|
|
|
|
|
|
sleep(1000000);
|
|
|
|
|
|
|
|
|
|
u32 btn = btn_wait();
|
|
|
|
|
if (btn & BTN_POWER)
|
|
|
|
|
{
|
|
|
|
|
if (sd_mount())
|
|
|
|
|
{
|
|
|
|
|
FIL kfuseFp;
|
|
|
|
|
char kfuseFilename[10];
|
|
|
|
|
memcpy(kfuseFilename, "kfuse.bin", 9);
|
|
|
|
|
kfuseFilename[9] = 0;
|
|
|
|
|
@@ -397,7 +391,7 @@ void print_kfuseinfo()
|
|
|
|
|
else
|
|
|
|
|
gfx_puts(&gfx_con, "\nDone!\n");
|
|
|
|
|
}
|
|
|
|
|
sleep(2000000);
|
|
|
|
|
|
|
|
|
|
btn_wait();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@@ -422,7 +416,7 @@ void print_mmc_info()
|
|
|
|
|
u16 card_type;
|
|
|
|
|
u32 speed;
|
|
|
|
|
|
|
|
|
|
gfx_printf(&gfx_con, "%kCard IDentification:%k\n", 0xFFFFDD00, 0xFFFFFFFF);
|
|
|
|
|
gfx_printf(&gfx_con, "%kCard IDentification:%k\n", 0xFFFFDD00, 0xFFCCCCCC);
|
|
|
|
|
switch (storage.csd.mmca_vsn)
|
|
|
|
|
{
|
|
|
|
|
case 0: /* MMC v1.0 - v1.2 */
|
|
|
|
|
@@ -466,7 +460,7 @@ void print_mmc_info()
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
gfx_printf(&gfx_con, "%kExtended Card-Specific Data V1.%d:%k\n",
|
|
|
|
|
0xFFFFDD00, storage.ext_csd.ext_struct, 0xFFFFFFFF);
|
|
|
|
|
0xFFFFDD00, storage.ext_csd.ext_struct, 0xFFCCCCCC);
|
|
|
|
|
card_type = storage.ext_csd.card_type;
|
|
|
|
|
u8 card_type_support[96];
|
|
|
|
|
u8 pos_type = 0;
|
|
|
|
|
@@ -515,16 +509,16 @@ void print_mmc_info()
|
|
|
|
|
|
|
|
|
|
u32 boot_size = storage.ext_csd.boot_mult << 17;
|
|
|
|
|
u32 rpmb_size = storage.ext_csd.rpmb_mult << 17;
|
|
|
|
|
gfx_printf(&gfx_con, "%keMMC Partitions:%k\n", 0xFFFFDD00, 0xFFFFFFFF);
|
|
|
|
|
gfx_printf(&gfx_con, " 1: %kBOOT0 %kSize: %5d KiB (LBA Sectors: 0x%07X)\n", 0xFF00FF96, 0xFFFFFFFF,
|
|
|
|
|
gfx_printf(&gfx_con, "%keMMC Partitions:%k\n", 0xFFFFDD00, 0xFFCCCCCC);
|
|
|
|
|
gfx_printf(&gfx_con, " 1: %kBOOT0 %kSize: %5d KiB (LBA Sectors: 0x%07X)\n", 0xFF00FF96, 0xFFCCCCCC,
|
|
|
|
|
boot_size / 1024, boot_size / 1024 / 512);
|
|
|
|
|
gfx_printf(&gfx_con, " 2: %kBOOT1 %kSize: %5d KiB (LBA Sectors: 0x%07X)\n", 0xFF00FF96, 0xFFFFFFFF,
|
|
|
|
|
gfx_printf(&gfx_con, " 2: %kBOOT1 %kSize: %5d KiB (LBA Sectors: 0x%07X)\n", 0xFF00FF96, 0xFFCCCCCC,
|
|
|
|
|
boot_size / 1024, boot_size / 1024 / 512);
|
|
|
|
|
gfx_printf(&gfx_con, " 3: %kRPMB %kSize: %5d KiB (LBA Sectors: 0x%07X)\n", 0xFF00FF96, 0xFFFFFFFF,
|
|
|
|
|
gfx_printf(&gfx_con, " 3: %kRPMB %kSize: %5d KiB (LBA Sectors: 0x%07X)\n", 0xFF00FF96, 0xFFCCCCCC,
|
|
|
|
|
rpmb_size / 1024, rpmb_size / 1024 / 512);
|
|
|
|
|
gfx_printf(&gfx_con, " 0: %kGPP (USER) %kSize: %05d MiB (LBA Sectors: 0x%07X)\n\n", 0xFF00FF96, 0xFFFFFFFF,
|
|
|
|
|
gfx_printf(&gfx_con, " 0: %kGPP (USER) %kSize: %05d MiB (LBA Sectors: 0x%07X)\n\n", 0xFF00FF96, 0xFFCCCCCC,
|
|
|
|
|
storage.sec_cnt >> SECTORS_TO_MIB_COEFF, storage.sec_cnt);
|
|
|
|
|
gfx_printf(&gfx_con, "%kGPP (eMMC USER) partition table:%k\n", 0xFFFFDD00, 0xFFFFFFFF);
|
|
|
|
|
gfx_printf(&gfx_con, "%kGPP (eMMC USER) partition table:%k\n", 0xFFFFDD00, 0xFFCCCCCC);
|
|
|
|
|
|
|
|
|
|
sdmmc_storage_set_mmc_partition(&storage, 0);
|
|
|
|
|
LIST_INIT(gpt);
|
|
|
|
|
@@ -532,15 +526,15 @@ void print_mmc_info()
|
|
|
|
|
int gpp_idx = 0;
|
|
|
|
|
LIST_FOREACH_ENTRY(emmc_part_t, part, &gpt, link)
|
|
|
|
|
{
|
|
|
|
|
gfx_printf(&gfx_con, " %02d: %k%s%k\n Size: % 5d MiB (LBA Sectors 0x%07X, LBA Range: %08X-%08X)%k\n",
|
|
|
|
|
gpp_idx++, 0xFF14FDAE, part->name, 0xFFFFFFFF, (part->lba_end - part->lba_start + 1) >> SECTORS_TO_MIB_COEFF,
|
|
|
|
|
part->lba_end - part->lba_start + 1, part->lba_start, part->lba_end, 0xFFFFFFFF);
|
|
|
|
|
gfx_printf(&gfx_con, " %02d: %k%s%k\n Size: % 5d MiB (LBA Sectors 0x%07X, LBA Range: %08X-%08X)\n",
|
|
|
|
|
gpp_idx++, 0xFF14FDAE, part->name, 0xFFCCCCCC, (part->lba_end - part->lba_start + 1) >> SECTORS_TO_MIB_COEFF,
|
|
|
|
|
part->lba_end - part->lba_start + 1, part->lba_start, part->lba_end);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
out:
|
|
|
|
|
sdmmc_storage_end(&storage);
|
|
|
|
|
sleep(1000000);
|
|
|
|
|
|
|
|
|
|
btn_wait();
|
|
|
|
|
}
|
|
|
|
|
@@ -556,7 +550,7 @@ void print_sdcard_info()
|
|
|
|
|
{
|
|
|
|
|
u32 capacity;
|
|
|
|
|
|
|
|
|
|
gfx_printf(&gfx_con, "%kCard IDentification:%k\n", 0xFFFFDD00, 0xFFFFFFFF);
|
|
|
|
|
gfx_printf(&gfx_con, "%kCard IDentification:%k\n", 0xFFFFDD00, 0xFFCCCCCC);
|
|
|
|
|
gfx_printf(&gfx_con,
|
|
|
|
|
" Vendor ID: %02x\n\
|
|
|
|
|
OEM ID: %c%c\n\
|
|
|
|
|
@@ -571,7 +565,7 @@ void print_sdcard_info()
|
|
|
|
|
sd_storage.cid.hwrev, sd_storage.cid.fwrev, sd_storage.cid.serial,
|
|
|
|
|
sd_storage.cid.month, sd_storage.cid.year);
|
|
|
|
|
|
|
|
|
|
gfx_printf(&gfx_con, "%kCard-Specific Data V%d.0:%k\n", 0xFFFFDD00, sd_storage.csd.structure + 1, 0xFFFFFFFF);
|
|
|
|
|
gfx_printf(&gfx_con, "%kCard-Specific Data V%d.0:%k\n", 0xFFFFDD00, sd_storage.csd.structure + 1, 0xFFCCCCCC);
|
|
|
|
|
capacity = sd_storage.csd.capacity >> (20 - sd_storage.csd.read_blkbits);
|
|
|
|
|
gfx_printf(&gfx_con,
|
|
|
|
|
" Cmd Classes: %02X\n\
|
|
|
|
|
@@ -588,13 +582,11 @@ void print_sdcard_info()
|
|
|
|
|
|
|
|
|
|
gfx_puts(&gfx_con, "Acquiring FAT volume info...\n\n");
|
|
|
|
|
f_getfree("", &sd_fs.free_clst, NULL);
|
|
|
|
|
gfx_printf(&gfx_con, "%kFound %s volume:%k\n Free: %d MiB\n Cluster: %d B\n",
|
|
|
|
|
0xFFFFDD00, sd_fs.fs_type == FS_EXFAT ? "exFAT" : "FAT32", 0xFFFFFFFF,
|
|
|
|
|
sd_fs.free_clst * sd_fs.csize >> SECTORS_TO_MIB_COEFF, sd_fs.csize * 512);
|
|
|
|
|
gfx_printf(&gfx_con, "%kFound %s volume:%k\n Free: %d MiB\n Cluster: %d KiB\n",
|
|
|
|
|
0xFFFFDD00, sd_fs.fs_type == FS_EXFAT ? "exFAT" : "FAT32", 0xFFCCCCCC,
|
|
|
|
|
sd_fs.free_clst * sd_fs.csize >> SECTORS_TO_MIB_COEFF, (sd_fs.csize > 1) ? (sd_fs.csize >> 1) : 512);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sleep(1000000);
|
|
|
|
|
|
|
|
|
|
btn_wait();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -625,7 +617,7 @@ void print_tsec_key()
|
|
|
|
|
u8 key[0x10];
|
|
|
|
|
int res = tsec_query(key, i, pkg1 + pkg1_id->tsec_off);
|
|
|
|
|
|
|
|
|
|
gfx_printf(&gfx_con, "%kTSEC key %d: %k", 0xFFFF9955, i, 0xFFFFFFFF);
|
|
|
|
|
gfx_printf(&gfx_con, "%kTSEC key %d: %k", 0xFFFF9955, i, 0xFFCCCCCC);
|
|
|
|
|
if (res >= 0)
|
|
|
|
|
{
|
|
|
|
|
for (u32 i = 0; i < 0x10; i++)
|
|
|
|
|
@@ -639,7 +631,8 @@ void print_tsec_key()
|
|
|
|
|
out:;
|
|
|
|
|
free(pkg1);
|
|
|
|
|
sdmmc_storage_end(&storage);
|
|
|
|
|
sleep(1000000);
|
|
|
|
|
|
|
|
|
|
gfx_puts(&gfx_con, "\nPress any key...\n");
|
|
|
|
|
btn_wait();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -701,7 +694,7 @@ int dump_emmc_part(char *sd_path, sdmmc_storage_t *storage, emmc_part_t *part)
|
|
|
|
|
{
|
|
|
|
|
isSmallSdCard = 1;
|
|
|
|
|
|
|
|
|
|
gfx_printf(&gfx_con, "%k\nSD card free space is smaller than dump total size.%k\n", 0xFF00BAFF, 0xFFFFFFFF);
|
|
|
|
|
gfx_printf(&gfx_con, "%k\nSD card free space is smaller than dump total size.%k\n", 0xFF00BAFF, 0xFFCCCCCC);
|
|
|
|
|
|
|
|
|
|
if (!maxSplitParts)
|
|
|
|
|
{
|
|
|
|
|
@@ -713,7 +706,7 @@ int dump_emmc_part(char *sd_path, sdmmc_storage_t *storage, emmc_part_t *part)
|
|
|
|
|
// Check if we continuing a previous raw eMMC dump in progress.
|
|
|
|
|
if (f_open(&partialIdxFp, partialIdxFilename, FA_READ) == FR_OK)
|
|
|
|
|
{
|
|
|
|
|
gfx_printf(&gfx_con, "%kFound partial dump in progress. Continuing...%k\n\n", 0xFF14FDAE, 0xFFFFFFFF);
|
|
|
|
|
gfx_printf(&gfx_con, "%kFound partial dump in progress. Continuing...%k\n\n", 0xFF14FDAE, 0xFFCCCCCC);
|
|
|
|
|
|
|
|
|
|
partialDumpInProgress = 1;
|
|
|
|
|
// Force partial dumping, even if the card is larger.
|
|
|
|
|
@@ -732,8 +725,8 @@ int dump_emmc_part(char *sd_path, sdmmc_storage_t *storage, emmc_part_t *part)
|
|
|
|
|
// Increase maxSplitParts to accommodate previously dumped parts
|
|
|
|
|
maxSplitParts += currPartIdx;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
gfx_printf(&gfx_con, "%kPartial dumping enabled (with %d MiB parts)...%k\n\n", 0xFF00BAFF, multipartSplitSize >> 20, 0xFFFFFFFF);
|
|
|
|
|
else if (isSmallSdCard)
|
|
|
|
|
gfx_printf(&gfx_con, "%kPartial dumping enabled (with %d MiB parts)...%k\n\n", 0xFF00BAFF, multipartSplitSize >> 20, 0xFFCCCCCC);
|
|
|
|
|
|
|
|
|
|
// Check if filesystem is FAT32 or the free space is smaller and dump in parts
|
|
|
|
|
if (((sd_fs.fs_type != FS_EXFAT) && totalSectors > (FAT32_FILESIZE_LIMIT / NX_EMMC_BLOCKSIZE)) | isSmallSdCard)
|
|
|
|
|
@@ -854,7 +847,7 @@ int dump_emmc_part(char *sd_path, sdmmc_storage_t *storage, emmc_part_t *part)
|
|
|
|
|
u32 num = MIN(totalSectors, NUM_SECTORS_PER_ITER);
|
|
|
|
|
while(!sdmmc_storage_read(storage, lba_curr, num, buf))
|
|
|
|
|
{
|
|
|
|
|
EPRINTFARGS("Error reading %d blocks @ LBA %08X from eMMC (try %d)",
|
|
|
|
|
EPRINTFARGS("Error reading %d blocks @ LBA %08X from eMMC (try %d), retrying...",
|
|
|
|
|
num, lba_curr, ++retryCount);
|
|
|
|
|
|
|
|
|
|
sleep(500000);
|
|
|
|
|
@@ -959,7 +952,7 @@ static void dump_emmc_selected(dumpType_t dumpType)
|
|
|
|
|
bootPart.name[5] = 0;
|
|
|
|
|
|
|
|
|
|
gfx_printf(&gfx_con, "%k%02d: %s (%08X-%08X)%k\n", 0xFFFFDD00, i,
|
|
|
|
|
bootPart.name, bootPart.lba_start, bootPart.lba_end, 0xFFFFFFFF);
|
|
|
|
|
bootPart.name, bootPart.lba_start, bootPart.lba_end, 0xFFCCCCCC);
|
|
|
|
|
|
|
|
|
|
sdmmc_storage_set_mmc_partition(&storage, i+1);
|
|
|
|
|
res = dump_emmc_part(bootPart.name, &storage, &bootPart);
|
|
|
|
|
@@ -982,7 +975,7 @@ static void dump_emmc_selected(dumpType_t dumpType)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
gfx_printf(&gfx_con, "%k%02d: %s (%08X-%08X)%k\n", 0xFFFFDD00, i++,
|
|
|
|
|
part->name, part->lba_start, part->lba_end, 0xFFFFFFFF);
|
|
|
|
|
part->name, part->lba_start, part->lba_end, 0xFFCCCCCC);
|
|
|
|
|
|
|
|
|
|
res = dump_emmc_part(part->name, &storage, part);
|
|
|
|
|
}
|
|
|
|
|
@@ -999,7 +992,7 @@ static void dump_emmc_selected(dumpType_t dumpType)
|
|
|
|
|
strcpy(rawPart.name, "rawnand.bin");
|
|
|
|
|
{
|
|
|
|
|
gfx_printf(&gfx_con, "%k%02d: %s (%08X-%08X)%k\n", 0xFFFFDD00, i++,
|
|
|
|
|
rawPart.name, rawPart.lba_start, rawPart.lba_end, 0xFFFFFFFF);
|
|
|
|
|
rawPart.name, rawPart.lba_start, rawPart.lba_end, 0xFFCCCCCC);
|
|
|
|
|
|
|
|
|
|
res = dump_emmc_part(rawPart.name, &storage, &rawPart);
|
|
|
|
|
}
|
|
|
|
|
@@ -1007,13 +1000,12 @@ static void dump_emmc_selected(dumpType_t dumpType)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gfx_putc(&gfx_con, '\n');
|
|
|
|
|
gfx_printf(&gfx_con, "%kTime taken: %d seconds.%k\n", 0xFF00FF96, (get_tmr() - timer) / 1000000, 0xFFFFFFFF);
|
|
|
|
|
gfx_printf(&gfx_con, "%kTime taken: %d seconds.%k\n", 0xFF00FF96, (get_tmr() - timer) / 1000000, 0xFFCCCCCC);
|
|
|
|
|
sdmmc_storage_end(&storage);
|
|
|
|
|
if (res)
|
|
|
|
|
gfx_puts(&gfx_con, "\nDone. Press any key.\n");
|
|
|
|
|
|
|
|
|
|
out:;
|
|
|
|
|
sleep(1000000);
|
|
|
|
|
btn_wait();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -1065,40 +1057,40 @@ void dump_package1()
|
|
|
|
|
pkg1_unpack(warmboot, secmon, pkg1_id, pkg1);
|
|
|
|
|
|
|
|
|
|
// display info
|
|
|
|
|
gfx_printf(&gfx_con, "%kSecure monitor addr: %08X\n", 0xFF00FFA8, pkg1_id->secmon_base);
|
|
|
|
|
gfx_printf(&gfx_con, "%kSecure monitor size: %08X\n", 0xFF00FFA8, hdr->sm_size);
|
|
|
|
|
gfx_printf(&gfx_con, "%kSecure monitor off: %08X\n", 0xFF00FFA8, hdr->sm_off);
|
|
|
|
|
gfx_printf(&gfx_con, "%kSecure monitor addr: %k%08X\n", 0xFF46EAC7, 0xFFCCCCCC, pkg1_id->secmon_base);
|
|
|
|
|
gfx_printf(&gfx_con, "%kSecure monitor size: %k%08X\n", 0xFF46EAC7, 0xFFCCCCCC, hdr->sm_size);
|
|
|
|
|
gfx_printf(&gfx_con, "%kSecure monitor ofst: %k%08X\n", 0xFF46EAC7, 0xFFCCCCCC, hdr->sm_off);
|
|
|
|
|
|
|
|
|
|
// dump package1
|
|
|
|
|
if (sd_save_to_file(pkg1, 0x40000, "pkg_decr.bin")) {
|
|
|
|
|
gfx_printf(&gfx_con, "Failed to create pkg_decr.bin\n");
|
|
|
|
|
EPRINTF("\nFailed to create pkg_decr.bin");
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
gfx_puts(&gfx_con, "%kpackage1 dumped to pkg_decr.bin\n");
|
|
|
|
|
gfx_puts(&gfx_con, "\npackage1 dumped to pkg_decr.bin\n");
|
|
|
|
|
|
|
|
|
|
// dump sm
|
|
|
|
|
if (sd_save_to_file(secmon, 0x40000, "sm.bin")) {
|
|
|
|
|
gfx_puts(&gfx_con, "Failed to create sm.bin\n");
|
|
|
|
|
EPRINTF("\nFailed to create sm.bin");
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
gfx_puts(&gfx_con, "Secure Monitor dumped to sm.bin\n");
|
|
|
|
|
|
|
|
|
|
// dump warmboot
|
|
|
|
|
if (sd_save_to_file(warmboot, 0x40000, "warmboot.bin")) {
|
|
|
|
|
gfx_puts(&gfx_con, "Failed to create warmboot.bin\n");
|
|
|
|
|
EPRINTF("\nFailed to create warmboot.bin");
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
gfx_puts(&gfx_con, "Warmboot dumped to warmboot.bin\n");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sdmmc_storage_end(&storage);
|
|
|
|
|
gfx_puts(&gfx_con, "Done. Press any key.\n");
|
|
|
|
|
gfx_puts(&gfx_con, "\nDone. Press any key.\n");
|
|
|
|
|
|
|
|
|
|
out:;
|
|
|
|
|
free(pkg1);
|
|
|
|
|
free(secmon);
|
|
|
|
|
free(warmboot);
|
|
|
|
|
sleep(1000000);
|
|
|
|
|
|
|
|
|
|
btn_wait();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -1143,11 +1135,14 @@ void launch_firmware()
|
|
|
|
|
free(ments);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
EPRINTF("Failed to load 'hekate_ipl.ini'.");
|
|
|
|
|
EPRINTF("Could not find or open 'hekate_ipl.ini' from SD Card!\nMake sure it exists.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!cfg_sec)
|
|
|
|
|
gfx_printf(&gfx_con, "Using default launch configuration.\n");
|
|
|
|
|
{
|
|
|
|
|
sleep(3000000);
|
|
|
|
|
gfx_printf(&gfx_con, "Using default launch configuration...\n");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!hos_launch(cfg_sec))
|
|
|
|
|
EPRINTF("Failed to launch firmware.");
|
|
|
|
|
@@ -1155,7 +1150,36 @@ void launch_firmware()
|
|
|
|
|
//TODO: free ini.
|
|
|
|
|
|
|
|
|
|
out:;
|
|
|
|
|
sleep(200000);
|
|
|
|
|
btn_wait();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void toggle_autorcm(){
|
|
|
|
|
sdmmc_storage_t storage;
|
|
|
|
|
sdmmc_t sdmmc;
|
|
|
|
|
if(!sdmmc_storage_init_mmc(&storage, &sdmmc, SDMMC_4, SDMMC_BUS_WIDTH_8, 4))
|
|
|
|
|
{
|
|
|
|
|
EPRINTF("Failed to init eMMC.");
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
u8 *tempbuf = (u8 *)malloc(0x200);
|
|
|
|
|
sdmmc_storage_set_mmc_partition(&storage, 1);
|
|
|
|
|
|
|
|
|
|
int i, sect = 0;
|
|
|
|
|
for (i = 0; i < 4; i++)
|
|
|
|
|
{
|
|
|
|
|
sect = (0x200 + (0x4000 * i)) / NX_EMMC_BLOCKSIZE;
|
|
|
|
|
sdmmc_storage_read(&storage, sect, 1, tempbuf);
|
|
|
|
|
tempbuf[0x10] ^= 0x77; //xor by arbitrary number to corrupt
|
|
|
|
|
sdmmc_storage_write(&storage, sect, 1, tempbuf);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
free(tempbuf);
|
|
|
|
|
sdmmc_storage_end(&storage);
|
|
|
|
|
|
|
|
|
|
gfx_printf(&gfx_con, "%kAutoRCM mode toggled!%k\n", 0xFF00EE2C, 0xFFCCCCCC);
|
|
|
|
|
|
|
|
|
|
out:;
|
|
|
|
|
btn_wait();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -1190,18 +1214,21 @@ void about()
|
|
|
|
|
gfx_clear(&gfx_ctxt, 0xFF1B1B1B);
|
|
|
|
|
gfx_con_setpos(&gfx_con, 0, 0);
|
|
|
|
|
|
|
|
|
|
gfx_printf(&gfx_con, octopus, 0xFFFFCC00, 0xFFFFFFFF,
|
|
|
|
|
0xFFFFCC00, 0xFFCCFF00, 0xFFFFCC00, 0xFFFFFFFF);
|
|
|
|
|
gfx_printf(&gfx_con, octopus, 0xFFFFCC00, 0xFFCCCCCC,
|
|
|
|
|
0xFFFFCC00, 0xFFCCFF00, 0xFFFFCC00, 0xFFCCCCCC);
|
|
|
|
|
|
|
|
|
|
sleep(1000000);
|
|
|
|
|
btn_wait();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ment_t ment_cinfo[] = {
|
|
|
|
|
MDEF_BACK(),
|
|
|
|
|
MDEF_CHGLINE(),
|
|
|
|
|
MDEF_CAPTION("---- SoC Info ----", 0xFFE6B90A),
|
|
|
|
|
MDEF_HANDLER("Print fuse info", print_fuseinfo),
|
|
|
|
|
MDEF_HANDLER("Print kfuse info", print_kfuseinfo),
|
|
|
|
|
MDEF_HANDLER("Print TSEC keys", print_tsec_key),
|
|
|
|
|
MDEF_CHGLINE(),
|
|
|
|
|
MDEF_CAPTION("-- Storage Info --", 0xFFE6B90A),
|
|
|
|
|
MDEF_HANDLER("Print eMMC info", print_mmc_info),
|
|
|
|
|
MDEF_HANDLER("Print SD Card info", print_sdcard_info),
|
|
|
|
|
MDEF_END()
|
|
|
|
|
@@ -1211,15 +1238,44 @@ menu_t menu_cinfo = {
|
|
|
|
|
"Console info", 0, 0
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
ment_t ment_tools[] = {
|
|
|
|
|
ment_t ment_autorcm[] = {
|
|
|
|
|
MDEF_CAPTION("WARNING: This corrupts your BOOT0 partition!", 0xFF00FFE6),
|
|
|
|
|
MDEF_BACK(),
|
|
|
|
|
MDEF_BACK(),
|
|
|
|
|
MDEF_BACK(),
|
|
|
|
|
MDEF_BACK(),
|
|
|
|
|
MDEF_HANDLER("Toggle AutoRCM", toggle_autorcm),
|
|
|
|
|
MDEF_BACK(),
|
|
|
|
|
MDEF_BACK(),
|
|
|
|
|
MDEF_BACK(),
|
|
|
|
|
MDEF_BACK(),
|
|
|
|
|
MDEF_HANDLER("Dump RAW eMMC", dump_emmc_rawnand),
|
|
|
|
|
MDEF_HANDLER("Dump eMMC SYS", dump_emmc_system),
|
|
|
|
|
MDEF_HANDLER("Dump eMMC USER", dump_emmc_user),
|
|
|
|
|
MDEF_HANDLER("Dump eMMC BOOT", dump_emmc_boot),
|
|
|
|
|
MDEF_HANDLER("Dump package1", dump_package1),
|
|
|
|
|
MDEF_END()
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
menu_t menu_autorcm = {
|
|
|
|
|
ment_autorcm,
|
|
|
|
|
"AutoRCM", 0, 0
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
ment_t ment_tools[] = {
|
|
|
|
|
MDEF_BACK(),
|
|
|
|
|
MDEF_CHGLINE(),
|
|
|
|
|
MDEF_CAPTION("------ Full --------", 0xFFE6B90A),
|
|
|
|
|
MDEF_HANDLER("Dump RAW eMMC", dump_emmc_rawnand),
|
|
|
|
|
MDEF_HANDLER("Dump eMMC BOOT", dump_emmc_boot),
|
|
|
|
|
MDEF_CHGLINE(),
|
|
|
|
|
MDEF_CAPTION("-- GP Partitions --", 0xFFE6B90A),
|
|
|
|
|
MDEF_HANDLER("Dump eMMC SYS", dump_emmc_system),
|
|
|
|
|
MDEF_HANDLER("Dump eMMC USER", dump_emmc_user),
|
|
|
|
|
MDEF_CHGLINE(),
|
|
|
|
|
MDEF_CAPTION("------ Misc -------", 0xFFE6B90A),
|
|
|
|
|
MDEF_HANDLER("Dump package1", dump_package1),
|
|
|
|
|
MDEF_CHGLINE(),
|
|
|
|
|
MDEF_CAPTION("---- Dangerous ----", 0xFF0000FF),
|
|
|
|
|
MDEF_MENU("AutoRCM", &menu_autorcm),
|
|
|
|
|
MDEF_END()
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
menu_t menu_tools = {
|
|
|
|
|
ment_tools,
|
|
|
|
|
"Tools", 0, 0
|
|
|
|
|
@@ -1227,17 +1283,20 @@ menu_t menu_tools = {
|
|
|
|
|
|
|
|
|
|
ment_t ment_top[] = {
|
|
|
|
|
MDEF_HANDLER("Launch firmware", launch_firmware),
|
|
|
|
|
MDEF_CAPTION("---------------", 0xFF444444),
|
|
|
|
|
MDEF_MENU("Tools", &menu_tools),
|
|
|
|
|
MDEF_MENU("Console info", &menu_cinfo),
|
|
|
|
|
MDEF_HANDLER("Reboot (normal)", reboot_normal),
|
|
|
|
|
MDEF_HANDLER("Reboot (rcm)", reboot_rcm),
|
|
|
|
|
MDEF_CAPTION("---------------", 0xFF444444),
|
|
|
|
|
MDEF_HANDLER("Reboot (Normal)", reboot_normal),
|
|
|
|
|
MDEF_HANDLER("Reboot (RCM)", reboot_rcm),
|
|
|
|
|
MDEF_HANDLER("Power off", power_off),
|
|
|
|
|
MDEF_CAPTION("---------------", 0xFF444444),
|
|
|
|
|
MDEF_HANDLER("About", about),
|
|
|
|
|
MDEF_END()
|
|
|
|
|
};
|
|
|
|
|
menu_t menu_top = {
|
|
|
|
|
ment_top,
|
|
|
|
|
"hekate - ipl (CTCaer mod v1.5)", 0, 0
|
|
|
|
|
"hekate - ipl (CTCaer mod v1.6)", 0, 0
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
extern void pivot_stack(u32 stack_top);
|
|
|
|
|
|