hekate/nyx: improve cyclomatic complexity

This commit is contained in:
CTCaer 2022-01-29 01:23:40 +02:00
parent 2f1d1572f7
commit aee5861f65
9 changed files with 1733 additions and 1701 deletions

View file

@ -192,8 +192,9 @@ int launch_payload(char *path, bool update, bool clear_screen)
gfx_clear_grey(0x1B);
gfx_con_setpos(0, 0);
if (sd_mount())
{
if (!sd_mount())
goto out;
FIL fp;
if (f_open(&fp, path, FA_READ))
{
@ -273,7 +274,6 @@ int launch_payload(char *path, bool update, bool clear_screen)
EMC(EMC_SCRATCH0) |= EMC_HEKA_UPD;
(*update_ptr)();
}
}
out:
if (!update)
@ -282,25 +282,6 @@ out:
return 1;
}
void auto_launch_update()
{
// Check if already chainloaded update and clear flag. Otherwise check for updates.
if (EMC(EMC_SCRATCH0) & EMC_HEKA_UPD)
EMC(EMC_SCRATCH0) &= ~EMC_HEKA_UPD;
else
{
// Check if update.bin exists and is newer and launch it. Otherwise create it.
if (!f_stat("bootloader/update.bin", NULL))
launch_payload("bootloader/update.bin", true, false);
else
{
u8 *buf = calloc(0x200, 1);
is_ipl_updated(buf, "bootloader/update.bin", true);
free(buf);
}
}
}
void launch_tools()
{
u8 max_entries = 61;
@ -313,10 +294,13 @@ void launch_tools()
gfx_clear_grey(0x1B);
gfx_con_setpos(0, 0);
if (sd_mount())
if (!sd_mount())
{
dir = (char *)malloc(256);
free(ments);
goto failed_sd_mount;
}
dir = (char *)malloc(256);
memcpy(dir, "bootloader/payloads", 20);
filelist = dirlist(dir, NULL, false, false);
@ -364,12 +348,6 @@ void launch_tools()
free(ments);
free(filelist);
}
else
{
free(ments);
goto out;
}
if (file_sec)
{
@ -380,7 +358,7 @@ void launch_tools()
EPRINTF("Failed to launch payload.");
}
out:
failed_sd_mount:
sd_end();
free(dir);
@ -399,10 +377,16 @@ void ini_list_launcher()
gfx_clear_grey(0x1B);
gfx_con_setpos(0, 0);
if (sd_mount())
{
if (ini_parse(&ini_list_sections, "bootloader/ini", true))
if (!sd_mount())
goto parse_failed;
// Check that ini files exist and parse them.
if (!ini_parse(&ini_list_sections, "bootloader/ini", true))
{
EPRINTF("Could not find any ini\nin bootloader/ini!");
goto parse_failed;
}
// Build configuration menu.
ment_t *ments = (ment_t *)malloc(sizeof(ment_t) * (max_entries + 3));
ments[0].type = MENT_BACK;
@ -413,11 +397,14 @@ void ini_list_launcher()
LIST_FOREACH_ENTRY(ini_sec_t, ini_sec, &ini_list_sections, link)
{
if (!strcmp(ini_sec->name, "config") ||
ini_sec->type == INI_COMMENT || ini_sec->type == INI_NEWLINE)
ini_sec->type == INI_COMMENT ||
ini_sec->type == INI_NEWLINE)
continue;
ments[i].type = ini_sec->type;
ments[i].caption = ini_sec->name;
ments[i].data = ini_sec;
if (ini_sec->type == MENT_CAPTION)
ments[i].color = ini_sec->color;
i++;
@ -425,6 +412,7 @@ void ini_list_launcher()
if ((i - 1) > max_entries)
break;
}
if (i > 2)
{
memset(&ments[i], 0, sizeof(ment_t));
@ -482,11 +470,8 @@ void ini_list_launcher()
else
EPRINTF("No extra configs found.");
free(ments);
}
else
EPRINTF("Could not find any ini\nin bootloader/ini!");
}
parse_failed:
if (!cfg_sec)
goto out;
@ -524,13 +509,19 @@ void launch_firmware()
gfx_clear_grey(0x1B);
gfx_con_setpos(0, 0);
if (sd_mount())
{
if (!sd_mount())
goto parse_failed;
// Load emuMMC configuration.
emummc_load_cfg();
if (ini_parse(&ini_sections, "bootloader/hekate_ipl.ini", false))
// Check that main configuration exists and parse it.
if (!ini_parse(&ini_sections, "bootloader/hekate_ipl.ini", false))
{
EPRINTF("Could not open 'bootloader/hekate_ipl.ini'!");
goto parse_failed;
}
// Build configuration menu.
ment_t *ments = (ment_t *)malloc(sizeof(ment_t) * (max_entries + 6));
ments[0].type = MENT_BACK;
@ -550,11 +541,14 @@ void launch_firmware()
LIST_FOREACH_ENTRY(ini_sec_t, ini_sec, &ini_sections, link)
{
if (!strcmp(ini_sec->name, "config") ||
ini_sec->type == INI_COMMENT || ini_sec->type == INI_NEWLINE)
ini_sec->type == INI_COMMENT ||
ini_sec->type == INI_NEWLINE)
continue;
ments[i].type = ini_sec->type;
ments[i].caption = ini_sec->name;
ments[i].data = ini_sec;
if (ini_sec->type == MENT_CAPTION)
ments[i].color = ini_sec->color;
i++;
@ -562,6 +556,7 @@ void launch_firmware()
if ((i - 4) > max_entries)
break;
}
if (i < 6)
{
ments[i].type = MENT_CAPTION;
@ -569,6 +564,7 @@ void launch_firmware()
ments[i].color = 0xFFFFDD00;
i++;
}
memset(&ments[i], 0, sizeof(ment_t));
menu_t menu = {
ments, "Launch configurations", 0, 0
@ -621,11 +617,8 @@ void launch_firmware()
}
free(ments);
}
else
EPRINTF("Could not open 'bootloader/hekate_ipl.ini'.\nMake sure it exists!");
}
parse_failed:
if (!cfg_sec)
{
gfx_printf("\nPress any key...\n");
@ -769,6 +762,25 @@ static void _bootloader_corruption_protect()
}
}
void auto_launch_update()
{
// Check if already chainloaded update and clear flag. Otherwise check for updates.
if (EMC(EMC_SCRATCH0) & EMC_HEKA_UPD)
EMC(EMC_SCRATCH0) &= ~EMC_HEKA_UPD;
else
{
// Check if update.bin exists and is newer and launch it. Otherwise create it.
if (!f_stat("bootloader/update.bin", NULL))
launch_payload("bootloader/update.bin", true, false);
else
{
u8 *buf = calloc(0x200, 1);
is_ipl_updated(buf, "bootloader/update.bin", true);
free(buf);
}
}
}
static void _auto_launch_firmware()
{
struct _bmp_data
@ -784,6 +796,8 @@ static void _auto_launch_firmware()
char *emummc_path = NULL;
char *bootlogoCustomEntry = NULL;
ini_sec_t *cfg_sec = NULL;
u32 boot_entry_id = 0;
bool config_entry_found = false;
auto_launch_update();
@ -803,10 +817,9 @@ static void _auto_launch_firmware()
if (f_stat("bootloader/hekate_ipl.ini", NULL))
create_config_entry();
if (ini_parse(&ini_sections, "bootloader/hekate_ipl.ini", false))
{
u32 configEntry = 0;
u32 boot_entry_id = 0;
// Parse hekate main configuration.
if (!ini_parse(&ini_sections, "bootloader/hekate_ipl.ini", false))
goto out; // Can't load hekate_ipl.ini.
// Load configuration.
LIST_FOREACH_ENTRY(ini_sec_t, ini_sec, &ini_sections, link)
@ -814,9 +827,9 @@ static void _auto_launch_firmware()
// Skip other ini entries for autoboot.
if (ini_sec->type == INI_CHOICE)
{
if (!strcmp(ini_sec->name, "config"))
if (!config_entry_found && !strcmp(ini_sec->name, "config"))
{
configEntry = 1;
config_entry_found = true;
LIST_FOREACH_ENTRY(ini_kv_t, kv, &ini_sec->kvs, link)
{
if (!strcmp("autoboot", kv->key))
@ -863,7 +876,7 @@ static void _auto_launch_firmware()
if (boot_from_id)
cfg_sec = get_ini_sec_from_id(ini_sec, &bootlogoCustomEntry, &emummc_path);
else if (h_cfg.autoboot == boot_entry_id && configEntry)
else if (h_cfg.autoboot == boot_entry_id && config_entry_found)
{
cfg_sec = ini_sec;
LIST_FOREACH_ENTRY(ini_kv_t, kv, &cfg_sec->kvs, link)
@ -894,12 +907,14 @@ static void _auto_launch_firmware()
boot_entry_id = 1;
bootlogoCustomEntry = NULL;
if (ini_parse(&ini_list_sections, "bootloader/ini", true))
{
if (!ini_parse(&ini_list_sections, "bootloader/ini", true))
goto skip_list;
LIST_FOREACH_ENTRY(ini_sec_t, ini_sec_list, &ini_list_sections, link)
{
if (ini_sec_list->type == INI_CHOICE)
{
if (ini_sec_list->type != INI_CHOICE)
continue;
if (!strcmp(ini_sec_list->name, "config"))
continue;
@ -925,19 +940,13 @@ static void _auto_launch_firmware()
}
}
}
}
skip_list:
// Add missing configuration entry.
if (!configEntry)
if (!config_entry_found)
create_config_entry();
if (!cfg_sec)
goto out; // No configurations or auto boot is disabled.
}
else
goto out; // Can't load hekate_ipl.ini.
u8 *bitmap = NULL;
struct _bmp_data bmpData;

View file

@ -950,8 +950,9 @@ static int _restore_emmc_part(emmc_tool_gui_t *gui, char *sd_path, int active_pa
bool use_multipart = false;
bool check_4MB_aligned = true;
if (allow_multi_part)
{
if (!allow_multi_part)
goto multipart_not_allowed;
// Check to see if there is a combined file and if so then use that.
if (f_stat(outFilename, &fno))
{
@ -1066,8 +1067,8 @@ static int _restore_emmc_part(emmc_tool_gui_t *gui, char *sd_path, int active_pa
use_multipart = true;
_update_filename(outFilename, sdPathLen, 0);
}
}
multipart_not_allowed:
res = f_open(&fp, outFilename, FA_READ);
if (use_multipart)
{

View file

@ -42,8 +42,9 @@ void load_emummc_cfg(emummc_cfg_t *emu_info)
// Parse emuMMC configuration.
LIST_INIT(ini_sections);
if (ini_parse(&ini_sections, "emuMMC/emummc.ini", false))
{
if (!ini_parse(&ini_sections, "emuMMC/emummc.ini", false))
return;
LIST_FOREACH_ENTRY(ini_sec_t, ini_sec, &ini_sections, link)
{
if (!strcmp(ini_sec->name, "emummc"))
@ -61,7 +62,8 @@ void load_emummc_cfg(emummc_cfg_t *emu_info)
else if (!strcmp("nintendo_path", kv->key))
emu_info->nintendo_path = kv->val;
}
}
break;
}
}
}
@ -262,6 +264,7 @@ static int _dump_emummc_file_part(emmc_tool_gui_t *gui, char *sd_path, sdmmc_sto
retryCount = 0;
num = MIN(totalSectors, NUM_SECTORS_PER_ITER);
while (!sdmmc_storage_read(storage, lba_curr, num, buf))
{
s_printf(gui->txt_buf,
@ -405,6 +408,7 @@ void dump_emummc_file(emmc_tool_gui_t *gui)
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");
@ -448,7 +452,7 @@ void dump_emummc_file(emmc_tool_gui_t *gui)
rawPart.lba_start = 0;
rawPart.lba_end = RAW_AREA_NUM_SECTORS - 1;
strcpy(rawPart.name, "GPP");
{
s_printf(txt_buf, "#00DDFF %02d: %s#\n#00DDFF Range: 0x%08X - 0x%08X#\n\n",
i, rawPart.name, rawPart.lba_start, rawPart.lba_end);
lv_label_set_text(gui->label_info, txt_buf);
@ -465,7 +469,6 @@ void dump_emummc_file(emmc_tool_gui_t *gui)
lv_label_ins_text(gui->label_log, LV_LABEL_POS_LAST, txt_buf);
manual_system_maintenance(true);
}
out_failed:
timer = get_tmr_s() - timer;

View file

@ -1608,8 +1608,9 @@ static lv_res_t _create_window_home_launch(lv_obj_t *btn)
u32 curr_btn_idx = 0; // Active buttons.
LIST_INIT(ini_sections);
if (sd_mount())
{
if (!sd_mount())
goto failed_sd_mount;
// Check if we use custom system icons.
bool icon_sw_custom = !f_stat("bootloader/res/icon_switch_custom.bmp", NULL);
bool icon_pl_custom = !f_stat("bootloader/res/icon_payload_custom.bmp", NULL);
@ -1631,11 +1632,11 @@ ini_parsing:
more_cfg = true;
}
if (ini_parse_success)
{
if (!ini_parse_success)
goto ini_parse_failed;
// Iterate to all boot entries and load icons.
u32 entry_idx = 1;
LIST_FOREACH_ENTRY(ini_sec_t, ini_sec, &ini_sections, link)
{
if (!strcmp(ini_sec->name, "config") || (ini_sec->type != INI_CHOICE))
@ -1745,12 +1746,13 @@ ini_parsing:
if (curr_btn_idx >= max_entries)
break;
}
}
ini_parse_failed:
// Reiterate the loop with more cfgs if combined.
if (combined_cfg && (curr_btn_idx < 8) && !more_cfg)
goto ini_parsing;
}
failed_sd_mount:
if (curr_btn_idx < 1)
no_boot_entries = true;

View file

@ -782,8 +782,10 @@ static lv_res_t _create_mbox_emummc_migrate(lv_obj_t *btn)
for (int i = 1; i < 4; i++)
{
mbr_ctx.sector_start = mbr->partitions[i].start_sct;
if (mbr_ctx.sector_start)
{
if (!mbr_ctx.sector_start)
continue;
sdmmc_storage_read(&sd_storage, mbr_ctx.sector_start + 0xC001, 1, efi_part);
if (!memcmp(efi_part, "EFI PART", 8))
{
@ -803,7 +805,6 @@ static lv_res_t _create_mbox_emummc_migrate(lv_obj_t *btn)
}
}
}
}
if (!mbr_ctx.part_idx)
{

View file

@ -1329,9 +1329,11 @@ static lv_res_t _create_mbox_benchmark(bool sd_bench)
}
if (res)
lv_mbox_set_text(mbox, "#FFDD00 Failed to init Storage!#");
else
{
lv_mbox_set_text(mbox, "#FFDD00 Failed to init Storage!#");
goto out;
}
int error = 0;
u32 iters = 3;
u32 offset_chunk_start = ALIGN_DOWN(storage->sec_cnt / 3, 0x8000); // Align to 16MB.
@ -1516,7 +1518,8 @@ error:
sd_unmount();
else
sdmmc_storage_end(&emmc_storage);
}
out:
free(txt_buf);
lv_mbox_add_btns(mbox, mbox_btn_map, mbox_action); // Important. After set_text.
@ -1559,9 +1562,10 @@ static lv_res_t _create_window_emmc_info_status(lv_obj_t *btn)
{
lv_label_set_text(lb_desc, "#FFDD00 Failed to init eMMC!#");
lv_obj_set_width(lb_desc, lv_obj_get_width(desc));
goto out;
}
else
{
u32 speed = 0;
char *rsvd_blocks;
char life_a_txt[8];
@ -1784,8 +1788,8 @@ static lv_res_t _create_window_emmc_info_status(lv_obj_t *btn)
lv_obj_align(mbox, NULL, LV_ALIGN_CENTER, 0, 0);
lv_obj_set_top(mbox, true);
}
}
out:
sdmmc_storage_end(&emmc_storage);
free(txt_buf);

View file

@ -993,8 +993,9 @@ static lv_res_t _create_mbox_fix_touchscreen(lv_obj_t *btn)
}
u8 err[2];
if (touch_panel_ito_test(err))
{
if (!touch_panel_ito_test(err))
goto ito_failed;
if (!err[0] && !err[1])
{
res = touch_execute_autotune();
@ -1051,8 +1052,8 @@ static lv_res_t _create_mbox_fix_touchscreen(lv_obj_t *btn)
lv_mbox_set_text(mbox, txt_buf);
goto out2;
}
}
ito_failed:
touch_sense_enable();
out:

View file

@ -540,9 +540,10 @@ static lv_res_t _action_flash_linux_data(lv_obj_t * btns, const char * txt)
bool succeeded = false;
if (btn_idx)
return LV_RES_INV;
// Flash Linux.
if (!btn_idx)
{
lv_obj_t *dark_bg = lv_obj_create(lv_scr_act(), NULL);
lv_obj_set_style(dark_bg, &mbox_darken);
lv_obj_set_size(dark_bg, LV_HOR_RES, LV_VER_RES);
@ -716,7 +717,6 @@ exit:
lv_obj_align(mbox, NULL, LV_ALIGN_CENTER, 0, 0);
sd_unmount();
}
return LV_RES_INV;
}
@ -856,8 +856,9 @@ static lv_res_t _action_check_flash_linux(lv_obj_t *btn)
itoa(idx, &path[23], 10);
// Check for alignment.
if (!f_stat(path, &fno))
{
if (f_stat(path, &fno))
break;
if ((u64)fno.fsize % SZ_4M)
{
// Check if last part.
@ -882,9 +883,6 @@ static lv_res_t _action_check_flash_linux(lv_obj_t *btn)
idx--;
}
l4t_flash_ctxt.image_size_sct += (u64)fno.fsize >> 9;
}
else
break;
idx++;
}
@ -950,9 +948,10 @@ static lv_res_t _action_flash_android_data(lv_obj_t * btns, const char * txt)
// Delete parent mbox.
mbox_action(btns, txt);
if (btn_idx)
return LV_RES_INV;
// Flash Android components.
if (!btn_idx)
{
char path[128];
gpt_t *gpt = calloc(1, sizeof(gpt_t));
char *txt_buf = malloc(SZ_4K);
@ -990,11 +989,16 @@ static lv_res_t _action_flash_android_data(lv_obj_t * btns, const char * txt)
goto error;
}
strcpy(path, "switchroot/install/boot.img");
if (!f_stat(path, NULL))
{
u32 offset_sct = 0;
u32 size_sct = 0;
strcpy(path, "switchroot/install/boot.img");
if (f_stat(path, NULL))
{
s_printf(txt_buf, "#FF8000 Warning:# Kernel image not found!\n");
goto boot_img_not_found;
}
for (u32 i = 0; i < gpt->header.num_part_ents; i++)
{
if (!memcmp(gpt->entries[i].name, (char[]) { 'L', 0, 'N', 0, 'X', 0 }, 6))
@ -1036,18 +1040,20 @@ static lv_res_t _action_flash_android_data(lv_obj_t * btns, const char * txt)
}
else
s_printf(txt_buf, "#FF8000 Warning:# Kernel partition not found!\n");
}
else
s_printf(txt_buf, "#FF8000 Warning:# Kernel image not found!\n");
boot_img_not_found:
lv_label_set_text(lbl_status, txt_buf);
manual_system_maintenance(true);
strcpy(path, "switchroot/install/twrp.img");
if (!f_stat(path, NULL))
if (f_stat(path, NULL))
{
u32 offset_sct = 0;
u32 size_sct = 0;
strcat(txt_buf, "#FF8000 Warning:# TWRP image not found!\n");
goto twrp_not_found;
}
offset_sct = 0;
size_sct = 0;
for (u32 i = 0; i < gpt->header.num_part_ents; i++)
{
if (!memcmp(gpt->entries[i].name, (char[]) { 'S', 0, 'O', 0, 'S', 0 }, 6))
@ -1088,18 +1094,21 @@ static lv_res_t _action_flash_android_data(lv_obj_t * btns, const char * txt)
}
else
strcat(txt_buf, "#FF8000 Warning:# TWRP partition not found!\n");
}
else
strcat(txt_buf, "#FF8000 Warning:# TWRP image not found!\n");
twrp_not_found:
lv_label_set_text(lbl_status, txt_buf);
manual_system_maintenance(true);
strcpy(path, "switchroot/install/tegra210-icosa.dtb");
if (!f_stat(path, NULL))
if (f_stat(path, NULL))
{
u32 offset_sct = 0;
u32 size_sct = 0;
strcat(txt_buf, "#FF8000 Warning:# DTB image not found!");
goto dtb_not_found;
}
offset_sct = 0;
size_sct = 0;
for (u32 i = 0; i < gpt->header.num_part_ents; i++)
{
if (!memcmp(gpt->entries[i].name, (char[]) { 'D', 0, 'T', 0, 'B', 0 }, 6))
@ -1140,10 +1149,8 @@ static lv_res_t _action_flash_android_data(lv_obj_t * btns, const char * txt)
}
else
strcat(txt_buf, "#FF8000 Warning:# DTB partition not found!");
}
else
strcat(txt_buf, "#FF8000 Warning:# DTB image not found!");
dtb_not_found:
lv_label_set_text(lbl_status, txt_buf);
// Check if TWRP is flashed unconditionally.
@ -1179,7 +1186,6 @@ error:
free(gpt);
sd_unmount();
}
return LV_RES_INV;
}
@ -1409,8 +1415,10 @@ static lv_res_t _create_mbox_start_partitioning(lv_obj_t *btn)
u32 cluster_size = 65536;
u32 mkfs_error = f_mkfs("sd:", FM_FAT32, cluster_size, buf, SZ_4M);
if (mkfs_error)
{
if (!mkfs_error)
goto mkfs_no_error;
// Retry by halving cluster size.
while (cluster_size > 4096)
{
@ -1451,12 +1459,14 @@ static lv_res_t _create_mbox_start_partitioning(lv_obj_t *btn)
free(buf);
goto error;
}
lv_label_set_text(lbl_status, "#00DDFF Status:# Restored files but the operation failed!");
f_mount(NULL, "ram:", 1); // Unmount ramdisk.
free(buf);
goto error;
}
}
mkfs_no_error:
free(buf);
f_mount(&sd_fs, "sd:", 1); // Mount SD card.

