Add 6.2.0 exosphere support

And refactor it to its own file.
This commit is contained in:
Kostas Missos 2018-12-01 20:46:59 +02:00
parent 4b3599b2d8
commit 1ac7f61f49
4 changed files with 106 additions and 42 deletions

View file

@ -27,6 +27,7 @@ OBJS = $(addprefix $(BUILD)/$(TARGET)/, \
heap.o \ heap.o \
hos.o \ hos.o \
hos_config.o \ hos_config.o \
secmon_exo.o \
i2c.o \ i2c.o \
kfuse.o \ kfuse.o \
bq24193.o \ bq24193.o \

View file

@ -22,6 +22,7 @@
#include "hos.h" #include "hos.h"
#include "hos_config.h" #include "hos_config.h"
#include "secmon_exo.h"
#include "../config/config.h" #include "../config/config.h"
#include "../gfx/di.h" #include "../gfx/di.h"
#include "../mem/heap.h" #include "../mem/heap.h"
@ -49,9 +50,6 @@ extern void sd_unmount();
//#define DPRINTF(...) gfx_printf(&gfx_con, __VA_ARGS__) //#define DPRINTF(...) gfx_printf(&gfx_con, __VA_ARGS__)
#define DPRINTF(...) #define DPRINTF(...)
// Exosphère magic "XBC0".
#define MAGIC_EXOSPHERE 0x30434258
static const u8 keyblob_keyseeds[][0x10] = { 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 { 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 { 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 hos_launch(ini_sec_t *cfg)
{ {
int bootStateDramPkg2 = 0;
int bootStatePkg2Continue = 0;
int exoFwNumber = 0;
launch_ctxt_t ctxt; launch_ctxt_t ctxt;
tsec_ctxt_t tsec_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++) for (u32 i = 0; kernel_patchset[i].id != 0xFFFFFFFF; i++)
{ {
if ((ctxt.svcperm && kernel_patchset[i].id == SVC_VERIFY_DS) 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)) || (ctxt.atmosphere && kernel_patchset[i].id == ATM_GEN_PATCH))
*(vu32 *)(ctxt.kernel + kernel_patchset[i].off) = kernel_patchset[i].val; *(vu32 *)(ctxt.kernel + kernel_patchset[i].off) = kernel_patchset[i].val;
else if (ctxt.atmosphere && kernel_patchset[i].id == ATM_ARR_PATCH) 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(8);
se_aes_key_clear(11); se_aes_key_clear(11);
// Final per firmware configuration. // Finalize per firmware keys.
int bootStateDramPkg2 = 0;
int bootStatePkg2Continue = 0;
switch (ctxt.pkg1_id->kb) switch (ctxt.pkg1_id->kb)
{ {
case KB_FIRMWARE_VERSION_100_200: 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_300:
case KB_FIRMWARE_VERSION_301: case KB_FIRMWARE_VERSION_301:
if (ctxt.pkg1_id->kb == KB_FIRMWARE_VERSION_300) 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); se_key_acc_ctrl(13, 0xFF);
bootStateDramPkg2 = 2; bootStateDramPkg2 = 2;
bootStatePkg2Continue = 3; bootStatePkg2Continue = 3;
if (!exoFwNumber)
exoFwNumber = 3;
break; break;
case KB_FIRMWARE_VERSION_400: case KB_FIRMWARE_VERSION_400:
if (!exoFwNumber)
exoFwNumber = 4;
case KB_FIRMWARE_VERSION_500: case KB_FIRMWARE_VERSION_500:
if (!exoFwNumber)
exoFwNumber = 5;
case KB_FIRMWARE_VERSION_600: case KB_FIRMWARE_VERSION_600:
default:
se_key_acc_ctrl(12, 0xFF); se_key_acc_ctrl(12, 0xFF);
se_key_acc_ctrl(15, 0xFF); se_key_acc_ctrl(15, 0xFF);
case KB_FIRMWARE_VERSION_620:
bootStateDramPkg2 = 2; bootStateDramPkg2 = 2;
bootStatePkg2Continue = 4; bootStatePkg2Continue = 4;
if (!exoFwNumber)
exoFwNumber = 6;
break; break;
} }
@ -564,30 +547,20 @@ int hos_launch(ini_sec_t *cfg)
} }
free(bootConfigBuf); free(bootConfigBuf);
// Config Exosphère if booting Atmosphère. // Config Exosphère if booting full Atmosphère.
if (ctxt.atmosphere) if (ctxt.atmosphere && ctxt.secmon)
{ config_exosphere(ctxt.pkg1_id->id, ctxt.pkg1_id->kb, ctxt.debugmode);
vu32 *mb_exo_magic = (vu32 *)0x40002E40;
vu32 *mb_exo_fw_no = (vu32 *)0x40002E44;
*mb_exo_magic = MAGIC_EXOSPHERE;
*mb_exo_fw_no = exoFwNumber;
}
// Finalize MC carveout. // Finalize MC carveout.
if (ctxt.pkg1_id->kb <= KB_FIRMWARE_VERSION_301) if (ctxt.pkg1_id->kb <= KB_FIRMWARE_VERSION_301)
mc_config_carveout(); mc_config_carveout();
// Lock SE before starting 'SecureMonitor' if < 6.2.0, otherwise finalize 6.2.0 keygen and reset sysctr0 counters. // Lock SE before starting 'SecureMonitor' if < 6.2.0, otherwise lock bootrom and ipatches.
if (ctxt.pkg1_id->kb <= KB_FIRMWARE_VERSION_600) _se_lock(ctxt.pkg1_id->kb <= KB_FIRMWARE_VERSION_600);
_se_lock(true);
else // Reset sysctr0 counters.
{ if (kb >= KB_FIRMWARE_VERSION_620)
// Lock bootrom and ipatches only.
_se_lock(false);
// Reset sysctr0 counters.
_sysctr0_reset(); _sysctr0_reset();
}
// Free allocated memory. // Free allocated memory.
ini_free_section(cfg); ini_free_section(cfg);

View file

@ -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 <http://www.gnu.org/licenses/>.
*/
#include <string.h>
#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;
}

View file

@ -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 <http://www.gnu.org/licenses/>.
*/
#ifndef _SECMON_EXO_H_
#define _SECMON_EXO_H_
#include "../utils/types.h"
void config_exosphere(const char *id, u32 kb, bool debug);
#endif