Equalize hekate main and Nyx sd based functions
This commit is contained in:
@@ -161,7 +161,7 @@ int create_config_entry()
|
||||
}
|
||||
|
||||
f_close(&fp);
|
||||
sd_unmount();
|
||||
sd_end();
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -268,7 +268,7 @@ out2:;
|
||||
free(boot_values);
|
||||
free(boot_text);
|
||||
|
||||
sd_unmount();
|
||||
sd_end();
|
||||
}
|
||||
|
||||
void config_autoboot()
|
||||
@@ -380,7 +380,7 @@ out2:;
|
||||
free(boot_values);
|
||||
free(boot_text);
|
||||
|
||||
sd_unmount();
|
||||
sd_end();
|
||||
|
||||
if (temp_autoboot == NULL)
|
||||
return;
|
||||
|
||||
@@ -574,7 +574,7 @@ static void _dump_emmc_selected(emmcPartType_t dumpType)
|
||||
gfx_printf("\n%kFinished and verified!%k\nPress any key...\n", 0xFF96FF00, 0xFFCCCCCC);
|
||||
|
||||
out:
|
||||
sd_unmount();
|
||||
sd_end();
|
||||
btn_wait();
|
||||
}
|
||||
|
||||
@@ -911,7 +911,7 @@ static void _restore_emmc_selected(emmcPartType_t restoreType)
|
||||
gfx_printf("\n%kFinished and verified!%k\nPress any key...\n", 0xFF96FF00, 0xFFCCCCCC);
|
||||
|
||||
out:
|
||||
sd_unmount();
|
||||
sd_end();
|
||||
btn_wait();
|
||||
}
|
||||
|
||||
|
||||
@@ -93,7 +93,7 @@ void print_fuseinfo()
|
||||
if (!sd_save_to_file((u8 *)words, sizeof(words), path))
|
||||
gfx_puts("\nfuse_array_raw.bin saved!\n");
|
||||
|
||||
sd_unmount();
|
||||
sd_end();
|
||||
}
|
||||
|
||||
btn_wait();
|
||||
@@ -123,7 +123,7 @@ void print_kfuseinfo()
|
||||
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_unmount();
|
||||
sd_end();
|
||||
}
|
||||
|
||||
btn_wait();
|
||||
@@ -308,7 +308,7 @@ void print_sdcard_info()
|
||||
gfx_printf("%kFound %s volume:%k\n Free: %d MiB\n Cluster: %d KiB\n",
|
||||
0xFF00DDFF, 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);
|
||||
sd_unmount();
|
||||
sd_end();
|
||||
}
|
||||
|
||||
btn_wait();
|
||||
@@ -410,7 +410,7 @@ void print_tsec_key()
|
||||
emmcsn_path_impl(path, "/dumps", "tsec_keys.bin", NULL);
|
||||
if (!sd_save_to_file(keys, 0x10 * 2, path))
|
||||
gfx_puts("\nDone!\n");
|
||||
sd_unmount();
|
||||
sd_end();
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -576,7 +576,7 @@ void print_battery_info()
|
||||
EPRINTF("\nError creating fuel.bin file.");
|
||||
else
|
||||
gfx_puts("\nDone!\n");
|
||||
sd_unmount();
|
||||
sd_end();
|
||||
}
|
||||
|
||||
btn_wait();
|
||||
@@ -645,7 +645,7 @@ void bootrom_ipatches_info()
|
||||
|
||||
memcpy((void*)IPATCH_BASE, ipatch_backup, sizeof(ipatch_backup));
|
||||
|
||||
sd_unmount();
|
||||
sd_end();
|
||||
}
|
||||
|
||||
btn_wait();
|
||||
|
||||
@@ -244,7 +244,7 @@ out_free:
|
||||
free(loader);
|
||||
free(pkg2);
|
||||
sdmmc_storage_end(&storage);
|
||||
sd_unmount();
|
||||
sd_end();
|
||||
|
||||
if (kb >= KB_FIRMWARE_VERSION_620)
|
||||
se_aes_key_clear(8);
|
||||
@@ -499,7 +499,7 @@ void _fix_sd_attr(u32 type)
|
||||
gfx_printf("Traversing all %s files!\nThis may take some time...\n\n", label);
|
||||
_fix_attributes(path, &total, type, type);
|
||||
gfx_printf("%kTotal archive bits cleared: %d!%k\n\nDone! Press any key...", 0xFF96FF00, total, 0xFFCCCCCC);
|
||||
sd_unmount();
|
||||
sd_end();
|
||||
}
|
||||
btn_wait();
|
||||
}
|
||||
|
||||
@@ -621,7 +621,7 @@ static bool _get_fs_exfat_compatible(link_t *info)
|
||||
if (strncmp((const char*)ki->kip1->name, "FS", 2))
|
||||
continue;
|
||||
|
||||
if (!se_calc_sha256(sha_buf, ki->kip1, ki->size))
|
||||
if (!se_calc_sha256_oneshot(sha_buf, ki->kip1, ki->size))
|
||||
break;
|
||||
|
||||
pkg2_get_ids(&kip_ids, &fs_ids_cnt);
|
||||
@@ -823,9 +823,9 @@ int hos_launch(ini_sec_t *cfg)
|
||||
u8 kernel_hash[0x20];
|
||||
// Hash only Kernel when it embeds INI1.
|
||||
if (!ctxt.new_pkg2)
|
||||
se_calc_sha256(kernel_hash, ctxt.kernel, ctxt.kernel_size);
|
||||
se_calc_sha256_oneshot(kernel_hash, ctxt.kernel, ctxt.kernel_size);
|
||||
else
|
||||
se_calc_sha256(kernel_hash, ctxt.kernel + PKG2_NEWKERN_START,
|
||||
se_calc_sha256_oneshot(kernel_hash, ctxt.kernel + PKG2_NEWKERN_START,
|
||||
pkg2_newkern_ini1_start - PKG2_NEWKERN_START);
|
||||
|
||||
ctxt.pkg2_kernel_id = pkg2_identify(kernel_hash);
|
||||
@@ -945,7 +945,7 @@ int hos_launch(ini_sec_t *cfg)
|
||||
config_exosphere(&ctxt);
|
||||
|
||||
// Unmount SD card.
|
||||
sd_unmount();
|
||||
sd_end();
|
||||
|
||||
// Finalize MC carveout.
|
||||
if (ctxt.pkg1_id->kb <= KB_FIRMWARE_VERSION_301)
|
||||
|
||||
@@ -1110,7 +1110,7 @@ const char* pkg2_patch_kips(link_t *info, char* patchNames)
|
||||
|
||||
if (shaBuf[0] == 0)
|
||||
{
|
||||
if (!se_calc_sha256(shaBuf, ki->kip1, ki->size))
|
||||
if (!se_calc_sha256_oneshot(shaBuf, ki->kip1, ki->size))
|
||||
memset(shaBuf, 0, sizeof(shaBuf));
|
||||
}
|
||||
|
||||
@@ -1148,7 +1148,7 @@ const char* pkg2_patch_kips(link_t *info, char* patchNames)
|
||||
|
||||
#ifdef DEBUG_PRINTING
|
||||
u32 postDecompTime = get_tmr_us();
|
||||
if (!se_calc_sha256(shaBuf, ki->kip1, ki->size))
|
||||
if (!se_calc_sha256_oneshot(shaBuf, ki->kip1, ki->size))
|
||||
memset(shaBuf, 0, sizeof(shaBuf));
|
||||
|
||||
DPRINTF("%dms %s KIP1 size %d hash %08X\n", (postDecompTime-preDecompTime) / 1000, ki->kip1->name, (int)ki->size, __builtin_bswap32(shaBuf[0]));
|
||||
|
||||
@@ -228,7 +228,7 @@ int reboot_to_sept(const u8 *tsec_fw, u32 kb, ini_sec_t *cfg_sec)
|
||||
f_close(&fp);
|
||||
}
|
||||
|
||||
sd_unmount();
|
||||
sd_end();
|
||||
|
||||
u32 pk1t_sept = SEPT_PK1T_ADDR - (ALIGN(PATCHED_RELOC_SZ, 0x10) + WB_RST_SIZE);
|
||||
|
||||
|
||||
@@ -76,7 +76,7 @@ uintptr_t ianos_loader(bool sdmount, char *path, elfType_t type, void *moduleCon
|
||||
fileBuf = sd_file_read(path, NULL);
|
||||
|
||||
if (sdmount)
|
||||
sd_unmount();
|
||||
sd_end();
|
||||
|
||||
if (!fileBuf)
|
||||
goto elfLoadFinalOut;
|
||||
@@ -94,7 +94,7 @@ uintptr_t ianos_loader(bool sdmount, char *path, elfType_t type, void *moduleCon
|
||||
case EXEC_ELF:
|
||||
case AR64_ELF:
|
||||
elfBuf = (void *)DRAM_LIB_ADDR;
|
||||
sd_unmount();
|
||||
sd_end();
|
||||
break;
|
||||
default:
|
||||
elfBuf = malloc(ctx.memsz); // Aligned to 0x10 by default.
|
||||
|
||||
@@ -119,7 +119,7 @@ void check_power_off_from_hos()
|
||||
u8 hosWakeup = i2c_recv_byte(I2C_5, MAX77620_I2C_ADDR, MAX77620_REG_IRQTOP);
|
||||
if (hosWakeup & MAX77620_IRQ_TOP_RTC_MASK)
|
||||
{
|
||||
sd_unmount();
|
||||
sd_end();
|
||||
|
||||
// Stop the alarm, in case we injected too fast.
|
||||
max77620_rtc_stop_alarm();
|
||||
@@ -249,7 +249,7 @@ int launch_payload(char *path, bool update)
|
||||
if (update && is_ipl_updated(buf, path, false))
|
||||
goto out;
|
||||
|
||||
sd_unmount();
|
||||
sd_end();
|
||||
|
||||
if (size < 0x30000)
|
||||
{
|
||||
@@ -284,7 +284,7 @@ int launch_payload(char *path, bool update)
|
||||
|
||||
out:
|
||||
if (!update)
|
||||
sd_unmount();
|
||||
sd_end();
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -353,7 +353,7 @@ void launch_tools()
|
||||
free(ments);
|
||||
free(dir);
|
||||
free(filelist);
|
||||
sd_unmount();
|
||||
sd_end();
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -380,7 +380,7 @@ void launch_tools()
|
||||
}
|
||||
|
||||
out:
|
||||
sd_unmount();
|
||||
sd_end();
|
||||
free(dir);
|
||||
|
||||
btn_wait();
|
||||
@@ -618,7 +618,7 @@ void launch_firmware()
|
||||
if (!cfg_sec)
|
||||
{
|
||||
free(ments);
|
||||
sd_unmount();
|
||||
sd_end();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -656,7 +656,7 @@ wrong_emupath:
|
||||
}
|
||||
|
||||
out:
|
||||
sd_unmount();
|
||||
sd_end();
|
||||
|
||||
h_cfg.emummc_force_disable = false;
|
||||
|
||||
@@ -673,7 +673,7 @@ void nyx_load_run()
|
||||
if (!nyx)
|
||||
return;
|
||||
|
||||
sd_unmount();
|
||||
sd_end();
|
||||
|
||||
u32 expected_nyx_ver = ((NYX_VER_MJ + '0') << 24) | ((NYX_VER_MN + '0') << 16) | ((NYX_VER_HF + '0') << 8);
|
||||
u32 nyx_ver = byte_swap_32(*(u32 *)(nyx + NYX_VER_OFF));
|
||||
@@ -1074,7 +1074,7 @@ out:
|
||||
|
||||
nyx_load_run();
|
||||
|
||||
sd_unmount();
|
||||
sd_end();
|
||||
}
|
||||
|
||||
static void _patched_rcm_protection()
|
||||
|
||||
@@ -168,7 +168,7 @@ out:
|
||||
|
||||
int emummc_storage_end(sdmmc_storage_t *storage)
|
||||
{
|
||||
sd_unmount();
|
||||
sd_end();
|
||||
sdmmc_storage_end(storage);
|
||||
|
||||
return 1;
|
||||
|
||||
@@ -23,13 +23,42 @@
|
||||
#include "../mem/heap.h"
|
||||
|
||||
static bool sd_mounted = false;
|
||||
static u16 sd_errors[3] = { 0 }; // Init and Read/Write errors.
|
||||
static u32 sd_mode = SD_UHS_SDR82;
|
||||
|
||||
|
||||
sdmmc_t sd_sdmmc;
|
||||
sdmmc_storage_t sd_storage;
|
||||
FATFS sd_fs;
|
||||
|
||||
void sd_error_count_increment(u8 type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case SD_ERROR_INIT_FAIL:
|
||||
sd_errors[0]++;
|
||||
break;
|
||||
case SD_ERROR_RW_FAIL:
|
||||
sd_errors[1]++;
|
||||
break;
|
||||
case SD_ERROR_RW_RETRY:
|
||||
sd_errors[2]++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
u16 *sd_get_error_count()
|
||||
{
|
||||
return sd_errors;
|
||||
}
|
||||
|
||||
bool sd_get_card_removed()
|
||||
{
|
||||
if (!sdmmc_get_sd_inserted())
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
u32 sd_get_mode()
|
||||
{
|
||||
return sd_mode;
|
||||
@@ -85,10 +114,15 @@ bool sd_initialize(bool power_cycle)
|
||||
sd_mode = SD_UHS_SDR82;
|
||||
break;
|
||||
}
|
||||
else if (sd_mode == SD_INIT_FAIL)
|
||||
break;
|
||||
else
|
||||
res = !sd_init_retry(true);
|
||||
{
|
||||
sd_errors[SD_ERROR_INIT_FAIL]++;
|
||||
|
||||
if (sd_mode == SD_INIT_FAIL)
|
||||
break;
|
||||
else
|
||||
res = !sd_init_retry(true);
|
||||
}
|
||||
}
|
||||
|
||||
sdmmc_storage_end(&sd_storage);
|
||||
@@ -130,9 +164,11 @@ bool sd_mount()
|
||||
return false;
|
||||
}
|
||||
|
||||
void sd_unmount()
|
||||
static void _sd_deinit()
|
||||
{
|
||||
sd_mode = SD_UHS_SDR82;
|
||||
if (sd_mode == SD_INIT_FAIL)
|
||||
sd_mode = SD_UHS_SDR82;
|
||||
|
||||
if (sd_mounted)
|
||||
{
|
||||
f_mount(NULL, "", 1);
|
||||
@@ -141,6 +177,9 @@ void sd_unmount()
|
||||
}
|
||||
}
|
||||
|
||||
void sd_unmount() { _sd_deinit(); }
|
||||
void sd_end() { _sd_deinit(); }
|
||||
|
||||
void *sd_file_read(const char *path, u32 *fsize)
|
||||
{
|
||||
FIL fp;
|
||||
|
||||
@@ -28,17 +28,29 @@ enum
|
||||
SD_1BIT_HS25 = 1,
|
||||
SD_4BIT_HS25 = 2,
|
||||
SD_UHS_SDR82 = 3,
|
||||
SD_UHS_SDR104 = 4
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
SD_ERROR_INIT_FAIL = 0,
|
||||
SD_ERROR_RW_FAIL = 1,
|
||||
SD_ERROR_RW_RETRY = 2
|
||||
};
|
||||
|
||||
extern sdmmc_t sd_sdmmc;
|
||||
extern sdmmc_storage_t sd_storage;
|
||||
extern FATFS sd_fs;
|
||||
|
||||
void sd_error_count_increment(u8 type);
|
||||
u16 *sd_get_error_count();
|
||||
bool sd_get_card_removed();
|
||||
u32 sd_get_mode();
|
||||
int sd_init_retry(bool power_cycle);
|
||||
bool sd_initialize(bool power_cycle);
|
||||
bool sd_mount();
|
||||
void sd_unmount();
|
||||
void sd_end();
|
||||
void *sd_file_read(const char *path, u32 *fsize);
|
||||
int sd_save_to_file(void *buf, u32 size, const char *filename);
|
||||
|
||||
|
||||
@@ -187,6 +187,8 @@ reinit_try:
|
||||
else
|
||||
retries--;
|
||||
|
||||
sd_error_count_increment(SD_ERROR_RW_RETRY);
|
||||
|
||||
msleep(50);
|
||||
} while (retries);
|
||||
|
||||
@@ -194,10 +196,17 @@ reinit_try:
|
||||
if (storage->sdmmc->id == SDMMC_1)
|
||||
{
|
||||
int res;
|
||||
|
||||
sd_error_count_increment(SD_ERROR_RW_FAIL);
|
||||
|
||||
if (!first_reinit)
|
||||
res = sd_initialize(true);
|
||||
else
|
||||
{
|
||||
res = sd_init_retry(true);
|
||||
if (!res)
|
||||
sd_error_count_increment(SD_ERROR_INIT_FAIL);
|
||||
}
|
||||
|
||||
retries = 3;
|
||||
first_reinit = true;
|
||||
|
||||
@@ -137,7 +137,7 @@ void reboot_normal()
|
||||
{
|
||||
bpmp_mmu_disable();
|
||||
|
||||
sd_unmount();
|
||||
sd_end();
|
||||
display_end();
|
||||
|
||||
nyx_str->mtc_cfg.init_done = 0;
|
||||
@@ -149,7 +149,7 @@ void reboot_rcm()
|
||||
{
|
||||
bpmp_mmu_disable();
|
||||
|
||||
sd_unmount();
|
||||
sd_end();
|
||||
display_end();
|
||||
|
||||
nyx_str->mtc_cfg.init_done = 0;
|
||||
@@ -163,7 +163,7 @@ void reboot_rcm()
|
||||
|
||||
void power_off()
|
||||
{
|
||||
sd_unmount();
|
||||
sd_end();
|
||||
display_end();
|
||||
|
||||
nyx_str->mtc_cfg.init_done = 0;
|
||||
|
||||
Reference in New Issue
Block a user