From 14c50ed7f8d8ee36a47d7268a653868d3109bd37 Mon Sep 17 00:00:00 2001 From: Kostas Missos Date: Sat, 9 Mar 2019 20:49:00 +0200 Subject: [PATCH] [Stock] Add cleaner stock [Stock] fss0={sd path} stock=1 Can now work for both older and new HOS versions. - <= 6.2.0 loads nothing and removes kernel patching. - >= 7.0.0 loads exo, wb and removes kernel patching. This requires that fss0 {sd path} is valid. Otherwise it will fail on ini cfg parsing. If <= 6.2.0 and no FSS0 [Stock] stock=1 will provide a cleaner stock with no kernel patching. --- README.md | 1 + bootloader/hos/fss.c | 19 ++++++++++++++++++- bootloader/hos/hos.c | 19 ++++++++++++------- bootloader/hos/hos.h | 3 +++ bootloader/hos/hos_config.c | 15 +++++++++++++-- bootloader/hos/hos_config.h | 2 +- bootloader/hos/secmon_exo.c | 7 ++++--- bootloader/hos/secmon_exo.h | 2 +- 8 files changed, 53 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 964cda4..0575bbb 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,7 @@ There are four possible type of entries. "**[ ]**": Boot entry, "**{ }**": Capti | fullsvcperm=1 | Disables SVC verification (full services permission) | | debugmode=1 | Enables Debug mode. Obsolete when used with exosphere as secmon. | | atmosphere=1 | Enables Atmosphère patching | +| stock=1 | Disables unneeded kernel patching when running stock or semi-stock. | | payload={SD path} | Payload launching. Tools, Linux, CFW bootloaders, etc. | **Note1**: When using the wildcard (`/*`) with `kip1` you can still use the normal `kip1` after that to load extra signle kips. diff --git a/bootloader/hos/fss.c b/bootloader/hos/fss.c index 149e90b..9660f0f 100644 --- a/bootloader/hos/fss.c +++ b/bootloader/hos/fss.c @@ -60,9 +60,24 @@ typedef struct _fss_content_t int parse_fss(launch_ctxt_t *ctxt, const char *value) { FIL fp; + + bool stock = false; + + LIST_FOREACH_ENTRY(ini_kv_t, kv, &ctxt->cfg->kvs, link) + { + if (!strcmp("stock", kv->key)) + if (kv->val[0] == '1') + stock = true; + } + + if (stock && ctxt->pkg1_id->kb <= KB_FIRMWARE_VERSION_620) + return 1; + if (f_open(&fp, value, FA_READ) != FR_OK) return 0; + ctxt->atmosphere = true; + void *fss = malloc(f_size(&fp)); // Read header. f_read(&fp, fss, 0x400, NULL); @@ -89,7 +104,9 @@ int parse_fss(launch_ctxt_t *ctxt, const char *value) // Load content to launch context. switch (curr_fss_cnt[i].type) { - case CNT_TYPE_KIP:; + case CNT_TYPE_KIP: + if (stock) + continue; merge_kip_t *mkip1 = (merge_kip_t *)malloc(sizeof(merge_kip_t)); mkip1->kip1 = content; list_append(&ctxt->kip1_list, &mkip1->link); diff --git a/bootloader/hos/hos.c b/bootloader/hos/hos.c index ea122fe..ada8a94 100644 --- a/bootloader/hos/hos.c +++ b/bootloader/hos/hos.c @@ -369,6 +369,7 @@ out:; static void _free_launch_components(launch_ctxt_t *ctxt) { + ini_free_section(ctxt->cfg); free(ctxt->keyblob); free(ctxt->pkg1); free(ctxt->pkg2); @@ -388,20 +389,25 @@ int hos_launch(ini_sec_t *cfg) memset(&tsec_ctxt, 0, sizeof(tsec_ctxt_t)); list_init(&ctxt.kip1_list); + ctxt.cfg = cfg; + if (!gfx_con.mute) gfx_clear_grey(&gfx_ctxt, 0x1B); gfx_con_setpos(&gfx_con, 0, 0); - // Try to parse config if present. - if (cfg && !parse_boot_config(&ctxt, cfg)) - return 0; - gfx_printf(&gfx_con, "Initializing...\n\n"); // Read package1 and the correct keyblob. if (!_read_emmc_pkg1(&ctxt)) return 0; + // Try to parse config if present. + if (ctxt.cfg && !parse_boot_config(&ctxt)) + { + EPRINTF("Wrong ini cfg or missing files!"); + return 0; + } + // Check if fuses lower than 4.0.0 and if yes apply NO Gamecard patch. if (h_cfg.autonogc && !(fuse_read_odm(7) & ~0xF) && ctxt.pkg1_id->kb >= KB_FIRMWARE_VERSION_400) config_kip1patch(&ctxt, "nogc"); @@ -507,7 +513,7 @@ int hos_launch(ini_sec_t *cfg) ctxt.kernel = pkg2_hdr->data; ctxt.kernel_size = pkg2_hdr->sec_size[PKG2_SEC_KERNEL]; - if (ctxt.svcperm || ctxt.debugmode || ctxt.atmosphere) + if (!ctxt.stock && (ctxt.svcperm || ctxt.debugmode || ctxt.atmosphere)) { u32 kernel_crc32 = crc32c(ctxt.kernel, ctxt.kernel_size); ctxt.pkg2_kernel_id = pkg2_identify(kernel_crc32); @@ -610,7 +616,7 @@ int hos_launch(ini_sec_t *cfg) // Config Exosphère if booting full Atmosphère. if (ctxt.atmosphere && ctxt.secmon) - config_exosphere(ctxt.pkg1_id->id, ctxt.pkg1_id->kb, (void *)ctxt.pkg1_id->warmboot_base, ctxt.pkg1); + config_exosphere(ctxt.pkg1_id->id, ctxt.pkg1_id->kb, (void *)ctxt.pkg1_id->warmboot_base, ctxt.pkg1, ctxt.stock); // Unmount SD card. sd_unmount(); @@ -640,7 +646,6 @@ int hos_launch(ini_sec_t *cfg) secmon_mb->out = 0; // Free allocated memory. - ini_free_section(cfg); _free_launch_components(&ctxt); // Disable display. This must be executed before secmon to provide support for all fw versions. diff --git a/bootloader/hos/hos.h b/bootloader/hos/hos.h index 58a116b..0062c6c 100644 --- a/bootloader/hos/hos.h +++ b/bootloader/hos/hos.h @@ -58,7 +58,10 @@ typedef struct _launch_ctxt_t bool svcperm; bool debugmode; + bool stock; bool atmosphere; + + ini_sec_t *cfg; } launch_ctxt_t; typedef struct _merge_kip_t diff --git a/bootloader/hos/hos_config.c b/bootloader/hos/hos_config.c index 5099577..1f40981 100644 --- a/bootloader/hos/hos_config.c +++ b/bootloader/hos/hos_config.c @@ -176,6 +176,16 @@ static int _config_debugmode(launch_ctxt_t *ctxt, const char *value) return 1; } +static int _config_stock(launch_ctxt_t *ctxt, const char *value) +{ + if (*value == '1') + { + DPRINTF("Disabled all patching\n"); + ctxt->stock = true; + } + return 1; +} + static int _config_atmosphere(launch_ctxt_t *ctxt, const char *value) { if (*value == '1') @@ -205,14 +215,15 @@ static const cfg_handler_t _config_handlers[] = { { "kip1patch", config_kip1patch }, { "fullsvcperm", _config_svcperm }, { "debugmode", _config_debugmode }, + { "stock", _config_stock }, { "atmosphere", _config_atmosphere }, { "fss0", _config_fss }, { NULL, NULL }, }; -int parse_boot_config(launch_ctxt_t *ctxt, ini_sec_t *cfg) +int parse_boot_config(launch_ctxt_t *ctxt) { - LIST_FOREACH_ENTRY(ini_kv_t, kv, &cfg->kvs, link) + LIST_FOREACH_ENTRY(ini_kv_t, kv, &ctxt->cfg->kvs, link) { for(u32 i = 0; _config_handlers[i].key; i++) { diff --git a/bootloader/hos/hos_config.h b/bootloader/hos/hos_config.h index 76c8156..f835302 100644 --- a/bootloader/hos/hos_config.h +++ b/bootloader/hos/hos_config.h @@ -19,7 +19,7 @@ #include "hos.h" -int parse_boot_config(launch_ctxt_t *ctxt, ini_sec_t *cfg); +int parse_boot_config(launch_ctxt_t *ctxt); int config_kip1patch(launch_ctxt_t *ctxt, const char *value); #endif diff --git a/bootloader/hos/secmon_exo.c b/bootloader/hos/secmon_exo.c index 33b6450..0372864 100644 --- a/bootloader/hos/secmon_exo.c +++ b/bootloader/hos/secmon_exo.c @@ -48,7 +48,7 @@ typedef struct _atm_meta_t #define EXO_FLAG_DBG_PRIV (1 << 1) #define EXO_FLAG_DBG_USER (1 << 2) -void config_exosphere(const char *id, u32 kb, void *warmboot, void *pkg1) +void config_exosphere(const char *id, u32 kb, void *warmboot, void *pkg1, bool stock) { u32 exoFwNo = 0; u32 exoFlags = 0; @@ -75,8 +75,9 @@ void config_exosphere(const char *id, u32 kb, void *warmboot, void *pkg1) if (kb == KB_FIRMWARE_VERSION_620) exoFlags |= EXO_FLAG_620_KGN; - // To avoid problems, make private debug mode always on. - exoFlags |= EXO_FLAG_DBG_PRIV; + // To avoid problems, make private debug mode always on if not semi-stock. + if (!stock) + exoFlags |= EXO_FLAG_DBG_PRIV; // Set mailbox values. exo_cfg_depr->magic = EXO_MAGIC_VAL; diff --git a/bootloader/hos/secmon_exo.h b/bootloader/hos/secmon_exo.h index 1a619c2..d4e529b 100644 --- a/bootloader/hos/secmon_exo.h +++ b/bootloader/hos/secmon_exo.h @@ -19,6 +19,6 @@ #include "../utils/types.h" -void config_exosphere(const char *id, u32 kb, void *warmboot, void *pkg1); +void config_exosphere(const char *id, u32 kb, void *warmboot, void *pkg1, bool stock); #endif