View file

@ -138,8 +138,9 @@ lv_res_t launch_payload(lv_obj_t *list)
strcpy(path,"bootloader/payloads/");
strcat(path, filename);
if (sd_mount())
{
if (!sd_mount())
goto out;
FIL fp;
if (f_open(&fp, path, FA_READ))
{
@ -197,7 +198,6 @@ lv_res_t launch_payload(lv_obj_t *list)
// Launch our payload.
(*ext_payload_ptr)();
}
out:
sd_unmount();
@ -210,9 +210,10 @@ void load_saved_configuration()
LIST_INIT(ini_sections);
LIST_INIT(ini_nyx_sections);
if (!ini_parse(&ini_sections, "bootloader/hekate_ipl.ini", false))
goto skip_main_cfg_parse;
// Load hekate configuration.
if (ini_parse(&ini_sections, "bootloader/hekate_ipl.ini", false))
{
LIST_FOREACH_ENTRY(ini_sec_t, ini_sec, &ini_sections, link)
{
// Only parse config section.
@ -245,11 +246,12 @@ void load_saved_configuration()
break;
}
}
}
skip_main_cfg_parse:
if (!ini_parse(&ini_nyx_sections, "bootloader/nyx.ini", false))
return;
// Load Nyx configuration.
if (ini_parse(&ini_nyx_sections, "bootloader/nyx.ini", false))
{
LIST_FOREACH_ENTRY(ini_sec_t, ini_sec, &ini_nyx_sections, link)
{
// Only parse config section.
@ -277,7 +279,6 @@ void load_saved_configuration()
}
}
}
}
#define EXCP_EN_ADDR 0x4003FFFC
#define EXCP_MAGIC 0x30505645 // EVP0