diff --git a/Makefile b/Makefile
index 2638986..a55e193 100755
--- a/Makefile
+++ b/Makefile
@@ -26,7 +26,7 @@ OBJS = $(addprefix $(BUILDDIR)/$(TARGET)/, \
start.o exception_handlers.o \
main.o heap.o \
gfx.o logos.o tui.o \
- fe_emmc_tools.o fe_info.o fe_tools.o \
+ fe_info.o fe_tools.o \
)
# Hardware.
diff --git a/bootloader/frontend/fe_emmc_tools.c b/bootloader/frontend/fe_emmc_tools.c
deleted file mode 100644
index ec72e7b..0000000
--- a/bootloader/frontend/fe_emmc_tools.c
+++ /dev/null
@@ -1,908 +0,0 @@
-/*
- * Copyright (c) 2018 naehrwert
- * Copyright (c) 2018 Rajko Stojadinovic
- * Copyright (c) 2018-2022 CTCaer
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-#include
-#include
-
-#include
-
-#include "fe_emmc_tools.h"
-#include "../config.h"
-#include "../gfx/tui.h"
-#include
-
-#define NUM_SECTORS_PER_ITER 8192 // 4MB Cache.
-#define OUT_FILENAME_SZ 128
-#define SHA256_SZ 0x20
-
-extern hekate_config h_cfg;
-
-extern void emmcsn_path_impl(char *path, char *sub_dir, char *filename, sdmmc_storage_t *storage);
-
-#pragma GCC push_options
-#pragma GCC optimize ("Os")
-
-static int _dump_emmc_verify(sdmmc_storage_t *storage, u32 lba_curr, char *outFilename, emmc_part_t *part)
-{
- FIL fp;
- u8 sparseShouldVerify = 4;
- u32 prevPct = 200;
- u32 sdFileSector = 0;
- int res = 0;
-
- u8 hashEm[SHA256_SZ];
- u8 hashSd[SHA256_SZ];
-
- if (f_open(&fp, outFilename, FA_READ) == FR_OK)
- {
- u32 totalSectorsVer = (u32)((u64)f_size(&fp) >> (u64)9);
-
- u8 *bufEm = (u8 *)EMMC_BUF_ALIGNED;
- u8 *bufSd = (u8 *)SDXC_BUF_ALIGNED;
-
- u32 pct = (u64)((u64)(lba_curr - part->lba_start) * 100u) / (u64)(part->lba_end - part->lba_start);
- tui_pbar(0, gfx_con.y, pct, TXT_CLR_GREENISH, 0xFF155500);
-
- u32 num = 0;
- while (totalSectorsVer > 0)
- {
- num = MIN(totalSectorsVer, NUM_SECTORS_PER_ITER);
-
- // Check every time or every 4.
- // Every 4 protects from fake sd, sector corruption and frequent I/O corruption.
- // Full provides all that, plus protection from extremely rare I/O corruption.
- if (!(sparseShouldVerify % 4))
- {
- if (!sdmmc_storage_read(storage, lba_curr, num, bufEm))
- {
- gfx_con.fntsz = 16;
- EPRINTFARGS("\nFailed to read %d blocks (@LBA %08X),\nfrom eMMC!\n\nVerification failed..\n",
- num, lba_curr);
-
- f_close(&fp);
- return 1;
- }
- f_lseek(&fp, (u64)sdFileSector << (u64)9);
- if (f_read(&fp, bufSd, num << 9, NULL))
- {
- gfx_con.fntsz = 16;
- EPRINTFARGS("\nFailed to read %d blocks (@LBA %08X),\nfrom sd card!\n\nVerification failed..\n", num, lba_curr);
-
- f_close(&fp);
- return 1;
- }
-
- se_calc_sha256_oneshot(hashEm, bufEm, num << 9);
- se_calc_sha256_oneshot(hashSd, bufSd, num << 9);
- res = memcmp(hashEm, hashSd, SE_SHA_256_SIZE / 2);
-
- if (res)
- {
- gfx_con.fntsz = 16;
- EPRINTFARGS("\nSD and eMMC data (@LBA %08X),\ndo not match!\n\nVerification failed..\n", lba_curr);
-
- f_close(&fp);
- return 1;
- }
- }
-
- pct = (u64)((u64)(lba_curr - part->lba_start) * 100u) / (u64)(part->lba_end - part->lba_start);
- if (pct != prevPct)
- {
- tui_pbar(0, gfx_con.y, pct, TXT_CLR_GREENISH, 0xFF155500);
- prevPct = pct;
- }
-
- lba_curr += num;
- totalSectorsVer -= num;
- sdFileSector += num;
- sparseShouldVerify++;
-
- if (btn_read_vol() == (BTN_VOL_UP | BTN_VOL_DOWN))
- {
- gfx_con.fntsz = 16;
- WPRINTF("\n\nVerification was cancelled!");
- gfx_con.fntsz = 8;
- msleep(1000);
-
- f_close(&fp);
-
- return 0;
- }
- }
- f_close(&fp);
-
- tui_pbar(0, gfx_con.y, pct, TXT_CLR_DEFAULT, TXT_CLR_GREY_M);
-
- return 0;
- }
- else
- {
- gfx_con.fntsz = 16;
- EPRINTF("\nFile not found or could not be loaded.\n\nVerification failed..\n");
- return 1;
- }
-}
-
-static void _update_filename(char *outFilename, u32 sdPathLen, u32 numSplitParts, u32 currPartIdx)
-{
- if (numSplitParts >= 10 && currPartIdx < 10)
- {
- outFilename[sdPathLen] = '0';
- itoa(currPartIdx, &outFilename[sdPathLen + 1], 10);
- }
- else
- itoa(currPartIdx, &outFilename[sdPathLen], 10);
-}
-
-static int _dump_emmc_part(char *sd_path, sdmmc_storage_t *storage, emmc_part_t *part)
-{
- static const u32 FAT32_FILESIZE_LIMIT = 0xFFFFFFFF;
- static const u32 SECTORS_TO_MIB_COEFF = 11;
-
- u32 multipartSplitSize = (1u << 31);
- u32 totalSectors = part->lba_end - part->lba_start + 1;
- u32 currPartIdx = 0;
- u32 numSplitParts = 0;
- u32 maxSplitParts = 0;
- bool isSmallSdCard = false;
- bool partialDumpInProgress = false;
- int res = 0;
- char *outFilename = sd_path;
- u32 sdPathLen = strlen(sd_path);
-
- FIL partialIdxFp;
- char partialIdxFilename[12];
- strcpy(partialIdxFilename, "partial.idx");
-
- gfx_con.fntsz = 8;
- gfx_printf("\nSD Card free space: %d MiB, Total backup size %d MiB\n\n",
- sd_fs.free_clst * sd_fs.csize >> SECTORS_TO_MIB_COEFF,
- totalSectors >> SECTORS_TO_MIB_COEFF);
-
- // 1GB parts for sd cards 8GB and less.
- if ((sd_storage.csd.capacity >> (20 - sd_storage.csd.read_blkbits)) <= 8192)
- multipartSplitSize = (1u << 30);
- // Maximum parts fitting the free space available.
- maxSplitParts = (sd_fs.free_clst * sd_fs.csize) / (multipartSplitSize / EMMC_BLOCKSIZE);
-
- // Check if the USER partition or the RAW eMMC fits the sd card free space.
- if (totalSectors > (sd_fs.free_clst * sd_fs.csize))
- {
- isSmallSdCard = true;
-
- gfx_printf("%k\nSD card free space is smaller than backup size.%k\n", TXT_CLR_ORANGE, TXT_CLR_DEFAULT);
-
- if (!maxSplitParts)
- {
- gfx_con.fntsz = 16;
- EPRINTF("Not enough free space for Partial Backup.");
-
- return 0;
- }
- }
- // Check if we are continuing a previous raw eMMC or USER partition backup in progress.
- if (f_open(&partialIdxFp, partialIdxFilename, FA_READ) == FR_OK && totalSectors > (FAT32_FILESIZE_LIMIT / EMMC_BLOCKSIZE))
- {
- gfx_printf("%kFound Partial Backup in progress. Continuing...%k\n\n", TXT_CLR_GREENISH, TXT_CLR_DEFAULT);
-
- partialDumpInProgress = true;
- // Force partial dumping, even if the card is larger.
- isSmallSdCard = true;
-
- f_read(&partialIdxFp, &currPartIdx, 4, NULL);
- f_close(&partialIdxFp);
-
- if (!maxSplitParts)
- {
- gfx_con.fntsz = 16;
- EPRINTF("Not enough free space for Partial Backup.");
-
- return 0;
- }
-
- // Increase maxSplitParts to accommodate previously backed up parts.
- maxSplitParts += currPartIdx;
- }
- else if (isSmallSdCard)
- gfx_printf("%kPartial Backup enabled (with %d MiB parts)...%k\n\n", TXT_CLR_ORANGE, multipartSplitSize >> 20, TXT_CLR_DEFAULT);
-
- // Check if filesystem is FAT32 or the free space is smaller and backup in parts.
- if (((sd_fs.fs_type != FS_EXFAT) && totalSectors > (FAT32_FILESIZE_LIMIT / EMMC_BLOCKSIZE)) || isSmallSdCard)
- {
- u32 multipartSplitSectors = multipartSplitSize / EMMC_BLOCKSIZE;
- numSplitParts = (totalSectors + multipartSplitSectors - 1) / multipartSplitSectors;
-
- outFilename[sdPathLen++] = '.';
-
- // Continue from where we left, if Partial Backup in progress.
- _update_filename(outFilename, sdPathLen, numSplitParts, partialDumpInProgress ? currPartIdx : 0);
- }
-
- FIL fp;
- gfx_con_getpos(&gfx_con.savedx, &gfx_con.savedy);
- if (!f_open(&fp, outFilename, FA_READ))
- {
- f_close(&fp);
- gfx_con.fntsz = 16;
-
- WPRINTF("An existing backup has been detected!");
- WPRINTF("Press POWER to Continue.\nPress VOL to go to the menu.\n");
- msleep(500);
-
- if (!(btn_wait() & BTN_POWER))
- return 0;
- gfx_con.fntsz = 8;
- gfx_clear_partial_grey(0x1B, gfx_con.savedy, 48);
- }
- gfx_con_setpos(gfx_con.savedx, gfx_con.savedy);
- gfx_printf("Filename: %s\n\n", outFilename);
- res = f_open(&fp, outFilename, FA_CREATE_ALWAYS | FA_WRITE);
- if (res)
- {
- gfx_con.fntsz = 16;
- EPRINTFARGS("Error (%d) creating file %s.\n", res, outFilename);
-
- return 0;
- }
-
- u8 *buf = (u8 *)MIXD_BUF_ALIGNED;
-
- u32 lba_curr = part->lba_start;
- u32 lbaStartPart = part->lba_start;
- u32 bytesWritten = 0;
- u32 prevPct = 200;
- int retryCount = 0;
-
- // Continue from where we left, if Partial Backup in progress.
- if (partialDumpInProgress)
- {
- lba_curr += currPartIdx * (multipartSplitSize / EMMC_BLOCKSIZE);
- totalSectors -= currPartIdx * (multipartSplitSize / EMMC_BLOCKSIZE);
- lbaStartPart = lba_curr; // Update the start LBA for verification.
- }
- u64 totalSize = (u64)((u64)totalSectors << 9);
- if (!isSmallSdCard && (sd_fs.fs_type == FS_EXFAT || totalSize <= FAT32_FILESIZE_LIMIT))
- f_lseek(&fp, totalSize);
- else
- f_lseek(&fp, MIN(totalSize, multipartSplitSize));
- f_lseek(&fp, 0);
-
- u32 num = 0;
- u32 pct = 0;
- while (totalSectors > 0)
- {
- if (numSplitParts != 0 && bytesWritten >= multipartSplitSize)
- {
- f_close(&fp);
- memset(&fp, 0, sizeof(fp));
- currPartIdx++;
-
- // Verify part.
- if (_dump_emmc_verify(storage, lbaStartPart, outFilename, part))
- {
- EPRINTF("\nPress any key and try again...\n");
-
- return 0;
- }
-
- _update_filename(outFilename, sdPathLen, numSplitParts, currPartIdx);
-
- // Always create partial.idx before next part, in case a fatal error occurs.
- if (isSmallSdCard)
- {
- // Create partial backup index file.
- if (f_open(&partialIdxFp, partialIdxFilename, FA_CREATE_ALWAYS | FA_WRITE) == FR_OK)
- {
- f_write(&partialIdxFp, &currPartIdx, 4, NULL);
- f_close(&partialIdxFp);
- }
- else
- {
- gfx_con.fntsz = 16;
- EPRINTF("\nError creating partial.idx file.\n");
-
- return 0;
- }
-
- // More parts to backup that do not currently fit the sd card free space or fatal error.
- if (currPartIdx >= maxSplitParts)
- {
- gfx_puts("\n\n1. Press any key to unmount SD Card.\n\
- 2. Remove SD Card and move files to free space.\n\
- Don\'t move the partial.idx file!\n\
- 3. Re-insert SD Card.\n\
- 4. Select the SAME option again to continue.\n");
- gfx_con.fntsz = 16;
-
- return 1;
- }
- }
-
- // Create next part.
- gfx_con_setpos(gfx_con.savedx, gfx_con.savedy);
- gfx_printf("Filename: %s\n\n", outFilename);
- lbaStartPart = lba_curr;
- res = f_open(&fp, outFilename, FA_CREATE_ALWAYS | FA_WRITE);
- if (res)
- {
- gfx_con.fntsz = 16;
- EPRINTFARGS("Error (%d) creating file %s.\n", res, outFilename);
-
- return 0;
- }
-
- bytesWritten = 0;
-
- totalSize = (u64)((u64)totalSectors << 9);
- f_lseek(&fp, MIN(totalSize, multipartSplitSize));
- f_lseek(&fp, 0);
- }
-
- retryCount = 0;
- num = MIN(totalSectors, NUM_SECTORS_PER_ITER);
- while (!sdmmc_storage_read(storage, lba_curr, num, buf))
- {
- EPRINTFARGS("Error reading %d blocks @ LBA %08X,\nfrom eMMC (try %d), retrying...",
- num, lba_curr, ++retryCount);
-
- msleep(150);
- if (retryCount >= 3)
- {
- gfx_con.fntsz = 16;
- EPRINTFARGS("\nFailed to read %d blocks @ LBA %08X\nfrom eMMC. Aborting..\n",
- num, lba_curr);
- EPRINTF("\nPress any key and try again...\n");
-
- f_close(&fp);
- f_unlink(outFilename);
-
- return 0;
- }
- }
- res = f_write(&fp, buf, EMMC_BLOCKSIZE * num, NULL);
- if (res)
- {
- gfx_con.fntsz = 16;
- EPRINTFARGS("\nFatal error (%d) when writing to SD Card", res);
- EPRINTF("\nPress any key and try again...\n");
-
- f_close(&fp);
- f_unlink(outFilename);
-
- return 0;
- }
- pct = (u64)((u64)(lba_curr - part->lba_start) * 100u) / (u64)(part->lba_end - part->lba_start);
- if (pct != prevPct)
- {
- tui_pbar(0, gfx_con.y, pct, TXT_CLR_DEFAULT, TXT_CLR_GREY_M);
- prevPct = pct;
- }
-
- lba_curr += num;
- totalSectors -= num;
- bytesWritten += num * EMMC_BLOCKSIZE;
-
- // Force a flush after a lot of data if not splitting.
- if (numSplitParts == 0 && bytesWritten >= multipartSplitSize)
- {
- f_sync(&fp);
- bytesWritten = 0;
- }
-
- // Check for cancellation combo.
- if (btn_read_vol() == (BTN_VOL_UP | BTN_VOL_DOWN))
- {
- gfx_con.fntsz = 16;
- WPRINTF("\n\nThe backup was cancelled!");
- EPRINTF("\nPress any key...\n");
- msleep(1500);
-
- f_close(&fp);
- f_unlink(outFilename);
-
- return 0;
- }
- }
- tui_pbar(0, gfx_con.y, 100, TXT_CLR_DEFAULT, TXT_CLR_GREY_M);
-
- // Backup operation ended successfully.
- f_close(&fp);
-
- // Verify last part or single file backup.
- if (_dump_emmc_verify(storage, lbaStartPart, outFilename, part))
- {
- EPRINTF("\nPress any key and try again...\n");
-
- return 0;
- }
- else
- tui_pbar(0, gfx_con.y, 100, TXT_CLR_GREENISH, 0xFF155500);
-
- gfx_con.fntsz = 16;
- // Remove partial backup index file if no fatal errors occurred.
- if (isSmallSdCard)
- {
- f_unlink(partialIdxFilename);
- gfx_printf("%k\n\nYou can now join the files\nand get the complete eMMC RAW GPP backup.", TXT_CLR_DEFAULT);
- }
- gfx_puts("\n\n");
-
- return 1;
-}
-
-typedef enum
-{
- PART_BOOT = BIT(0),
- PART_SYSTEM = BIT(1),
- PART_USER = BIT(2),
- PART_RAW = BIT(3),
- PART_GP_ALL = BIT(7)
-} emmcPartType_t;
-
-static void _dump_emmc_selected(emmcPartType_t dumpType)
-{
- int res = 0;
- u32 timer = 0;
- gfx_clear_partial_grey(0x1B, 0, 1256);
- tui_sbar(true);
- gfx_con_setpos(0, 0);
-
- if (!sd_mount())
- goto out;
-
- gfx_puts("Checking for available free space...\n\n");
- // Get SD Card free space for Partial Backup.
- f_getfree("", &sd_fs.free_clst, NULL);
-
- if (!emmc_initialize(false))
- {
- EPRINTF("Failed to init eMMC.");
- goto out;
- }
-
- int i = 0;
- char sdPath[OUT_FILENAME_SZ];
- // Create Restore folders, if they do not exist.
- emmcsn_path_impl(sdPath, "/restore", "", &emmc_storage);
- emmcsn_path_impl(sdPath, "/restore/partitions", "", &emmc_storage);
-
- timer = get_tmr_s();
- if (dumpType & PART_BOOT)
- {
- const u32 BOOT_PART_SIZE = emmc_storage.ext_csd.boot_mult << 17;
-
- emmc_part_t bootPart;
- memset(&bootPart, 0, sizeof(bootPart));
- bootPart.lba_start = 0;
- bootPart.lba_end = (BOOT_PART_SIZE / EMMC_BLOCKSIZE) - 1;
- for (i = 0; i < 2; i++)
- {
- strcpy(bootPart.name, "BOOT");
- bootPart.name[4] = (u8)('0' + i);
- bootPart.name[5] = 0;
-
- gfx_printf("%k%02d: %s (%07X-%07X)%k\n", TXT_CLR_CYAN_L, i,
- bootPart.name, bootPart.lba_start, bootPart.lba_end, TXT_CLR_DEFAULT);
-
- sdmmc_storage_set_mmc_partition(&emmc_storage, i + 1);
-
- emmcsn_path_impl(sdPath, "", bootPart.name, &emmc_storage);
- res = _dump_emmc_part(sdPath, &emmc_storage, &bootPart);
- }
- }
-
- if ((dumpType & PART_SYSTEM) || (dumpType & PART_USER) || (dumpType & PART_RAW))
- {
- sdmmc_storage_set_mmc_partition(&emmc_storage, EMMC_GPP);
-
- if ((dumpType & PART_SYSTEM) || (dumpType & PART_USER))
- {
- LIST_INIT(gpt);
- emmc_gpt_parse(&gpt);
- LIST_FOREACH_ENTRY(emmc_part_t, part, &gpt, link)
- {
- if ((dumpType & PART_USER) == 0 && !strcmp(part->name, "USER"))
- continue;
- if ((dumpType & PART_SYSTEM) == 0 && strcmp(part->name, "USER"))
- continue;
-
- gfx_printf("%k%02d: %s (%07X-%07X)%k\n", TXT_CLR_CYAN_L, i++,
- part->name, part->lba_start, part->lba_end, TXT_CLR_DEFAULT);
-
- emmcsn_path_impl(sdPath, "/partitions", part->name, &emmc_storage);
- res = _dump_emmc_part(sdPath, &emmc_storage, part);
- // If a part failed, don't continue.
- if (!res)
- break;
- }
- emmc_gpt_free(&gpt);
- }
-
- if (dumpType & PART_RAW)
- {
- // Get GP partition size dynamically.
- const u32 RAW_AREA_NUM_SECTORS = emmc_storage.sec_cnt;
-
- emmc_part_t rawPart;
- memset(&rawPart, 0, sizeof(rawPart));
- rawPart.lba_start = 0;
- rawPart.lba_end = RAW_AREA_NUM_SECTORS - 1;
- strcpy(rawPart.name, "rawnand.bin");
- {
- gfx_printf("%k%02d: %s (%07X-%07X)%k\n", TXT_CLR_CYAN_L, i++,
- rawPart.name, rawPart.lba_start, rawPart.lba_end, TXT_CLR_DEFAULT);
-
- emmcsn_path_impl(sdPath, "", rawPart.name, &emmc_storage);
- res = _dump_emmc_part(sdPath, &emmc_storage, &rawPart);
- }
- }
- }
-
- gfx_putc('\n');
- timer = get_tmr_s() - timer;
- gfx_printf("Time taken: %dm %ds.\n", timer / 60, timer % 60);
- emmc_end();
- if (res)
- gfx_printf("\n%kFinished and verified!%k\nPress any key...\n", TXT_CLR_GREENISH, TXT_CLR_DEFAULT);
-
-out:
- sd_end();
- btn_wait();
-}
-
-void dump_emmc_system() { _dump_emmc_selected(PART_SYSTEM); }
-void dump_emmc_user() { _dump_emmc_selected(PART_USER); }
-void dump_emmc_boot() { _dump_emmc_selected(PART_BOOT); }
-void dump_emmc_rawnand() { _dump_emmc_selected(PART_RAW); }
-
-static int _restore_emmc_part(char *sd_path, sdmmc_storage_t *storage, emmc_part_t *part, bool allow_multi_part)
-{
- static const u32 SECTORS_TO_MIB_COEFF = 11;
-
- u32 totalSectors = part->lba_end - part->lba_start + 1;
- u32 currPartIdx = 0;
- u32 numSplitParts = 0;
- u32 lbaStartPart = part->lba_start;
- int res = 0;
- char *outFilename = sd_path;
- u32 sdPathLen = strlen(sd_path);
- u64 fileSize = 0;
- u64 totalCheckFileSize = 0;
- gfx_con.fntsz = 8;
-
- FIL fp;
- FILINFO fno;
-
- gfx_con_getpos(&gfx_con.savedx, &gfx_con.savedy);
-
- bool use_multipart = false;
-
- if (allow_multi_part)
- {
- // Check to see if there is a combined file and if so then use that.
- if (f_stat(outFilename, &fno))
- {
- // If not, check if there are partial files and the total size matches.
- gfx_printf("No single file, checking for part files...\n");
-
- outFilename[sdPathLen++] = '.';
-
- // Stat total size of the part files.
- while ((u32)((u64)totalCheckFileSize >> (u64)9) != totalSectors)
- {
- _update_filename(outFilename, sdPathLen, 99, numSplitParts);
-
- gfx_con_setpos(gfx_con.savedx, gfx_con.savedy);
- gfx_printf("\nFilename: %s\n", outFilename);
-
- if (f_stat(outFilename, &fno))
- {
- WPRINTFARGS("Error (%d) file not found '%s'. Aborting...\n", res, outFilename);
- return 0;
- }
- else
- totalCheckFileSize += (u64)fno.fsize;
-
- numSplitParts++;
- }
-
- gfx_printf("\n%X sectors total.\n", (u32)((u64)totalCheckFileSize >> (u64)9));
-
- if ((u32)((u64)totalCheckFileSize >> (u64)9) != totalSectors)
- {
- gfx_con.fntsz = 16;
- EPRINTF("Size of SD Card split backups does not match,\neMMC's selected part size.\n");
-
- return 0;
- }
- else
- {
- use_multipart = true;
- _update_filename(outFilename, sdPathLen, numSplitParts, 0);
- }
- }
- }
-
- res = f_open(&fp, outFilename, FA_READ);
- gfx_con_setpos(gfx_con.savedx, gfx_con.savedy);
- gfx_printf("\nFilename: %s\n", outFilename);
- if (res)
- {
- if (res != FR_NO_FILE)
- EPRINTFARGS("Error (%d) while opening backup. Continuing...\n", res);
- else
- WPRINTFARGS("Error (%d) file not found. Continuing...\n", res);
- gfx_con.fntsz = 16;
-
- return 0;
- }
- else if (!use_multipart && (((u32)((u64)f_size(&fp) >> (u64)9)) != totalSectors)) // Check total restore size vs emmc size.
- {
- gfx_con.fntsz = 16;
- EPRINTF("Size of the SD Card backup does not match,\neMMC's selected part size.\n");
- f_close(&fp);
-
- return 0;
- }
- else
- {
- fileSize = (u64)f_size(&fp);
- gfx_printf("\nTotal restore size: %d MiB.\n\n",
- (u32)((use_multipart ? (u64)totalCheckFileSize : fileSize) >> (u64)9) >> SECTORS_TO_MIB_COEFF);
- }
-
- u8 *buf = (u8 *)MIXD_BUF_ALIGNED;
-
- u32 lba_curr = part->lba_start;
- u32 bytesWritten = 0;
- u32 prevPct = 200;
- int retryCount = 0;
-
- u32 num = 0;
- u32 pct = 0;
-
- gfx_con_getpos(&gfx_con.savedx, &gfx_con.savedy);
-
- while (totalSectors > 0)
- {
- // If we have more than one part, check the size for the split parts and make sure that the bytes written is not more than that.
- if (numSplitParts != 0 && bytesWritten >= fileSize)
- {
- // If we have more bytes written then close the file pointer and increase the part index we are using
- f_close(&fp);
- memset(&fp, 0, sizeof(fp));
- currPartIdx++;
-
- // Verify part.
- if (_dump_emmc_verify(storage, lbaStartPart, outFilename, part))
- {
- EPRINTF("\nPress any key and try again...\n");
-
- return 0;
- }
-
- _update_filename(outFilename, sdPathLen, numSplitParts, currPartIdx);
-
- // Read from next part.
- gfx_con_setpos(gfx_con.savedx, gfx_con.savedy);
- gfx_printf("Filename: %s\n\n", outFilename);
-
- lbaStartPart = lba_curr;
-
- // Try to open the next file part
- res = f_open(&fp, outFilename, FA_READ);
- if (res)
- {
- gfx_con.fntsz = 16;
- EPRINTFARGS("Error (%d) opening file %s.\n", res, outFilename);
-
- return 0;
- }
- fileSize = (u64)f_size(&fp);
- bytesWritten = 0;
- }
-
- retryCount = 0;
- num = MIN(totalSectors, NUM_SECTORS_PER_ITER);
-
- res = f_read(&fp, buf, EMMC_BLOCKSIZE * num, NULL);
- if (res)
- {
- gfx_con.fntsz = 16;
- EPRINTFARGS("\nFatal error (%d) when reading from SD Card", res);
- EPRINTF("\nThis device may be in an inoperative state!\n\nPress any key and try again now...\n");
-
- f_close(&fp);
- return 0;
- }
- while (!sdmmc_storage_write(storage, lba_curr, num, buf))
- {
- EPRINTFARGS("Error writing %d blocks @ LBA %08X\nto eMMC (try %d), retrying...",
- num, lba_curr, ++retryCount);
-
- msleep(150);
- if (retryCount >= 3)
- {
- gfx_con.fntsz = 16;
- EPRINTFARGS("\nFailed to write %d blocks @ LBA %08X\nfrom eMMC. Aborting..\n",
- num, lba_curr);
- EPRINTF("\nThis device may be in an inoperative state!\n\nPress any key and try again...\n");
-
- f_close(&fp);
- return 0;
- }
- }
- pct = (u64)((u64)(lba_curr - part->lba_start) * 100u) / (u64)(part->lba_end - part->lba_start);
- if (pct != prevPct)
- {
- tui_pbar(0, gfx_con.y, pct, TXT_CLR_DEFAULT, TXT_CLR_GREY_M);
- prevPct = pct;
- }
-
- lba_curr += num;
- totalSectors -= num;
- bytesWritten += num * EMMC_BLOCKSIZE;
- }
- tui_pbar(0, gfx_con.y, 100, TXT_CLR_DEFAULT, TXT_CLR_GREY_M);
-
- // Restore operation ended successfully.
- f_close(&fp);
-
- // Verify restored data.
- if (_dump_emmc_verify(storage, lbaStartPart, outFilename, part))
- {
- EPRINTF("\nPress any key and try again...\n");
-
- return 0;
- }
- else
- tui_pbar(0, gfx_con.y, 100, TXT_CLR_GREENISH, 0xFF155500);
-
- gfx_con.fntsz = 16;
- gfx_puts("\n\n");
-
- return 1;
-}
-
-static void _restore_emmc_selected(emmcPartType_t restoreType)
-{
- int res = 0;
- u32 timer = 0;
- gfx_clear_partial_grey(0x1B, 0, 1256);
- tui_sbar(true);
- gfx_con_setpos(0, 0);
-
- gfx_printf("%kThis may render the device inoperative!\n\n", TXT_CLR_WARNING);
- gfx_printf("Are you really sure?\n\n%k", TXT_CLR_DEFAULT);
- if ((restoreType & PART_BOOT) || (restoreType & PART_GP_ALL))
- {
- gfx_puts("The mode you selected will only restore\nthe ");
- if (restoreType & PART_BOOT)
- gfx_puts("boot ");
- gfx_puts("partitions that it can find.\n");
- gfx_puts("If it is not found, it will be skipped\nand continue with the next.\n\n");
- }
- gfx_con_getpos(&gfx_con.savedx, &gfx_con.savedy);
-
- u8 failsafe_wait = 10;
- while (failsafe_wait > 0)
- {
- gfx_con_setpos(gfx_con.savedx, gfx_con.savedy);
- gfx_printf("%kWait... (%ds) %k", TXT_CLR_GREY, failsafe_wait, TXT_CLR_DEFAULT);
- msleep(1000);
- failsafe_wait--;
- }
- gfx_con_setpos(gfx_con.savedx, gfx_con.savedy);
-
- gfx_puts("Press POWER to Continue.\nPress VOL to go to the menu.\n\n\n");
-
- u32 btn = btn_wait();
- if (!(btn & BTN_POWER))
- goto out;
-
- if (!sd_mount())
- goto out;
-
- if (!emmc_initialize(false))
- {
- EPRINTF("Failed to init eMMC.");
- goto out;
- }
-
- int i = 0;
- char sdPath[OUT_FILENAME_SZ];
-
- timer = get_tmr_s();
- if (restoreType & PART_BOOT)
- {
- const u32 BOOT_PART_SIZE = emmc_storage.ext_csd.boot_mult << 17;
-
- emmc_part_t bootPart;
- memset(&bootPart, 0, sizeof(bootPart));
- bootPart.lba_start = 0;
- bootPart.lba_end = (BOOT_PART_SIZE / EMMC_BLOCKSIZE) - 1;
- for (i = 0; i < 2; i++)
- {
- strcpy(bootPart.name, "BOOT");
- bootPart.name[4] = (u8)('0' + i);
- bootPart.name[5] = 0;
-
- gfx_printf("%k%02d: %s (%07X-%07X)%k\n", TXT_CLR_CYAN_L, i,
- bootPart.name, bootPart.lba_start, bootPart.lba_end, TXT_CLR_DEFAULT);
-
- sdmmc_storage_set_mmc_partition(&emmc_storage, i + 1);
-
- emmcsn_path_impl(sdPath, "/restore", bootPart.name, &emmc_storage);
- res = _restore_emmc_part(sdPath, &emmc_storage, &bootPart, false);
- }
- }
-
- if (restoreType & PART_GP_ALL)
- {
- sdmmc_storage_set_mmc_partition(&emmc_storage, EMMC_GPP);
-
- LIST_INIT(gpt);
- emmc_gpt_parse(&gpt);
- LIST_FOREACH_ENTRY(emmc_part_t, part, &gpt, link)
- {
- gfx_printf("%k%02d: %s (%07X-%07X)%k\n", TXT_CLR_CYAN_L, i++,
- part->name, part->lba_start, part->lba_end, TXT_CLR_DEFAULT);
-
- emmcsn_path_impl(sdPath, "/restore/partitions/", part->name, &emmc_storage);
- res = _restore_emmc_part(sdPath, &emmc_storage, part, false);
- }
- emmc_gpt_free(&gpt);
- }
-
- if (restoreType & PART_RAW)
- {
- // Get GP partition size dynamically.
- const u32 RAW_AREA_NUM_SECTORS = emmc_storage.sec_cnt;
-
- emmc_part_t rawPart;
- memset(&rawPart, 0, sizeof(rawPart));
- rawPart.lba_start = 0;
- rawPart.lba_end = RAW_AREA_NUM_SECTORS - 1;
- strcpy(rawPart.name, "rawnand.bin");
- {
- gfx_printf("%k%02d: %s (%07X-%07X)%k\n", TXT_CLR_CYAN_L, i++,
- rawPart.name, rawPart.lba_start, rawPart.lba_end, TXT_CLR_DEFAULT);
-
- emmcsn_path_impl(sdPath, "/restore", rawPart.name, &emmc_storage);
- res = _restore_emmc_part(sdPath, &emmc_storage, &rawPart, true);
- }
- }
-
- gfx_putc('\n');
- timer = get_tmr_s() - timer;
- gfx_printf("Time taken: %dm %ds.\n", timer / 60, timer % 60);
- emmc_end();
- if (res)
- gfx_printf("\n%kFinished and verified!%k\nPress any key...\n", TXT_CLR_GREENISH, TXT_CLR_DEFAULT);
-
-out:
- sd_end();
- btn_wait();
-}
-
-void restore_emmc_boot() { _restore_emmc_selected(PART_BOOT); }
-void restore_emmc_rawnand() { _restore_emmc_selected(PART_RAW); }
-void restore_emmc_gpp_parts() { _restore_emmc_selected(PART_GP_ALL); }
-
-#pragma GCC pop_options
diff --git a/bootloader/frontend/fe_emmc_tools.h b/bootloader/frontend/fe_emmc_tools.h
deleted file mode 100644
index 059a03a..0000000
--- a/bootloader/frontend/fe_emmc_tools.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) 2018 Rajko Stojadinovic
- * Copyright (c) 2018 CTCaer
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-#ifndef _FE_EMMC_TOOLS_H_
-#define _FE_EMMC_TOOLS_H_
-
-void dump_emmc_system();
-void dump_emmc_user();
-void dump_emmc_boot();
-void dump_emmc_rawnand();
-
-void restore_emmc_boot();
-void restore_emmc_rawnand();
-void restore_emmc_gpp_parts();
-
-#endif
diff --git a/bootloader/frontend/fe_info.c b/bootloader/frontend/fe_info.c
index b9a97f6..46d99db 100644
--- a/bootloader/frontend/fe_info.c
+++ b/bootloader/frontend/fe_info.c
@@ -1,7 +1,6 @@
/*
* Copyright (c) 2018 naehrwert
* Copyright (c) 2018-2022 CTCaer
- * Copyright (c) 2018 balika011
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
@@ -36,7 +35,6 @@ void print_fuseinfo()
{
u32 fuse_size = h_cfg.t210b01 ? 0x368 : 0x300;
u32 fuse_address = h_cfg.t210b01 ? 0x7000F898 : 0x7000F900;
- u32 fuse_array_size = (h_cfg.t210b01 ? 256 : 192) * sizeof(u32);
gfx_clear_partial_grey(0x1B, 0, 1256);
gfx_con_setpos(0, 0);
@@ -60,59 +58,7 @@ void print_fuseinfo()
gfx_printf("%kFuse cache:\n\n%k", TXT_CLR_CYAN_L, TXT_CLR_DEFAULT);
gfx_hexdump(fuse_address, (u8 *)fuse_address, fuse_size);
- gfx_puts("\nPress POWER to dump them to SD Card.\nPress VOL to go to the menu.\n");
-
- u32 btn = btn_wait();
- if (btn & BTN_POWER)
- {
- if (sd_mount())
- {
- char path[64];
- emmcsn_path_impl(path, "/dumps", "fuse_cached.bin", NULL);
- if (!sd_save_to_file((u8 *)fuse_address, fuse_size, path))
- gfx_puts("\nfuse_cached.bin saved!\n");
-
- u32 words[256];
- fuse_read_array(words);
- emmcsn_path_impl(path, "/dumps", "fuse_array_raw.bin", NULL);
- if (!sd_save_to_file((u8 *)words, fuse_array_size, path))
- gfx_puts("\nfuse_array_raw.bin saved!\n");
-
- sd_end();
- }
-
- btn_wait();
- }
-}
-
-void print_kfuseinfo()
-{
- gfx_clear_partial_grey(0x1B, 0, 1256);
- gfx_con_setpos(0, 0);
-
- gfx_printf("%kKFuse contents:\n\n%k", TXT_CLR_CYAN_L, TXT_CLR_DEFAULT);
- u32 buf[KFUSE_NUM_WORDS];
- if (!kfuse_read(buf))
- EPRINTF("CRC fail.");
- else
- gfx_hexdump(0, (u8 *)buf, KFUSE_NUM_WORDS * 4);
-
- gfx_puts("\nPress POWER to dump them to SD Card.\nPress VOL to go to the menu.\n");
-
- u32 btn = btn_wait();
- if (btn & BTN_POWER)
- {
- if (sd_mount())
- {
- char path[64];
- emmcsn_path_impl(path, "/dumps", "kfuses.bin", NULL);
- if (!sd_save_to_file((u8 *)buf, KFUSE_NUM_WORDS * 4, path))
- gfx_puts("\nDone!\n");
- sd_end();
- }
-
- btn_wait();
- }
+ btn_wait();
}
void print_mmc_info()
@@ -449,94 +395,7 @@ void print_battery_info()
gfx_hexdump(0, (u8 *)buf, 0x200);
- gfx_puts("\nPress POWER to dump them to SD Card.\nPress VOL to go to the menu.\n");
-
- u32 btn = btn_wait();
-
- if (btn & BTN_POWER)
- {
- if (sd_mount())
- {
- char path[64];
- emmcsn_path_impl(path, "/dumps", "fuel_gauge.bin", NULL);
- if (sd_save_to_file((u8 *)buf, 0x200, path))
- EPRINTF("\nError creating fuel.bin file.");
- else
- gfx_puts("\nDone!\n");
- sd_end();
- }
-
- btn_wait();
- }
- free(buf);
-}
-
-void _ipatch_process(u32 offset, u32 value)
-{
- gfx_printf("%8x %8x", BOOTROM_BASE + offset, value);
- u8 lo = value & 0xff;
- switch (value >> 8)
- {
- case 0x20:
- gfx_printf(" MOVS R0, #0x%02X", lo);
- break;
- case 0xDF:
- gfx_printf(" SVC #0x%02X", lo);
- break;
- }
- gfx_puts("\n");
-}
-
-void bootrom_ipatches_info()
-{
- gfx_clear_partial_grey(0x1B, 0, 1256);
- gfx_con_setpos(0, 0);
-
- static const u32 BOOTROM_SIZE = 0x18000;
-
- u32 res = fuse_read_ipatch(_ipatch_process);
- if (res != 0)
- EPRINTFARGS("Failed to read ipatches. Error: %d", res);
-
- gfx_puts("\nPress POWER to dump them to SD Card.\nPress VOL to go to the menu.\n");
-
- u32 btn = btn_wait();
- if (btn & BTN_POWER)
- {
- if (sd_mount())
- {
- char path[64];
- u32 iram_evp_thunks[0x200];
- u32 iram_evp_thunks_len = sizeof(iram_evp_thunks);
- res = fuse_read_evp_thunk(iram_evp_thunks, &iram_evp_thunks_len);
- if (res == 0)
- {
- emmcsn_path_impl(path, "/dumps", "evp_thunks.bin", NULL);
- if (!sd_save_to_file((u8 *)iram_evp_thunks, iram_evp_thunks_len, path))
- gfx_puts("\nevp_thunks.bin saved!\n");
- }
- else
- EPRINTFARGS("Failed to read evp_thunks. Error: %d", res);
-
- emmcsn_path_impl(path, "/dumps", "bootrom_patched.bin", NULL);
- if (!sd_save_to_file((u8 *)BOOTROM_BASE, BOOTROM_SIZE, path))
- gfx_puts("\nbootrom_patched.bin saved!\n");
-
- u32 ipatch_backup[14];
- memcpy(ipatch_backup, (void *)IPATCH_BASE, sizeof(ipatch_backup));
- memset((void*)IPATCH_BASE, 0, sizeof(ipatch_backup));
-
- emmcsn_path_impl(path, "/dumps", "bootrom_unpatched.bin", NULL);
- if (!sd_save_to_file((u8 *)BOOTROM_BASE, BOOTROM_SIZE, path))
- gfx_puts("\nbootrom_unpatched.bin saved!\n");
-
- memcpy((void*)IPATCH_BASE, ipatch_backup, sizeof(ipatch_backup));
-
- sd_end();
- }
-
- btn_wait();
- }
+ btn_wait();
}
#pragma GCC pop_options
diff --git a/bootloader/frontend/fe_info.h b/bootloader/frontend/fe_info.h
index 5818bee..db649aa 100644
--- a/bootloader/frontend/fe_info.h
+++ b/bootloader/frontend/fe_info.h
@@ -1,7 +1,6 @@
/*
* Copyright (c) 2018 naehrwert
- * Copyright (c) 2018-2021 CTCaer
- * Copyright (c) 2018 balika011
+ * Copyright (c) 2018-2022 CTCaer
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
@@ -20,12 +19,10 @@
#define _FE_INFO_H_
void print_fuseinfo();
-void print_kfuseinfo();
void print_mmc_info();
void print_sdcard_info();
void print_fuel_gauge_info();
void print_battery_charger_info();
void print_battery_info();
-void bootrom_ipatches_info();
#endif
diff --git a/bootloader/frontend/fe_tools.c b/bootloader/frontend/fe_tools.c
index 41b422d..256713b 100644
--- a/bootloader/frontend/fe_tools.c
+++ b/bootloader/frontend/fe_tools.c
@@ -24,224 +24,14 @@
#include "fe_tools.h"
#include "../config.h"
#include "../gfx/tui.h"
-#include "../hos/hos.h"
-#include "../hos/pkg1.h"
-#include "../hos/pkg2.h"
#include
extern boot_cfg_t b_cfg;
extern hekate_config h_cfg;
-extern void emmcsn_path_impl(char *path, char *sub_dir, char *filename, sdmmc_storage_t *storage);
-
#pragma GCC push_options
#pragma GCC optimize ("Os")
-void dump_packages12()
-{
- if (!sd_mount())
- return;
-
- char path[64];
-
- u8 *pkg1 = (u8 *)calloc(1, SZ_256K);
- u8 *warmboot = (u8 *)calloc(1, SZ_256K);
- u8 *secmon = (u8 *)calloc(1, SZ_256K);
- u8 *loader = (u8 *)calloc(1, SZ_256K);
- u8 *pkg2 = NULL;
- u8 kb = 0;
-
- tsec_ctxt_t tsec_ctxt;
-
- gfx_clear_partial_grey(0x1B, 0, 1256);
- gfx_con_setpos(0, 0);
-
- if (!emmc_initialize(false))
- {
- EPRINTF("Failed to init eMMC.");
- goto out_free;
- }
- sdmmc_storage_set_mmc_partition(&emmc_storage, EMMC_BOOT0);
-
- // Read package1.
- sdmmc_storage_read(&emmc_storage, 0x100000 / EMMC_BLOCKSIZE, SZ_256K / EMMC_BLOCKSIZE, pkg1);
- const pkg1_id_t *pkg1_id = pkg1_identify(pkg1);
- if (!pkg1_id)
- {
- EPRINTF("Unknown pkg1 version for reading\nTSEC firmware.");
- // Dump package1.
- emmcsn_path_impl(path, "/pkg1", "pkg1_enc.bin", &emmc_storage);
- if (sd_save_to_file(pkg1, SZ_256K, path))
- goto out_free;
- gfx_puts("\nEnc pkg1 dumped to pkg1_enc.bin\n");
-
- goto out_free;
- }
-
- kb = pkg1_id->kb;
-
- tsec_ctxt.fw = (void *)pkg1 + pkg1_id->tsec_off;
- tsec_ctxt.pkg1 = (void *)pkg1;
- tsec_ctxt.pkg11_off = pkg1_id->pkg11_off;
- tsec_ctxt.secmon_base = pkg1_id->secmon_base;
-
- // Read keyblob.
- u8 *keyblob = (u8 *)calloc(EMMC_BLOCKSIZE, 1);
- sdmmc_storage_read(&emmc_storage, 0x180000 / EMMC_BLOCKSIZE + kb, 1, keyblob);
-
- // Decrypt.
- hos_keygen(keyblob, kb, &tsec_ctxt, false, false);
- free(keyblob);
-
- if (kb <= KB_FIRMWARE_VERSION_600)
- pkg1_decrypt(pkg1_id, pkg1);
-
- if (kb <= KB_FIRMWARE_VERSION_620)
- {
- const u8 *sec_map = pkg1_unpack(warmboot, NULL, secmon, loader, pkg1_id, pkg1);
-
- pk11_hdr_t *hdr_pk11 = (pk11_hdr_t *)(pkg1 + pkg1_id->pkg11_off + 0x20);
-
- // Use correct sizes.
- u32 sec_size[3] = { hdr_pk11->wb_size, hdr_pk11->ldr_size, hdr_pk11->sm_size };
- for (u32 i = 0; i < 3; i++)
- {
- if (sec_map[i] == PK11_SECTION_WB)
- hdr_pk11->wb_size = sec_size[i];
- else if (sec_map[i] == PK11_SECTION_LD)
- hdr_pk11->ldr_size = sec_size[i];
- else if (sec_map[i] == PK11_SECTION_SM)
- hdr_pk11->sm_size = sec_size[i];
- }
-
- // Display info.
- gfx_printf("%kNX Bootloader size: %k0x%05X\n\n", TXT_CLR_GREENISH, TXT_CLR_DEFAULT, hdr_pk11->ldr_size);
-
- gfx_printf("%kSecure monitor addr: %k0x%05X\n", TXT_CLR_GREENISH, TXT_CLR_DEFAULT, pkg1_id->secmon_base);
- gfx_printf("%kSecure monitor size: %k0x%05X\n\n", TXT_CLR_GREENISH, TXT_CLR_DEFAULT, hdr_pk11->sm_size);
-
- gfx_printf("%kWarmboot addr: %k0x%05X\n", TXT_CLR_GREENISH, TXT_CLR_DEFAULT, pkg1_id->warmboot_base);
- gfx_printf("%kWarmboot size: %k0x%05X\n\n", TXT_CLR_GREENISH, TXT_CLR_DEFAULT, hdr_pk11->wb_size);
-
- // Dump package1.1.
- emmcsn_path_impl(path, "/pkg1", "pkg1_decr.bin", &emmc_storage);
- if (sd_save_to_file(pkg1, SZ_256K, path))
- goto out_free;
- gfx_puts("\npkg1 dumped to pkg1_decr.bin\n");
-
- // Dump nxbootloader.
- emmcsn_path_impl(path, "/pkg1", "nxloader.bin", &emmc_storage);
- if (sd_save_to_file(loader, hdr_pk11->ldr_size, path))
- goto out_free;
- gfx_puts("NX Bootloader dumped to nxloader.bin\n");
-
- // Dump secmon.
- emmcsn_path_impl(path, "/pkg1", "secmon.bin", &emmc_storage);
- if (sd_save_to_file(secmon, hdr_pk11->sm_size, path))
- goto out_free;
- gfx_puts("Secure Monitor dumped to secmon.bin\n");
-
- // Dump warmboot.
- emmcsn_path_impl(path, "/pkg1", "warmboot.bin", &emmc_storage);
- if (sd_save_to_file(warmboot, hdr_pk11->wb_size, path))
- goto out_free;
- gfx_puts("Warmboot dumped to warmboot.bin\n\n\n");
- }
-
- // Dump package2.1.
- sdmmc_storage_set_mmc_partition(&emmc_storage, EMMC_GPP);
- // Parse eMMC GPT.
- LIST_INIT(gpt);
- emmc_gpt_parse(&gpt);
- // Find package2 partition.
- emmc_part_t *pkg2_part = emmc_part_find(&gpt, "BCPKG2-1-Normal-Main");
- if (!pkg2_part)
- goto out;
-
- // Read in package2 header and get package2 real size.
- u8 *tmp = (u8 *)malloc(EMMC_BLOCKSIZE);
- emmc_part_read(pkg2_part, 0x4000 / EMMC_BLOCKSIZE, 1, tmp);
- u32 *hdr_pkg2_raw = (u32 *)(tmp + 0x100);
- u32 pkg2_size = hdr_pkg2_raw[0] ^ hdr_pkg2_raw[2] ^ hdr_pkg2_raw[3];
- free(tmp);
- // Read in package2.
- u32 pkg2_size_aligned = ALIGN(pkg2_size, EMMC_BLOCKSIZE);
- pkg2 = malloc(pkg2_size_aligned);
- emmc_part_read(pkg2_part, 0x4000 / EMMC_BLOCKSIZE,
- pkg2_size_aligned / EMMC_BLOCKSIZE, pkg2);
-
-#if 0
- emmcsn_path_impl(path, "/pkg2", "pkg2_encr.bin", &emmc_storage);
- if (sd_save_to_file(pkg2, pkg2_size_aligned, path))
- goto out;
- gfx_puts("\npkg2 dumped to pkg2_encr.bin\n");
-#endif
-
- // Decrypt package2 and parse KIP1 blobs in INI1 section.
- pkg2_hdr_t *pkg2_hdr = pkg2_decrypt(pkg2, kb, false);
- if (!pkg2_hdr)
- {
- gfx_printf("Pkg2 decryption failed!\n");
- goto out;
- }
-
- // Display info.
- gfx_printf("%kKernel size: %k0x%05X\n\n", TXT_CLR_GREENISH, TXT_CLR_DEFAULT, pkg2_hdr->sec_size[PKG2_SEC_KERNEL]);
- gfx_printf("%kINI1 size: %k0x%05X\n\n", TXT_CLR_GREENISH, TXT_CLR_DEFAULT, pkg2_hdr->sec_size[PKG2_SEC_INI1]);
-
- // Dump pkg2.1.
- emmcsn_path_impl(path, "/pkg2", "pkg2_decr.bin", &emmc_storage);
- if (sd_save_to_file(pkg2, pkg2_hdr->sec_size[PKG2_SEC_KERNEL] + pkg2_hdr->sec_size[PKG2_SEC_INI1], path))
- goto out;
- gfx_puts("\npkg2 dumped to pkg2_decr.bin\n");
-
- // Dump kernel.
- emmcsn_path_impl(path, "/pkg2", "kernel.bin", &emmc_storage);
- if (sd_save_to_file(pkg2_hdr->data, pkg2_hdr->sec_size[PKG2_SEC_KERNEL], path))
- goto out;
- gfx_puts("Kernel dumped to kernel.bin\n");
-
- // Dump INI1.
- emmcsn_path_impl(path, "/pkg2", "ini1.bin", &emmc_storage);
- u32 ini1_off = pkg2_hdr->sec_size[PKG2_SEC_KERNEL];
- u32 ini1_size = pkg2_hdr->sec_size[PKG2_SEC_INI1];
- if (!ini1_size)
- {
- pkg2_get_newkern_info(pkg2_hdr->data);
- ini1_off = pkg2_newkern_ini1_start;
- ini1_size = pkg2_newkern_ini1_end - pkg2_newkern_ini1_start;
- }
- if (ini1_off)
- {
- if (sd_save_to_file(pkg2_hdr->data + ini1_off, ini1_size, path))
- goto out;
- gfx_puts("INI1 dumped to ini1.bin\n");
- }
- else
- {
- gfx_puts("Failed to dump INI1!\n");
- goto out;
- }
-
- gfx_puts("\nDone. Press any key...\n");
-
-out:
- emmc_gpt_free(&gpt);
-out_free:
- free(pkg1);
- free(secmon);
- free(warmboot);
- free(loader);
- free(pkg2);
- emmc_end();
- sd_end();
-
- if (kb >= KB_FIRMWARE_VERSION_620)
- se_aes_key_clear(8);
-
- btn_wait();
-}
-
void _toggle_autorcm(bool enable)
{
gfx_clear_partial_grey(0x1B, 0, 1256);
diff --git a/bootloader/frontend/fe_tools.h b/bootloader/frontend/fe_tools.h
index 637bcab..db48d27 100644
--- a/bootloader/frontend/fe_tools.h
+++ b/bootloader/frontend/fe_tools.h
@@ -1,6 +1,6 @@
/*
* Copyright (c) 2018 naehrwert
- * Copyright (c) 2018-2021 CTCaer
+ * Copyright (c) 2018-2022 CTCaer
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
@@ -18,7 +18,6 @@
#ifndef _FE_TOOLS_H_
#define _FE_TOOLS_H_
-void dump_packages12();
void menu_autorcm();
#endif
diff --git a/bootloader/main.c b/bootloader/main.c
index 680389f..03645f4 100644
--- a/bootloader/main.c
+++ b/bootloader/main.c
@@ -31,7 +31,6 @@
#include
#include "storage/emummc.h"
-#include "frontend/fe_emmc_tools.h"
#include "frontend/fe_tools.h"
#include "frontend/fe_info.h"
@@ -1346,9 +1345,7 @@ ment_t ment_cinfo[] = {
MDEF_BACK(),
MDEF_CHGLINE(),
MDEF_CAPTION("---- SoC Info ----", TXT_CLR_CYAN_L),
- //MDEF_HANDLER("Ipatches & bootrom", bootrom_ipatches_info),
MDEF_HANDLER("Fuses", print_fuseinfo),
- //MDEF_HANDLER("Print kfuse info", print_kfuseinfo),
MDEF_CHGLINE(),
MDEF_CAPTION("-- Storage Info --", TXT_CLR_CYAN_L),
MDEF_HANDLER("eMMC", print_mmc_info),
@@ -1361,45 +1358,9 @@ ment_t ment_cinfo[] = {
menu_t menu_cinfo = { ment_cinfo, "Console Info", 0, 0 };
-ment_t ment_restore[] = {
- MDEF_BACK(),
- MDEF_CHGLINE(),
- MDEF_CAPTION("------ Full --------", TXT_CLR_CYAN_L),
- MDEF_HANDLER("Restore eMMC BOOT0/1", restore_emmc_boot),
- MDEF_HANDLER("Restore eMMC RAW GPP", restore_emmc_rawnand),
- MDEF_CHGLINE(),
- MDEF_CAPTION("-- GPP Partitions --", TXT_CLR_CYAN_L),
- MDEF_HANDLER("Restore GPP partitions", restore_emmc_gpp_parts),
- MDEF_END()
-};
-
-menu_t menu_restore = { ment_restore, "Restore Options", 0, 0 };
-
-ment_t ment_backup[] = {
- MDEF_BACK(),
- MDEF_CHGLINE(),
- MDEF_CAPTION("------ Full --------", TXT_CLR_CYAN_L),
- MDEF_HANDLER("Backup eMMC BOOT0/1", dump_emmc_boot),
- MDEF_HANDLER("Backup eMMC RAW GPP", dump_emmc_rawnand),
- MDEF_CHGLINE(),
- MDEF_CAPTION("-- GPP Partitions --", TXT_CLR_CYAN_L),
- MDEF_HANDLER("Backup eMMC SYS", dump_emmc_system),
- MDEF_HANDLER("Backup eMMC USER", dump_emmc_user),
- MDEF_END()
-};
-
-menu_t menu_backup = { ment_backup, "Backup Options", 0, 0 };
-
ment_t ment_tools[] = {
MDEF_BACK(),
MDEF_CHGLINE(),
- //MDEF_CAPTION("-- Backup & Restore --", TXT_CLR_CYAN_L),
- //MDEF_MENU("Backup", &menu_backup),
- //MDEF_MENU("Restore", &menu_restore),
- //MDEF_CHGLINE(),
- //MDEF_CAPTION("-------- Misc --------", TXT_CLR_CYAN_L),
- //MDEF_HANDLER("Dump package1/2", dump_packages12),
- //MDEF_CHGLINE(),
MDEF_CAPTION("-------- Other -------", TXT_CLR_WARNING),
MDEF_HANDLER("AutoRCM", menu_autorcm),
MDEF_END()