mirror of
https://github.com/CTCaer/hekate.git
synced 2024-12-24 12:14:11 +00:00
Add 6.2.0 exosphere support
And refactor it to its own file.
This commit is contained in:
parent
4b3599b2d8
commit
1ac7f61f49
1
Makefile
1
Makefile
@ -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 \
|
||||||
|
@ -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);
|
||||||
|
66
bootloader/hos/secmon_exo.c
Normal file
66
bootloader/hos/secmon_exo.c
Normal 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;
|
||||||
|
}
|
24
bootloader/hos/secmon_exo.h
Normal file
24
bootloader/hos/secmon_exo.h
Normal 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
|
Loading…
Reference in New Issue
Block a user