From bf222290b852784e4d273a2ed21efdf2c25837ba Mon Sep 17 00:00:00 2001 From: CTCaer Date: Sat, 17 Oct 2020 23:18:48 +0300 Subject: [PATCH] hos: Add support for mesosphere The change adds support for mesosphere loading from fss0 or sd (kernel=). --- bootloader/hos/fss.c | 4 ++++ bootloader/hos/pkg2.c | 9 +++++++-- bootloader/hos/pkg2.h | 2 ++ bootloader/hos/secmon_exo.c | 2 ++ 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/bootloader/hos/fss.c b/bootloader/hos/fss.c index d403589..24858bb 100644 --- a/bootloader/hos/fss.c +++ b/bootloader/hos/fss.c @@ -190,6 +190,10 @@ int parse_fss(launch_ctxt_t *ctxt, const char *path, fss0_sept_t *sept_ctxt) ctxt->warmboot_size = curr_fss_cnt[i].size; ctxt->warmboot = content; break; + case CNT_TYPE_KRN: + ctxt->kernel_size = curr_fss_cnt[i].size; + ctxt->kernel = content; + break; default: continue; } diff --git a/bootloader/hos/pkg2.c b/bootloader/hos/pkg2.c index cdb600e..47b9df6 100644 --- a/bootloader/hos/pkg2.c +++ b/bootloader/hos/pkg2.c @@ -1415,6 +1415,11 @@ void pkg2_build_encrypt(void *dst, void *hos_ctxt, link_t *kips_info) u8 *pdst = (u8 *)dst; launch_ctxt_t * ctxt = (launch_ctxt_t *)hos_ctxt; u32 kernel_size = ctxt->kernel_size; + bool is_meso = *(u32 *)(ctxt->kernel + 4) == ATM_MESOSPHERE; + + // Force new Package2 if Mesosphere. + if (is_meso) + ctxt->new_pkg2 = true; // Signature. memset(pdst, 0, 0x100); @@ -1433,7 +1438,7 @@ void pkg2_build_encrypt(void *dst, void *hos_ctxt, link_t *kips_info) hdr->base = 0x10000000; else hdr->base = 0x60000; -DPRINTF("kernel @ %08X (%08X)\n", (u32)ctxt->kernel, kernel_size); +DPRINTF("%s @ %08X (%08X)\n", is_meso ? "Mesosphere": "kernel",(u32)ctxt->kernel, kernel_size); pdst += sizeof(pkg2_hdr_t); @@ -1444,7 +1449,7 @@ DPRINTF("kernel @ %08X (%08X)\n", (u32)ctxt->kernel, kernel_size); else { // Set new INI1 offset to kernel. - *(u32 *)(pdst + pkg2_newkern_ini1_val) = kernel_size; + *(u32 *)(pdst + (is_meso ? 8 : pkg2_newkern_ini1_val)) = kernel_size; // Build INI1 for new Package2. kernel_size += _pkg2_ini1_build(pdst + kernel_size, hdr, kips_info, ctxt->new_pkg2); diff --git a/bootloader/hos/pkg2.h b/bootloader/hos/pkg2.h index 58a030d..5d0f5f3 100644 --- a/bootloader/hos/pkg2.h +++ b/bootloader/hos/pkg2.h @@ -30,6 +30,8 @@ #define PKG2_NEWKERN_GET_INI1_HEURISTIC 0xD2800015 // Offset of OP + 12 is the INI1 offset. #define PKG2_NEWKERN_START 0x800 +#define ATM_MESOSPHERE 0x3053534D + extern u32 pkg2_newkern_ini1_val; extern u32 pkg2_newkern_ini1_start; extern u32 pkg2_newkern_ini1_end; diff --git a/bootloader/hos/secmon_exo.c b/bootloader/hos/secmon_exo.c index 52b8d39..ead4bfd 100644 --- a/bootloader/hos/secmon_exo.c +++ b/bootloader/hos/secmon_exo.c @@ -344,6 +344,8 @@ static const char *get_error_desc(u32 error_desc) return "SYS"; // System Error. case 0x301: return "SVC"; // Bad arguments or unimplemented SVC. + case 0xF00: + return "KRNL"; // Kernel panic. case 0xFFD: return "SO"; // Stack Overflow. case 0xFFE: