From 4564db0b6d21e4f4c55ab4fa35eaf4bb6a7a5b30 Mon Sep 17 00:00:00 2001 From: CTCaer Date: Sun, 14 Jun 2020 13:49:03 +0300 Subject: [PATCH] exo: Support new fw versioning --- bootloader/hos/fss.c | 1 + bootloader/hos/hos.h | 1 + bootloader/hos/secmon_exo.c | 48 ++++++++++++++++++++++++++++++++++++- 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/bootloader/hos/fss.c b/bootloader/hos/fss.c index b359880..eb17b39 100644 --- a/bootloader/hos/fss.c +++ b/bootloader/hos/fss.c @@ -148,6 +148,7 @@ int parse_fss(launch_ctxt_t *ctxt, const char *path, fss0_sept_t *sept_ctxt) if (!sept_ctxt) { ctxt->atmosphere = true; + ctxt->fss0_ver = fss_meta->version; ctxt->fss0_hosver = fss_meta->hos_ver; } diff --git a/bootloader/hos/hos.h b/bootloader/hos/hos.h index 82e8381..2e60145 100644 --- a/bootloader/hos/hos.h +++ b/bootloader/hos/hos.h @@ -99,6 +99,7 @@ typedef struct _launch_ctxt_t link_t kip1_list; char* kip1_patches; + u32 fss0_ver; u32 fss0_hosver; bool svcperm; bool debugmode; diff --git a/bootloader/hos/secmon_exo.c b/bootloader/hos/secmon_exo.c index e66d0dc..80ac2bc 100644 --- a/bootloader/hos/secmon_exo.c +++ b/bootloader/hos/secmon_exo.c @@ -138,6 +138,8 @@ typedef struct _atm_fatal_error_ctx #define EXO_FLAG_CAL0_BLANKING (1 << 5) #define EXO_FLAG_CAL0_WRITES_SYS (1 << 6) +#define EXO_FW_VER(mj, mn, rv) (((mj) << 24) | ((mn) << 16) | ((rv) << 8)) + void config_exosphere(launch_ctxt_t *ctxt) { u32 exoFwNo = 0; @@ -151,6 +153,7 @@ void config_exosphere(launch_ctxt_t *ctxt) volatile exo_cfg_t *exo_cfg = (exo_cfg_t *)EXO_CFG_ADDR; + // Old exosphere target versioning. switch (kb) { case KB_FIRMWARE_VERSION_100_200: @@ -171,9 +174,52 @@ void config_exosphere(launch_ctxt_t *ctxt) break; } + // New exosphere target versioning. + if (!ctxt->fss0_ver || ((ctxt->fss0_ver >> 8) > 0xC00)) // 0.12.0. + { + // Feed old versioning. + switch (exoFwNo) + { + case 1: + case 2: + case 3: + case 4: + case 6: + exoFwNo = EXO_FW_VER(exoFwNo, 0, 0); + break; + case 5: + if (!ctxt->exo_ctx.fs_is_510) + exoFwNo = EXO_FW_VER(5, 0, 0); + else + exoFwNo = EXO_FW_VER(5, 1, 0); + break; + case 7: + exoFwNo = EXO_FW_VER(6, 2, 0); + break; + case 8: + exoFwNo = EXO_FW_VER(7, 0, 0); + break; + case 9: + exoFwNo = EXO_FW_VER(8, 0, 0); + break; + case 10: + exoFwNo = EXO_FW_VER(8, 1, 0); + break; + case 11: + exoFwNo = EXO_FW_VER(9, 0, 0); + break; + case 12: + exoFwNo = EXO_FW_VER(9, 1, 0); + break; + case 13: + exoFwNo = EXO_FW_VER(10, 0, 0); + break; + } + } + + // Parse exosphere.ini. if (!ctxt->stock) { - // Parse exosphere.ini. LIST_INIT(ini_sections); if (ini_parse(&ini_sections, "exosphere.ini", false)) {