From 31db2735cece43e0be80fa92fef46873dcd98284 Mon Sep 17 00:00:00 2001 From: CTCaer Date: Fri, 16 Aug 2019 22:00:32 +0300 Subject: [PATCH] autoboot: Add forced boot from ID By using the key `id=` with a max 7 ASCII id, hekate will search all inis automatically and pinpoint the boot entry with that id. After that it forces a boot from this one. --- bootloader/main.c | 52 ++++++++++++++++++++++++++++++++++------ bootloader/utils/types.h | 18 ++++++++++---- 2 files changed, 58 insertions(+), 12 deletions(-) diff --git a/bootloader/main.c b/bootloader/main.c index df12532..758ef3d 100644 --- a/bootloader/main.c +++ b/bootloader/main.c @@ -727,6 +727,29 @@ void nyx_load_run() (*nyx_ptr)(); } +static ini_sec_t *get_ini_sec_from_id(ini_sec_t *ini_sec, char *bootlogoCustomEntry) +{ + ini_sec_t *cfg_sec = NULL; + + LIST_FOREACH_ENTRY(ini_kv_t, kv, &ini_sec->kvs, link) + { + if (!strcmp("id", kv->key)) + if (!strcmp(b_cfg.id, kv->val)) + cfg_sec = ini_sec; + if (!strcmp("logopath", kv->key)) + bootlogoCustomEntry = kv->val; + if (!strcmp("emummc_force_disable", kv->key)) + h_cfg.emummc_force_disable = atoi(kv->val); + } + if (!cfg_sec) + { + bootlogoCustomEntry = NULL; + h_cfg.emummc_force_disable = false; + } + + return cfg_sec; +} + void auto_launch_firmware() { if(b_cfg.extra_cfg & EXTRA_CFG_NYX_DUMP) @@ -742,6 +765,9 @@ void auto_launch_firmware() u8 *BOOTLOGO = NULL; char *payload_path = NULL; u32 btn = 0; + bool boot_from_id = (b_cfg.boot_cfg & BOOT_CFG_FROM_ID) && (b_cfg.boot_cfg & BOOT_CFG_AUTOBOOT_EN); + if (boot_from_id) + b_cfg.id[7] = 0; struct _bmp_data { @@ -827,7 +853,9 @@ void auto_launch_firmware() continue; } - if (h_cfg.autoboot == boot_entry_id && configEntry) + if (boot_from_id) + cfg_sec = get_ini_sec_from_id(ini_sec, bootlogoCustomEntry); + else if (h_cfg.autoboot == boot_entry_id && configEntry) { cfg_sec = ini_sec; LIST_FOREACH_ENTRY(ini_kv_t, kv, &cfg_sec->kvs, link) @@ -837,8 +865,9 @@ void auto_launch_firmware() if (!strcmp("emummc_force_disable", kv->key)) h_cfg.emummc_force_disable = atoi(kv->val); } - break; } + if (cfg_sec) + break; boot_entry_id++; } } @@ -846,8 +875,11 @@ void auto_launch_firmware() if (h_cfg.autohosoff && !(b_cfg.boot_cfg & BOOT_CFG_AUTOBOOT_EN)) check_power_off_from_hos(); - if (h_cfg.autoboot_list) + if (h_cfg.autoboot_list || (boot_from_id && !cfg_sec)) { + if (boot_from_id && cfg_sec) + goto skip_list; + boot_entry_id = 1; bootlogoCustomEntry = NULL; @@ -860,7 +892,9 @@ void auto_launch_firmware() if (!strcmp(ini_sec_list->name, "config")) continue; - if (h_cfg.autoboot == boot_entry_id) + if (boot_from_id) + cfg_sec = get_ini_sec_from_id(ini_sec_list, bootlogoCustomEntry); + else if (h_cfg.autoboot == boot_entry_id) { h_cfg.emummc_force_disable = false; cfg_sec = ini_sec_list; @@ -871,8 +905,9 @@ void auto_launch_firmware() if (!strcmp("emummc_force_disable", kv->key)) h_cfg.emummc_force_disable = atoi(kv->val); } - break; } + if (cfg_sec) + break; boot_entry_id++; } @@ -881,7 +916,7 @@ void auto_launch_firmware() } } - +skip_list: // Add missing configuration entry. if (!configEntry) create_config_entry(); @@ -991,7 +1026,10 @@ void auto_launch_firmware() out: gfx_con.mute = false; - b_cfg.boot_cfg &= ~(BOOT_CFG_AUTOBOOT_EN | BOOT_CFG_FROM_LAUNCH); + // Clear boot reasons from binary. + if (b_cfg.boot_cfg & BOOT_CFG_FROM_ID) + memset(b_cfg.xt_str, 0, sizeof(b_cfg.xt_str)); + b_cfg.boot_cfg &= ~(BOOT_CFG_AUTOBOOT_EN | BOOT_CFG_FROM_LAUNCH | BOOT_CFG_FROM_ID); h_cfg.emummc_force_disable = false; nyx_load_run(); diff --git a/bootloader/utils/types.h b/bootloader/utils/types.h index bbddae0..577f24f 100644 --- a/bootloader/utils/types.h +++ b/bootloader/utils/types.h @@ -53,6 +53,7 @@ typedef int bool; #define BOOT_CFG_AUTOBOOT_EN (1 << 0) #define BOOT_CFG_FROM_LAUNCH (1 << 1) +#define BOOT_CFG_FROM_ID (1 << 2) #define BOOT_CFG_SEPT_RUN (1 << 7) #define EXTRA_CFG_KEYS (1 << 0) @@ -64,11 +65,18 @@ typedef int bool; typedef struct __attribute__((__packed__)) _boot_cfg_t { - u8 boot_cfg; - u8 autoboot; - u8 autoboot_list; - u8 extra_cfg; - u8 rsvd[128]; + u8 boot_cfg; + u8 autoboot; + u8 autoboot_list; + u8 extra_cfg; + union + { + struct + { + char id[8]; + }; + u8 xt_str[0x80]; + }; } boot_cfg_t; typedef struct __attribute__((__packed__)) _ipl_ver_meta_t