From 12f8f055eb94429ebd15395812d663b807fe2579 Mon Sep 17 00:00:00 2001 From: "ctcaer@gmail.com" Date: Sun, 30 Jun 2019 03:29:46 +0300 Subject: [PATCH] [HOS] Add 8.1.0 support --- bootloader/frontend/fe_info.c | 4 +++- bootloader/frontend/fe_tools.c | 2 +- bootloader/hos/fss.c | 1 + bootloader/hos/hos.c | 4 +++- bootloader/hos/hos.h | 3 ++- bootloader/hos/pkg1.c | 1 + bootloader/hos/pkg2.c | 26 +++++++++++++++++--------- bootloader/hos/sept.c | 27 ++++++++++++++++++++------- bootloader/hos/sept.h | 2 +- 9 files changed, 49 insertions(+), 21 deletions(-) diff --git a/bootloader/frontend/fe_info.c b/bootloader/frontend/fe_info.c index adf3996..a5fffba 100644 --- a/bootloader/frontend/fe_info.c +++ b/bootloader/frontend/fe_info.c @@ -382,12 +382,14 @@ void print_tsec_key() tsec_ctxt.size = 0xF00; else if (pkg1_id->kb == KB_FIRMWARE_VERSION_620) tsec_ctxt.size = 0x2900; - else + else if (pkg1_id->kb == KB_FIRMWARE_VERSION_700) { tsec_ctxt.size = 0x3000; // Exit after TSEC key generation. *((vu16 *)((u32)tsec_ctxt.fw + 0x2DB5)) = 0x02F8; } + else + tsec_ctxt.size = 0x3300; if (pkg1_id->kb == KB_FIRMWARE_VERSION_620) { diff --git a/bootloader/frontend/fe_tools.c b/bootloader/frontend/fe_tools.c index aa88249..c8a143c 100644 --- a/bootloader/frontend/fe_tools.c +++ b/bootloader/frontend/fe_tools.c @@ -109,7 +109,7 @@ void dump_packages12() gfx_printf("sept will run to get the keys.\nThen rerun this option."); btn_wait(); - if (!reboot_to_sept((u8 *)tsec_ctxt.fw)) + if (!reboot_to_sept((u8 *)tsec_ctxt.fw, kb)) { gfx_printf("Failed to run sept\n"); goto out_free; diff --git a/bootloader/hos/fss.c b/bootloader/hos/fss.c index c42d52f..b70b3fd 100644 --- a/bootloader/hos/fss.c +++ b/bootloader/hos/fss.c @@ -20,6 +20,7 @@ #include "fss.h" #include "hos.h" +#include "../config/config.h" #include "../libs/fatfs/ff.h" #include "../mem/heap.h" #include "../storage/emummc.h" diff --git a/bootloader/hos/hos.c b/bootloader/hos/hos.c index 2623ec1..329930b 100644 --- a/bootloader/hos/hos.c +++ b/bootloader/hos/hos.c @@ -184,8 +184,10 @@ int keygen(u8 *keyblob, u32 kb, tsec_ctxt_t *tsec_ctxt) tsec_ctxt->size = 0xF00; else if (kb == KB_FIRMWARE_VERSION_620) tsec_ctxt->size = 0x2900; - else + else if (kb == KB_FIRMWARE_VERSION_700) tsec_ctxt->size = 0x3000; + else + tsec_ctxt->size = 0x3300; // Prepare smmu tsec page for 6.2.0. if (kb == KB_FIRMWARE_VERSION_620) diff --git a/bootloader/hos/hos.h b/bootloader/hos/hos.h index e5c7dde..2a93584 100644 --- a/bootloader/hos/hos.h +++ b/bootloader/hos/hos.h @@ -31,7 +31,8 @@ #define KB_FIRMWARE_VERSION_600 5 #define KB_FIRMWARE_VERSION_620 6 #define KB_FIRMWARE_VERSION_700 7 -#define KB_FIRMWARE_VERSION_MAX KB_FIRMWARE_VERSION_700 +#define KB_FIRMWARE_VERSION_810 8 +#define KB_FIRMWARE_VERSION_MAX KB_FIRMWARE_VERSION_810 #define HOS_PKG11_MAGIC 0x31314B50 diff --git a/bootloader/hos/pkg1.c b/bootloader/hos/pkg1.c index 7ad07e3..397014b 100644 --- a/bootloader/hos/pkg1.c +++ b/bootloader/hos/pkg1.c @@ -144,6 +144,7 @@ static const pkg1_id_t _pkg1_ids[] = { { "20181218175730", 7, 0x0F00, 0x6FE0, { 1, 2, 0 }, 0x40030000, 0x4003E000, false, NULL, NULL }, //7.0.0 { "20190208150037", 7, 0x0F00, 0x6FE0, { 1, 2, 0 }, 0x40030000, 0x4003E000, false, NULL, NULL }, //7.0.1 { "20190314172056", 7, 0x0E00, 0x6FE0, { 1, 2, 0 }, 0x40030000, 0x4003E000, false, NULL, NULL }, //8.0.0 - 8.0.1 + { "20190531152432", 8, 0x0E00, 0x6FE0, { 1, 2, 0 }, 0x40030000, 0x4003E000, false, NULL, NULL }, //8.1.0 { NULL } //End. }; diff --git a/bootloader/hos/pkg2.c b/bootloader/hos/pkg2.c index afdd48d..21b1355 100644 --- a/bootloader/hos/pkg2.c +++ b/bootloader/hos/pkg2.c @@ -29,10 +29,16 @@ #include "../gfx/gfx.h" -/*#include "util.h" -#define DPRINTF(...) gfx_printf(__VA_ARGS__) -#define DEBUG_PRINTING*/ -#define DPRINTF(...) +extern hekate_config h_cfg; + + +#ifdef KIP1_PATCH_DEBUG + #include "../utils/util.h" + #define DPRINTF(...) gfx_printf(__VA_ARGS__) + #define DEBUG_PRINTING +#else + #define DPRINTF(...) +#endif //TODO: Replace hardcoded AArch64 instructions with instruction macros. //TODO: Reduce hardcoded values without searching kernel for patterns? @@ -616,14 +622,16 @@ static kip1_id_t _kip_ids[] = { "FS", "\xce\x3e\xcb\xa2\xf2\xf0\x62\xf5", _fs_patches_50x }, // FS 5.0.0 exfat { "FS", "\x76\xf8\x74\x02\xc9\x38\x7c\x0f", _fs_patches_510 }, // FS 5.1.0 { "FS", "\x10\xb2\xd8\x16\x05\x48\x85\x99", _fs_patches_510 }, // FS 5.1.0 exfat - { "FS", "\x1b\x82\xcb\x22\x18\x67\xcb\x52", _fs_patches_600 }, // FS 6.0.0-4.0 + { "FS", "\x1b\x82\xcb\x22\x18\x67\xcb\x52", _fs_patches_600 }, // FS 6.0.0-4.0 { "FS", "\x96\x6a\xdd\x3d\x20\xb6\x27\x13", _fs_patches_600_exfat }, // FS 6.0.0-4.0 exfat - { "FS", "\x3a\x57\x4d\x43\x61\x86\x19\x1d", _fs_patches_600 }, // FS 6.0.0-5.0 + { "FS", "\x3a\x57\x4d\x43\x61\x86\x19\x1d", _fs_patches_600 }, // FS 6.0.0-5.0 { "FS", "\x33\x05\x53\xf6\xb5\xfb\x55\xc4", _fs_patches_600_exfat }, // FS 6.0.0-5.0 exfat - { "FS", "\x2A\xDB\xE9\x7E\x9B\x5F\x41\x77", _fs_patches_700 }, // FS 7.0.0 + { "FS", "\x2A\xDB\xE9\x7E\x9B\x5F\x41\x77", _fs_patches_700 }, // FS 7.0.0 { "FS", "\x2C\xCE\x65\x9C\xEC\x53\x6A\x8E", _fs_patches_700_exfat }, // FS 7.0.0 exfat - { "FS", "\xB2\xF5\x17\x6B\x35\x48\x36\x4D", _fs_patches_800 }, // FS 8.0.0 - { "FS", "\xDB\xD9\x41\xC0\xC5\x3C\x52\xCC", _fs_patches_800_exfat } // FS 8.0.0 exfat + { "FS", "\xB2\xF5\x17\x6B\x35\x48\x36\x4D", _fs_patches_800 }, // FS 8.0.0 + { "FS", "\xDB\xD9\x41\xC0\xC5\x3C\x52\xCC", _fs_patches_800_exfat }, // FS 8.0.0 exfat + { "FS", "\x6B\x09\xB6\x7B\x29\xC0\x20\x24", _fs_patches_800 }, // FS 8.1.0 + { "FS", "\xB4\xCA\xE1\xF2\x49\x65\xD9\x2E", _fs_patches_800_exfat } // FS 8.1.0 exfat }; const pkg2_kernel_id_t *pkg2_identify(u8 *hash) diff --git a/bootloader/hos/sept.c b/bootloader/hos/sept.c index 384a78b..d8d092d 100644 --- a/bootloader/hos/sept.c +++ b/bootloader/hos/sept.c @@ -23,6 +23,7 @@ #include "../ianos/ianos.h" #include "../libs/fatfs/ff.h" #include "../mem/heap.h" +#include "../soc/hw_init.h" #include "../soc/pmc.h" #include "../soc/t210.h" #include "../storage/emummc.h" @@ -106,7 +107,7 @@ void check_sept() if (pkg1_id->kb >= KB_FIRMWARE_VERSION_700 && !h_cfg.sept_run) { sdmmc_storage_end(&storage); - reboot_to_sept((u8 *)pkg1 + pkg1_id->tsec_off); + reboot_to_sept((u8 *)pkg1 + pkg1_id->tsec_off, pkg1_id->kb); } out_free: @@ -114,14 +115,17 @@ out_free: sdmmc_storage_end(&storage); } -int reboot_to_sept(const u8 *tsec_fw) +int reboot_to_sept(const u8 *tsec_fw, u32 kb) { FIL fp; // Copy warmboot reboot code and TSEC fw. + u32 tsec_fw_size = 0x3000; + if (kb > KB_FIRMWARE_VERSION_700) + tsec_fw_size = 0x3300; memcpy((u8 *)(SEPT_PK1T_ADDR - WB_RST_SIZE), (u8 *)warmboot_reboot, sizeof(warmboot_reboot)); - memcpy((void *)SEPT_PK1T_ADDR, tsec_fw, 0x3000); - *(vu32 *)SEPT_TCSZ_ADDR = 0x3000; + memcpy((void *)SEPT_PK1T_ADDR, tsec_fw, tsec_fw_size); + *(vu32 *)SEPT_TCSZ_ADDR = tsec_fw_size; // Copy sept-primary. if (f_open(&fp, "sept/sept-primary.bin", FA_READ)) @@ -135,8 +139,17 @@ int reboot_to_sept(const u8 *tsec_fw) f_close(&fp); // Copy sept-secondary. - if (f_open(&fp, "sept/sept-secondary.enc", FA_READ)) - goto error; + if (kb < KB_FIRMWARE_VERSION_810) + { + if (f_open(&fp, "sept/sept-secondary_00.enc", FA_READ)) + if (f_open(&fp, "sept/sept-secondary.enc", FA_READ)) // Try the deprecated version. + goto error; + } + else + { + if (f_open(&fp, "sept/sept-secondary_01.enc", FA_READ)) + goto error; + } if (f_read(&fp, (u8 *)SEPT_STG2_ADDR, f_size(&fp), NULL)) { @@ -196,7 +209,7 @@ int reboot_to_sept(const u8 *tsec_fw) PMC(APBDEV_PMC_SCRATCH33) = SEPT_PRI_ADDR; PMC(APBDEV_PMC_SCRATCH40) = 0x6000F208; - display_end(); + reconfig_hw_workaround(false, 0); (*sept)(); diff --git a/bootloader/hos/sept.h b/bootloader/hos/sept.h index 5b0ecb4..7b44c73 100644 --- a/bootloader/hos/sept.h +++ b/bootloader/hos/sept.h @@ -20,6 +20,6 @@ #include "../utils/types.h" void check_sept(); -int reboot_to_sept(const u8 *tsec_fw); +int reboot_to_sept(const u8 *tsec_fw, u32 kb); #endif