mirror of
https://github.com/CTCaer/hekate
synced 2024-12-22 19:31:12 +00:00
Disable verification for now & add memcmp32sparse
When the commit with the configuration will be a available, these 3 options will exist: - Disable verification - Sparse verification (Fast) - Full (Slow) Sparse will take approx 8 minutes for rawnand.bin and Full will take 4.5 hours.
This commit is contained in:
parent
60f4000e9d
commit
c215b1c74c
3 changed files with 62 additions and 15 deletions
45
ipl/main.c
45
ipl/main.c
|
@ -693,6 +693,7 @@ int dump_emmc_verify(sdmmc_storage_t *storage, u32 lba_curr, char* outFilename,
|
||||||
{
|
{
|
||||||
FIL fp;
|
FIL fp;
|
||||||
u32 prevPct = 200;
|
u32 prevPct = 200;
|
||||||
|
int res = 0;
|
||||||
|
|
||||||
if (f_open(&fp, outFilename, FA_READ) == FR_OK)
|
if (f_open(&fp, outFilename, FA_READ) == FR_OK)
|
||||||
{
|
{
|
||||||
|
@ -734,8 +735,12 @@ int dump_emmc_verify(sdmmc_storage_t *storage, u32 lba_curr, char* outFilename,
|
||||||
f_close(&fp);
|
f_close(&fp);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
//TODO: Replace with the config check 2.
|
||||||
if(memcmp(bufEm, bufSd, num << 9))
|
if (1)
|
||||||
|
res = memcmp32sparse((u32 *)bufEm, (u32 *)bufSd, num << 9);
|
||||||
|
else
|
||||||
|
res = memcmp((u32 *)bufEm, (u32 *)bufSd, num << 9);
|
||||||
|
if(res)
|
||||||
{
|
{
|
||||||
EPRINTFARGS("\nSD card and eMMC data (@LBA %08X),\ndo not match!\n\nVerification failed..\n", num, lba_curr);
|
EPRINTFARGS("\nSD card and eMMC data (@LBA %08X),\ndo not match!\n\nVerification failed..\n", num, lba_curr);
|
||||||
|
|
||||||
|
@ -911,13 +916,17 @@ int dump_emmc_part(char *sd_path, sdmmc_storage_t *storage, emmc_part_t *part)
|
||||||
memset(&fp, 0, sizeof(fp));
|
memset(&fp, 0, sizeof(fp));
|
||||||
currPartIdx++;
|
currPartIdx++;
|
||||||
|
|
||||||
// Verify part.
|
//TODO: Replace with the config check.
|
||||||
if (dump_emmc_verify(storage, lbaStartPart, outFilename, part))
|
if (1)
|
||||||
{
|
{
|
||||||
EPRINTF("\nPress any key and try again...\n");
|
// Verify part.
|
||||||
|
if (dump_emmc_verify(storage, lbaStartPart, outFilename, part))
|
||||||
|
{
|
||||||
|
EPRINTF("\nPress any key and try again...\n");
|
||||||
|
|
||||||
free(buf);
|
free(buf);
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (numSplitParts >= 10 && currPartIdx < 10)
|
if (numSplitParts >= 10 && currPartIdx < 10)
|
||||||
|
@ -1027,16 +1036,20 @@ int dump_emmc_part(char *sd_path, sdmmc_storage_t *storage, emmc_part_t *part)
|
||||||
free(buf);
|
free(buf);
|
||||||
f_close(&fp);
|
f_close(&fp);
|
||||||
|
|
||||||
// Verify last part or single file backup.
|
//TODO: Replace with the config check.
|
||||||
if (dump_emmc_verify(storage, lbaStartPart, outFilename, part))
|
if (0)
|
||||||
{
|
{
|
||||||
EPRINTF("\nPress any key and try again...\n");
|
// Verify last part or single file backup.
|
||||||
|
if (dump_emmc_verify(storage, lbaStartPart, outFilename, part))
|
||||||
|
{
|
||||||
|
EPRINTF("\nPress any key and try again...\n");
|
||||||
|
|
||||||
free(buf);
|
free(buf);
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
tui_pbar(&gfx_con, 0, gfx_con.y, 100, 0xFF96FF00, 0xFF155500);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
tui_pbar(&gfx_con, 0, gfx_con.y, 100, 0xFF96FF00, 0xFF155500);
|
|
||||||
|
|
||||||
// Remove partial backup index file if no fatal errors occurred.
|
// Remove partial backup index file if no fatal errors occurred.
|
||||||
if(isSmallSdCard)
|
if(isSmallSdCard)
|
||||||
|
@ -1164,8 +1177,10 @@ static void dump_emmc_selected(dumpType_t dumpType)
|
||||||
gfx_putc(&gfx_con, '\n');
|
gfx_putc(&gfx_con, '\n');
|
||||||
gfx_printf(&gfx_con, "Time taken: %d seconds.\n", (get_tmr() - timer) / 1000000);
|
gfx_printf(&gfx_con, "Time taken: %d seconds.\n", (get_tmr() - timer) / 1000000);
|
||||||
sdmmc_storage_end(&storage);
|
sdmmc_storage_end(&storage);
|
||||||
if (res)
|
if (res && 0) //TODO: Replace with the config check.
|
||||||
gfx_printf(&gfx_con, "\n%kFinished and verified!%k\nPress any key...\n",0xFF96FF00, 0xFFCCCCCC);
|
gfx_printf(&gfx_con, "\n%kFinished and verified!%k\nPress any key...\n",0xFF96FF00, 0xFFCCCCCC);
|
||||||
|
else if (res)
|
||||||
|
gfx_printf(&gfx_con, "\nFinished! Press any key...\n");
|
||||||
|
|
||||||
out:;
|
out:;
|
||||||
sd_unmount();
|
sd_unmount();
|
||||||
|
|
28
ipl/util.c
28
ipl/util.c
|
@ -49,3 +49,31 @@ u32 crc32c(const void *buf, u32 len)
|
||||||
}
|
}
|
||||||
return ~crc;
|
return ~crc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u32 memcmp32sparse(const u32 *buf1, const u32 *buf2, u32 len)
|
||||||
|
{
|
||||||
|
u32 len32 = len / 4;
|
||||||
|
|
||||||
|
if (!(len32 % 32))
|
||||||
|
{
|
||||||
|
while (len32)
|
||||||
|
{
|
||||||
|
len32 -= 32;
|
||||||
|
if(buf1[len32] != buf2[len32])
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (len32)
|
||||||
|
{
|
||||||
|
len32 -= 32;
|
||||||
|
if(buf1[len32] != buf2[len32])
|
||||||
|
return 1;
|
||||||
|
if (len32 < 32)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
|
@ -34,4 +34,8 @@ void sleep(u32 ticks);
|
||||||
void exec_cfg(u32 *base, const cfg_op_t *ops, u32 num_ops);
|
void exec_cfg(u32 *base, const cfg_op_t *ops, u32 num_ops);
|
||||||
u32 crc32c(const void *buf, u32 len);
|
u32 crc32c(const void *buf, u32 len);
|
||||||
|
|
||||||
|
/* This is a faster implementation of memcmp that checks two u32 values */
|
||||||
|
/* every 128 Bytes block. Intented for only for Backup and Restore */
|
||||||
|
u32 memcmp32sparse(const u32 *buf1, const u32 *buf2, u32 len);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue