From 1ac7f61f49e9da3a294cf792b6c5477ca16acf20 Mon Sep 17 00:00:00 2001 From: Kostas Missos Date: Sat, 1 Dec 2018 20:46:59 +0200 Subject: [PATCH] Add 6.2.0 exosphere support And refactor it to its own file. --- Makefile | 1 + bootloader/hos/hos.c | 57 +++++++++----------------------- bootloader/hos/secmon_exo.c | 66 +++++++++++++++++++++++++++++++++++++ bootloader/hos/secmon_exo.h | 24 ++++++++++++++ 4 files changed, 106 insertions(+), 42 deletions(-) create mode 100644 bootloader/hos/secmon_exo.c create mode 100644 bootloader/hos/secmon_exo.h diff --git a/Makefile b/Makefile index 7d54ad4..c144680 100755 --- a/Makefile +++ b/Makefile @@ -27,6 +27,7 @@ OBJS = $(addprefix $(BUILD)/$(TARGET)/, \ heap.o \ hos.o \ hos_config.o \ + secmon_exo.o \ i2c.o \ kfuse.o \ bq24193.o \ diff --git a/bootloader/hos/hos.c b/bootloader/hos/hos.c index aedf79c..34e3a52 100644 --- a/bootloader/hos/hos.c +++ b/bootloader/hos/hos.c @@ -22,6 +22,7 @@ #include "hos.h" #include "hos_config.h" +#include "secmon_exo.h" #include "../config/config.h" #include "../gfx/di.h" #include "../mem/heap.h" @@ -49,9 +50,6 @@ extern void sd_unmount(); //#define DPRINTF(...) gfx_printf(&gfx_con, __VA_ARGS__) #define DPRINTF(...) -// Exosphère magic "XBC0". -#define MAGIC_EXOSPHERE 0x30434258 - static const u8 keyblob_keyseeds[][0x10] = { { 0xDF, 0x20, 0x6F, 0x59, 0x44, 0x54, 0xEF, 0xDC, 0x70, 0x74, 0x48, 0x3B, 0x0D, 0xED, 0x9F, 0xD3 }, //1.0.0 { 0x0C, 0x25, 0x61, 0x5D, 0x68, 0x4C, 0xEB, 0x42, 0x1C, 0x23, 0x79, 0xEA, 0x82, 0x25, 0x12, 0xAC }, //3.0.0 @@ -358,9 +356,6 @@ static void _free_launch_components(launch_ctxt_t *ctxt) int hos_launch(ini_sec_t *cfg) { - int bootStateDramPkg2 = 0; - int bootStatePkg2Continue = 0; - int exoFwNumber = 0; launch_ctxt_t ctxt; tsec_ctxt_t tsec_ctxt; @@ -466,7 +461,7 @@ int hos_launch(ini_sec_t *cfg) for (u32 i = 0; kernel_patchset[i].id != 0xFFFFFFFF; i++) { if ((ctxt.svcperm && kernel_patchset[i].id == SVC_VERIFY_DS) - || (ctxt.debugmode && kernel_patchset[i].id == DEBUG_MODE_EN) + || (ctxt.debugmode && kernel_patchset[i].id == DEBUG_MODE_EN && !(ctxt.atmosphere && ctxt.secmon)) || (ctxt.atmosphere && kernel_patchset[i].id == ATM_GEN_PATCH)) *(vu32 *)(ctxt.kernel + kernel_patchset[i].off) = kernel_patchset[i].val; else if (ctxt.atmosphere && kernel_patchset[i].id == ATM_ARR_PATCH) @@ -508,17 +503,13 @@ int hos_launch(ini_sec_t *cfg) se_aes_key_clear(8); se_aes_key_clear(11); - // Final per firmware configuration. + // Finalize per firmware keys. + int bootStateDramPkg2 = 0; + int bootStatePkg2Continue = 0; + switch (ctxt.pkg1_id->kb) { case KB_FIRMWARE_VERSION_100_200: - if (!exoFwNumber) - { - if (!strcmp(ctxt.pkg1_id->id, "20161121183008")) - exoFwNumber = 1; - else - exoFwNumber = 2; - } case KB_FIRMWARE_VERSION_300: case KB_FIRMWARE_VERSION_301: if (ctxt.pkg1_id->kb == KB_FIRMWARE_VERSION_300) @@ -529,23 +520,15 @@ int hos_launch(ini_sec_t *cfg) se_key_acc_ctrl(13, 0xFF); bootStateDramPkg2 = 2; bootStatePkg2Continue = 3; - if (!exoFwNumber) - exoFwNumber = 3; break; case KB_FIRMWARE_VERSION_400: - if (!exoFwNumber) - exoFwNumber = 4; case KB_FIRMWARE_VERSION_500: - if (!exoFwNumber) - exoFwNumber = 5; case KB_FIRMWARE_VERSION_600: - default: se_key_acc_ctrl(12, 0xFF); se_key_acc_ctrl(15, 0xFF); + case KB_FIRMWARE_VERSION_620: bootStateDramPkg2 = 2; bootStatePkg2Continue = 4; - if (!exoFwNumber) - exoFwNumber = 6; break; } @@ -564,30 +547,20 @@ int hos_launch(ini_sec_t *cfg) } free(bootConfigBuf); - // Config Exosphère if booting Atmosphère. - if (ctxt.atmosphere) - { - vu32 *mb_exo_magic = (vu32 *)0x40002E40; - vu32 *mb_exo_fw_no = (vu32 *)0x40002E44; - - *mb_exo_magic = MAGIC_EXOSPHERE; - *mb_exo_fw_no = exoFwNumber; - } + // Config Exosphère if booting full Atmosphère. + if (ctxt.atmosphere && ctxt.secmon) + config_exosphere(ctxt.pkg1_id->id, ctxt.pkg1_id->kb, ctxt.debugmode); // Finalize MC carveout. if (ctxt.pkg1_id->kb <= KB_FIRMWARE_VERSION_301) mc_config_carveout(); - // Lock SE before starting 'SecureMonitor' if < 6.2.0, otherwise finalize 6.2.0 keygen and reset sysctr0 counters. - if (ctxt.pkg1_id->kb <= KB_FIRMWARE_VERSION_600) - _se_lock(true); - else - { - // Lock bootrom and ipatches only. - _se_lock(false); - // Reset sysctr0 counters. + // Lock SE before starting 'SecureMonitor' if < 6.2.0, otherwise lock bootrom and ipatches. + _se_lock(ctxt.pkg1_id->kb <= KB_FIRMWARE_VERSION_600); + + // Reset sysctr0 counters. + if (kb >= KB_FIRMWARE_VERSION_620) _sysctr0_reset(); - } // Free allocated memory. ini_free_section(cfg); diff --git a/bootloader/hos/secmon_exo.c b/bootloader/hos/secmon_exo.c new file mode 100644 index 0000000..65db9e5 --- /dev/null +++ b/bootloader/hos/secmon_exo.c @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2018 CTCaer + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include + +#include "hos.h" +#include "../utils/types.h" + +// Exosphère mailbox defines. +#define EXO_MAGIC_ADDR 0x40002E40 +#define EXO_MAGIC_VAL 0x31434258 +#define EXO_FWNO_ADDR 0x40002E44 +#define EXO_FLAGS_ADDR 0x40002E48 +#define EXO_FLAG_620_KGN (1 << 0) +#define EXO_FLAG_DBG_PRIV (1 << 1) +#define EXO_FLAG_DBG_USER (1 << 2) + +void config_exosphere(const char *id, u32 kb, bool debug) +{ + u32 exoFwNo = 0; + u32 exoFlags = 0; + + vu32 *mb_exo_magic = (vu32 *)EXO_MAGIC_ADDR; + vu32 *mb_exo_fw_no = (vu32 *)EXO_FWNO_ADDR; + vu32 *mb_exo_flags = (vu32 *)EXO_FLAGS_ADDR; + + switch (kb) + { + case KB_FIRMWARE_VERSION_100_200: + if (!strcmp(id, "20161121183008")) + exoFwNo = 1; + else + exoFwNo = 2; + break; + case KB_FIRMWARE_VERSION_300: + exoFwNo = 3; + break; + default: + exoFwNo = kb + 1; + break; + } + + if (kb >= KB_FIRMWARE_VERSION_620) + exoFlags |= EXO_FLAG_620_KGN; + + if (debug) + exoFlags |= EXO_FLAG_DBG_PRIV | EXO_FLAG_DBG_USER; + + // Set mailbox values. + *mb_exo_magic = EXO_MAGIC_VAL; + *mb_exo_fw_no = exoFwNo; + *mb_exo_flags = exoFlags; +} diff --git a/bootloader/hos/secmon_exo.h b/bootloader/hos/secmon_exo.h new file mode 100644 index 0000000..f22f02e --- /dev/null +++ b/bootloader/hos/secmon_exo.h @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2018 CTCaer + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef _SECMON_EXO_H_ +#define _SECMON_EXO_H_ + +#include "../utils/types.h" + +void config_exosphere(const char *id, u32 kb, bool debug); + +#endif