mirror of
https://github.com/Atmosphere-NX/Atmosphere.git
synced 2024-12-18 08:22:04 +00:00
exo2: reorganize to save >0x300 bytes and 0x100 of stack in main
This commit is contained in:
parent
ad664daea5
commit
b7ff9e8fcc
10 changed files with 146 additions and 135 deletions
|
@ -13,7 +13,7 @@ MEMORY
|
||||||
warmboot_text : ORIGIN = ORIGIN(tzram) + 10K, LENGTH = 2K
|
warmboot_text : ORIGIN = ORIGIN(tzram) + 10K, LENGTH = 2K
|
||||||
|
|
||||||
main : ORIGIN = 0x1F00C0000, LENGTH = 48K
|
main : ORIGIN = 0x1F00C0000, LENGTH = 48K
|
||||||
tzram_boot_code : ORIGIN = 0x1F01C0800, LENGTH = 6K
|
tzram_boot : ORIGIN = 0x1F01C0000, LENGTH = 8K
|
||||||
|
|
||||||
glob : ORIGIN = 0x040032000, LENGTH = 64K
|
glob : ORIGIN = 0x040032000, LENGTH = 64K
|
||||||
}
|
}
|
||||||
|
@ -88,6 +88,17 @@ SECTIONS
|
||||||
__bootcode_end__ = ABSOLUTE(.);
|
__bootcode_end__ = ABSOLUTE(.);
|
||||||
|
|
||||||
__program_start__ = ABSOLUTE(.);
|
__program_start__ = ABSOLUTE(.);
|
||||||
|
|
||||||
|
.tzram_boot_volatile_data : {
|
||||||
|
KEEP (*(.volatile_keys .volatile_keys.*))
|
||||||
|
} >tzram_boot AT>glob
|
||||||
|
|
||||||
|
.tzram_boot_volatile_data.fill : {
|
||||||
|
FILL(0x00000000);
|
||||||
|
. = ORIGIN(tzram_boot) + 0x7FF;
|
||||||
|
BYTE(0x00);
|
||||||
|
} >tzram_boot AT>glob
|
||||||
|
|
||||||
.tzram_boot_code :
|
.tzram_boot_code :
|
||||||
{
|
{
|
||||||
KEEP(secmon_main.o(.text*))
|
KEEP(secmon_main.o(.text*))
|
||||||
|
@ -96,23 +107,20 @@ SECTIONS
|
||||||
KEEP(secmon_boot_config.o(.text*))
|
KEEP(secmon_boot_config.o(.text*))
|
||||||
KEEP(secmon_boot_setup.o(.text*))
|
KEEP(secmon_boot_setup.o(.text*))
|
||||||
KEEP(secmon_package2.o(.text*))
|
KEEP(secmon_package2.o(.text*))
|
||||||
KEEP(secmon_key_data.o(.text*))
|
|
||||||
secmon_main.o(.rodata*)
|
secmon_main.o(.rodata*)
|
||||||
secmon_boot_functions.o(.rodata*)
|
secmon_boot_functions.o(.rodata*)
|
||||||
secmon_boot_cache.o(.rodata*)
|
secmon_boot_cache.o(.rodata*)
|
||||||
secmon_boot_config.o(.rodata*)
|
secmon_boot_config.o(.rodata*)
|
||||||
secmon_boot_setup.o(.rodata*)
|
secmon_boot_setup.o(.rodata*)
|
||||||
secmon_package2.o(.rodata*)
|
secmon_package2.o(.rodata*)
|
||||||
secmon_key_data.o(.rodata*)
|
|
||||||
secmon_main.o(.data*)
|
secmon_main.o(.data*)
|
||||||
secmon_boot_functions.o(.data*)
|
secmon_boot_functions.o(.data*)
|
||||||
secmon_boot_cache.o(.data*)
|
secmon_boot_cache.o(.data*)
|
||||||
secmon_boot_config.o(.data*)
|
secmon_boot_config.o(.data*)
|
||||||
secmon_boot_setup.o(.data*)
|
secmon_boot_setup.o(.data*)
|
||||||
secmon_package2.o(.data*)
|
secmon_package2.o(.data*)
|
||||||
secmon_key_data.o(.data*)
|
|
||||||
. = ALIGN(8);
|
. = ALIGN(8);
|
||||||
} >tzram_boot_code AT>glob
|
} >tzram_boot AT>glob
|
||||||
|
|
||||||
.tzram_boot_code.bss :
|
.tzram_boot_code.bss :
|
||||||
{
|
{
|
||||||
|
@ -123,16 +131,15 @@ SECTIONS
|
||||||
secmon_boot_config.o(.bss* COMMON)
|
secmon_boot_config.o(.bss* COMMON)
|
||||||
secmon_boot_setup.o(.bss* COMMON)
|
secmon_boot_setup.o(.bss* COMMON)
|
||||||
secmon_package2.o(.bss* COMMON)
|
secmon_package2.o(.bss* COMMON)
|
||||||
secmon_key_data.o(.bss* COMMON)
|
|
||||||
__boot_bss_end__ = ABSOLUTE(.);
|
__boot_bss_end__ = ABSOLUTE(.);
|
||||||
} >tzram_boot_code AT>glob
|
} >tzram_boot AT>glob
|
||||||
|
|
||||||
.tzram_boot_code.fill :
|
.tzram_boot_code.fill :
|
||||||
{
|
{
|
||||||
FILL(0x00000000);
|
FILL(0x00000000);
|
||||||
. = ORIGIN(tzram_boot_code) + LENGTH(tzram_boot_code) - 1;
|
. = ORIGIN(tzram_boot) + LENGTH(tzram_boot) - 1;
|
||||||
BYTE(0x00);
|
BYTE(0x00);
|
||||||
} > tzram_boot_code AT>glob
|
} > tzram_boot AT>glob
|
||||||
|
|
||||||
.vectors :
|
.vectors :
|
||||||
{
|
{
|
||||||
|
@ -155,7 +162,7 @@ SECTIONS
|
||||||
KEEP(tsec_*.o(.data*))
|
KEEP(tsec_*.o(.data*))
|
||||||
} >warmboot_text AT>glob
|
} >warmboot_text AT>glob
|
||||||
|
|
||||||
.text :
|
.text ORIGIN(main) + SIZEOF(.vectors) + SIZEOF(.warmboot) :
|
||||||
{
|
{
|
||||||
*(.text.unlikely .text.*_unlikely .text.unlikely.*)
|
*(.text.unlikely .text.*_unlikely .text.unlikely.*)
|
||||||
*(.text.exit .text.exit.*)
|
*(.text.exit .text.exit.*)
|
||||||
|
|
|
@ -18,7 +18,6 @@
|
||||||
#include "secmon_boot.hpp"
|
#include "secmon_boot.hpp"
|
||||||
#include "secmon_boot_cache.hpp"
|
#include "secmon_boot_cache.hpp"
|
||||||
#include "secmon_boot_functions.hpp"
|
#include "secmon_boot_functions.hpp"
|
||||||
#include "secmon_boot_key_data.hpp"
|
|
||||||
|
|
||||||
namespace ams::secmon::boot {
|
namespace ams::secmon::boot {
|
||||||
|
|
||||||
|
@ -27,7 +26,7 @@ namespace ams::secmon::boot {
|
||||||
constexpr inline uintptr_t SYSCTR0 = MemoryRegionVirtualDeviceSysCtr0.GetAddress();
|
constexpr inline uintptr_t SYSCTR0 = MemoryRegionVirtualDeviceSysCtr0.GetAddress();
|
||||||
|
|
||||||
NOINLINE void DecryptPayload(uintptr_t dst, uintptr_t src, size_t size, const void *iv, size_t iv_size, u8 key_generation) {
|
NOINLINE void DecryptPayload(uintptr_t dst, uintptr_t src, size_t size, const void *iv, size_t iv_size, u8 key_generation) {
|
||||||
secmon::boot::DecryptPackage2(reinterpret_cast<void *>(dst), size, reinterpret_cast<void *>(src), size, Package2AesKey, util::size(Package2AesKey), iv, iv_size, key_generation);
|
secmon::boot::DecryptPackage2(reinterpret_cast<void *>(dst), size, reinterpret_cast<void *>(src), size, secmon::boot::GetPackage2AesKey(), crypto::AesEncryptor128::KeySize, iv, iv_size, key_generation);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -74,7 +73,7 @@ namespace ams::secmon::boot {
|
||||||
/* Determine if the bc is valid for the device. */
|
/* Determine if the bc is valid for the device. */
|
||||||
bool valid_for_device = false;
|
bool valid_for_device = false;
|
||||||
{
|
{
|
||||||
const bool valid_signature = secmon::boot::VerifyBootConfigSignature(*bc, BootConfigRsaPublicModulus, util::size(BootConfigRsaPublicModulus));
|
const bool valid_signature = secmon::boot::VerifyBootConfigSignature(*bc, secmon::boot::GetBootConfigRsaModulus(), se::RsaSize);
|
||||||
if (valid_signature) {
|
if (valid_signature) {
|
||||||
valid_for_device = secmon::boot::VerifyBootConfigEcid(*bc);
|
valid_for_device = secmon::boot::VerifyBootConfigEcid(*bc);
|
||||||
}
|
}
|
||||||
|
@ -138,10 +137,10 @@ namespace ams::secmon::boot {
|
||||||
}
|
}
|
||||||
|
|
||||||
void VerifyPackage2HeaderSignature(pkg2::Package2Header &header, bool verify) {
|
void VerifyPackage2HeaderSignature(pkg2::Package2Header &header, bool verify) {
|
||||||
if (pkg1::IsProductionForPublicKey()) {
|
const u8 * const mod = secmon::boot::GetPackage2RsaModulus(pkg1::IsProductionForPublicKey());
|
||||||
CheckVerifyResult(secmon::boot::VerifyPackage2Signature(header, Package2RsaPublicModulusProduction, util::size(Package2RsaPublicModulusProduction)), pkg1::ErrorInfo_InvalidPackage2Signature, "package2 header sign verification failed");
|
const size_t mod_size = se::RsaSize;
|
||||||
} else if (verify) {
|
if (verify) {
|
||||||
CheckVerifyResult(secmon::boot::VerifyPackage2Signature(header, Package2RsaPublicModulusDevelopment, util::size(Package2RsaPublicModulusDevelopment)), pkg1::ErrorInfo_InvalidPackage2Signature, "package2 header sign verification failed");
|
CheckVerifyResult(secmon::boot::VerifyPackage2Signature(header, mod, mod_size), pkg1::ErrorInfo_InvalidPackage2Signature, "package2 header sign verification failed");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -150,7 +149,7 @@ namespace ams::secmon::boot {
|
||||||
constexpr int IvSize = 0x10;
|
constexpr int IvSize = 0x10;
|
||||||
|
|
||||||
/* Decrypt the header. */
|
/* Decrypt the header. */
|
||||||
DecryptPackage2(dst, sizeof(*dst), std::addressof(src), sizeof(src), Package2AesKey, util::size(Package2AesKey), std::addressof(src), IvSize, src.GetKeyGeneration());
|
DecryptPackage2(dst, sizeof(*dst), std::addressof(src), sizeof(src), secmon::boot::GetPackage2AesKey(), crypto::AesEncryptor128::KeySize, std::addressof(src), IvSize, src.GetKeyGeneration());
|
||||||
|
|
||||||
/* Copy back the iv, which encodes encrypted metadata. */
|
/* Copy back the iv, which encodes encrypted metadata. */
|
||||||
std::memcpy(dst, std::addressof(src), IvSize);
|
std::memcpy(dst, std::addressof(src), IvSize);
|
||||||
|
|
|
@ -1,82 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2018-2020 Atmosphère-NX
|
|
||||||
*
|
|
||||||
* 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 <exosphere.hpp>
|
|
||||||
#include "secmon_boot_key_data.hpp"
|
|
||||||
|
|
||||||
namespace ams::secmon::boot {
|
|
||||||
|
|
||||||
constinit const u8 BootConfigRsaPublicModulus[se::RsaSize] = {
|
|
||||||
0xB5, 0x96, 0x87, 0x31, 0x39, 0xAA, 0xBB, 0x3C, 0x28, 0xF3, 0xF0, 0x65, 0xF1, 0x50, 0x70, 0x64,
|
|
||||||
0xE6, 0x6C, 0x97, 0x50, 0xCD, 0xA6, 0xEE, 0xEA, 0xC3, 0x8F, 0xE6, 0xB5, 0x81, 0x54, 0x65, 0x33,
|
|
||||||
0x1B, 0x88, 0x4B, 0xCE, 0x9F, 0x53, 0xDF, 0xE4, 0xF6, 0xAD, 0xC3, 0x78, 0xD7, 0x3C, 0xD1, 0xDB,
|
|
||||||
0x27, 0x21, 0xA0, 0x24, 0x30, 0x2D, 0x98, 0x41, 0xA8, 0xDF, 0x50, 0x7D, 0xAB, 0xCE, 0x00, 0xD9,
|
|
||||||
0xCB, 0xAC, 0x8F, 0x37, 0xF5, 0x53, 0xE4, 0x97, 0x1F, 0x13, 0x3C, 0x19, 0xFF, 0x05, 0xA7, 0x3B,
|
|
||||||
0xF6, 0xF4, 0x01, 0xDE, 0xF0, 0xC3, 0x77, 0x7B, 0x83, 0xBA, 0xAF, 0x99, 0x30, 0x94, 0x87, 0x25,
|
|
||||||
0x4E, 0x54, 0x42, 0x3F, 0xAC, 0x27, 0xF9, 0xCC, 0x87, 0xDD, 0xAE, 0xF2, 0x54, 0xF3, 0x97, 0x49,
|
|
||||||
0xF4, 0xB0, 0xF8, 0x6D, 0xDA, 0x60, 0xE0, 0xFD, 0x57, 0xAE, 0x55, 0xA9, 0x76, 0xEA, 0x80, 0x24,
|
|
||||||
0xA0, 0x04, 0x7D, 0xBE, 0xD1, 0x81, 0xD3, 0x0C, 0x95, 0xCF, 0xB7, 0xE0, 0x2D, 0x21, 0x21, 0xFF,
|
|
||||||
0x97, 0x1E, 0xB3, 0xD7, 0x9F, 0xBB, 0x33, 0x0C, 0x23, 0xC5, 0x88, 0x4A, 0x33, 0xB9, 0xC9, 0x4E,
|
|
||||||
0x1E, 0x65, 0x51, 0x45, 0xDE, 0xF9, 0x64, 0x7C, 0xF0, 0xBF, 0x11, 0xB4, 0x93, 0x8D, 0x5D, 0xC6,
|
|
||||||
0xAB, 0x37, 0x9E, 0xE9, 0x39, 0xC1, 0xC8, 0xDB, 0xB9, 0xFE, 0x45, 0xCE, 0x7B, 0xDD, 0x72, 0xD9,
|
|
||||||
0x6F, 0x68, 0x13, 0xC0, 0x4B, 0xBA, 0x00, 0xF4, 0x1E, 0x89, 0x71, 0x91, 0x26, 0xA6, 0x46, 0x12,
|
|
||||||
0xDF, 0x29, 0x6B, 0xC2, 0x5A, 0x53, 0xAF, 0xB9, 0x5B, 0xFD, 0x13, 0x9F, 0xD1, 0x8A, 0x7C, 0xB5,
|
|
||||||
0x04, 0xFD, 0x69, 0xEA, 0x23, 0xB4, 0x6D, 0x16, 0x21, 0x98, 0x54, 0xB4, 0xDF, 0xE6, 0xAB, 0x93,
|
|
||||||
0x36, 0xB6, 0xD2, 0x43, 0xCF, 0x2B, 0x98, 0x1D, 0x45, 0xC9, 0xBB, 0x20, 0x42, 0xB1, 0x9D, 0x1D
|
|
||||||
};
|
|
||||||
|
|
||||||
constinit const u8 Package2RsaPublicModulusProduction[se::RsaSize] = {
|
|
||||||
0x8D, 0x13, 0xA7, 0x77, 0x6A, 0xE5, 0xDC, 0xC0, 0x3B, 0x25, 0xD0, 0x58, 0xE4, 0x20, 0x69, 0x59,
|
|
||||||
0x55, 0x4B, 0xAB, 0x70, 0x40, 0x08, 0x28, 0x07, 0xA8, 0xA7, 0xFD, 0x0F, 0x31, 0x2E, 0x11, 0xFE,
|
|
||||||
0x47, 0xA0, 0xF9, 0x9D, 0xDF, 0x80, 0xDB, 0x86, 0x5A, 0x27, 0x89, 0xCD, 0x97, 0x6C, 0x85, 0xC5,
|
|
||||||
0x6C, 0x39, 0x7F, 0x41, 0xF2, 0xFF, 0x24, 0x20, 0xC3, 0x95, 0xA6, 0xF7, 0x9D, 0x4A, 0x45, 0x74,
|
|
||||||
0x8B, 0x5D, 0x28, 0x8A, 0xC6, 0x99, 0x35, 0x68, 0x85, 0xA5, 0x64, 0x32, 0x80, 0x9F, 0xD3, 0x48,
|
|
||||||
0x39, 0xA2, 0x1D, 0x24, 0x67, 0x69, 0xDF, 0x75, 0xAC, 0x12, 0xB5, 0xBD, 0xC3, 0x29, 0x90, 0xBE,
|
|
||||||
0x37, 0xE4, 0xA0, 0x80, 0x9A, 0xBE, 0x36, 0xBF, 0x1F, 0x2C, 0xAB, 0x2B, 0xAD, 0xF5, 0x97, 0x32,
|
|
||||||
0x9A, 0x42, 0x9D, 0x09, 0x8B, 0x08, 0xF0, 0x63, 0x47, 0xA3, 0xE9, 0x1B, 0x36, 0xD8, 0x2D, 0x8A,
|
|
||||||
0xD7, 0xE1, 0x54, 0x11, 0x95, 0xE4, 0x45, 0x88, 0x69, 0x8A, 0x2B, 0x35, 0xCE, 0xD0, 0xA5, 0x0B,
|
|
||||||
0xD5, 0x5D, 0xAC, 0xDB, 0xAF, 0x11, 0x4D, 0xCA, 0xB8, 0x1E, 0xE7, 0x01, 0x9E, 0xF4, 0x46, 0xA3,
|
|
||||||
0x8A, 0x94, 0x6D, 0x76, 0xBD, 0x8A, 0xC8, 0x3B, 0xD2, 0x31, 0x58, 0x0C, 0x79, 0xA8, 0x26, 0xE9,
|
|
||||||
0xD1, 0x79, 0x9C, 0xCB, 0xD4, 0x2B, 0x6A, 0x4F, 0xC6, 0xCC, 0xCF, 0x90, 0xA7, 0xB9, 0x98, 0x47,
|
|
||||||
0xFD, 0xFA, 0x4C, 0x6C, 0x6F, 0x81, 0x87, 0x3B, 0xCA, 0xB8, 0x50, 0xF6, 0x3E, 0x39, 0x5D, 0x4D,
|
|
||||||
0x97, 0x3F, 0x0F, 0x35, 0x39, 0x53, 0xFB, 0xFA, 0xCD, 0xAB, 0xA8, 0x7A, 0x62, 0x9A, 0x3F, 0xF2,
|
|
||||||
0x09, 0x27, 0x96, 0x3F, 0x07, 0x9A, 0x91, 0xF7, 0x16, 0xBF, 0xC6, 0x3A, 0x82, 0x5A, 0x4B, 0xCF,
|
|
||||||
0x49, 0x50, 0x95, 0x8C, 0x55, 0x80, 0x7E, 0x39, 0xB1, 0x48, 0x05, 0x1E, 0x21, 0xC7, 0x24, 0x4F
|
|
||||||
};
|
|
||||||
|
|
||||||
constinit const u8 Package2RsaPublicModulusDevelopment[se::RsaSize] = {
|
|
||||||
0xB3, 0x65, 0x54, 0xFB, 0x0A, 0xB0, 0x1E, 0x85, 0xA7, 0xF6, 0xCF, 0x91, 0x8E, 0xBA, 0x96, 0x99,
|
|
||||||
0x0D, 0x8B, 0x91, 0x69, 0x2A, 0xEE, 0x01, 0x20, 0x4F, 0x34, 0x5C, 0x2C, 0x4F, 0x4E, 0x37, 0xC7,
|
|
||||||
0xF1, 0x0B, 0xD4, 0xCD, 0xA1, 0x7F, 0x93, 0xF1, 0x33, 0x59, 0xCE, 0xB1, 0xE9, 0xDD, 0x26, 0xE6,
|
|
||||||
0xF3, 0xBB, 0x77, 0x87, 0x46, 0x7A, 0xD6, 0x4E, 0x47, 0x4A, 0xD1, 0x41, 0xB7, 0x79, 0x4A, 0x38,
|
|
||||||
0x06, 0x6E, 0xCF, 0x61, 0x8F, 0xCD, 0xC1, 0x40, 0x0B, 0xFA, 0x26, 0xDC, 0xC0, 0x34, 0x51, 0x83,
|
|
||||||
0xD9, 0x3B, 0x11, 0x54, 0x3B, 0x96, 0x27, 0x32, 0x9A, 0x95, 0xBE, 0x1E, 0x68, 0x11, 0x50, 0xA0,
|
|
||||||
0x6B, 0x10, 0xA8, 0x83, 0x8B, 0xF5, 0xFC, 0xBC, 0x90, 0x84, 0x7A, 0x5A, 0x5C, 0x43, 0x52, 0xE6,
|
|
||||||
0xC8, 0x26, 0xE9, 0xFE, 0x06, 0xA0, 0x8B, 0x53, 0x0F, 0xAF, 0x1E, 0xC4, 0x1C, 0x0B, 0xCF, 0x50,
|
|
||||||
0x1A, 0xA4, 0xF3, 0x5C, 0xFB, 0xF0, 0x97, 0xE4, 0xDE, 0x32, 0x0A, 0x9F, 0xE3, 0x5A, 0xAA, 0xB7,
|
|
||||||
0x44, 0x7F, 0x5C, 0x33, 0x60, 0xB9, 0x0F, 0x22, 0x2D, 0x33, 0x2A, 0xE9, 0x69, 0x79, 0x31, 0x42,
|
|
||||||
0x8F, 0xE4, 0x3A, 0x13, 0x8B, 0xE7, 0x26, 0xBD, 0x08, 0x87, 0x6C, 0xA6, 0xF2, 0x73, 0xF6, 0x8E,
|
|
||||||
0xA7, 0xF2, 0xFE, 0xFB, 0x6C, 0x28, 0x66, 0x0D, 0xBD, 0xD7, 0xEB, 0x42, 0xA8, 0x78, 0xE6, 0xB8,
|
|
||||||
0x6B, 0xAE, 0xC7, 0xA9, 0xE2, 0x40, 0x6E, 0x89, 0x20, 0x82, 0x25, 0x8E, 0x3C, 0x6A, 0x60, 0xD7,
|
|
||||||
0xF3, 0x56, 0x8E, 0xEC, 0x8D, 0x51, 0x8A, 0x63, 0x3C, 0x04, 0x78, 0x23, 0x0E, 0x90, 0x0C, 0xB4,
|
|
||||||
0xE7, 0x86, 0x3B, 0x4F, 0x8E, 0x13, 0x09, 0x47, 0x32, 0x0E, 0x04, 0xB8, 0x4D, 0x5B, 0xB0, 0x46,
|
|
||||||
0x71, 0xB0, 0x5C, 0xF4, 0xAD, 0x63, 0x4F, 0xC5, 0xE2, 0xAC, 0x1E, 0xC4, 0x33, 0x96, 0x09, 0x7B
|
|
||||||
};
|
|
||||||
|
|
||||||
constinit const u8 Package2AesKey[] {
|
|
||||||
0xFB, 0x8B, 0x6A, 0x9C, 0x79, 0x00, 0xC8, 0x49, 0xEF, 0xD2, 0x4D, 0x85, 0x4D, 0x30, 0xA0, 0xC7
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,26 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2018-2020 Atmosphère-NX
|
|
||||||
*
|
|
||||||
* 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/>.
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
#include <exosphere.hpp>
|
|
||||||
|
|
||||||
namespace ams::secmon::boot {
|
|
||||||
|
|
||||||
extern const u8 BootConfigRsaPublicModulus[se::RsaSize];
|
|
||||||
extern const u8 Package2RsaPublicModulusDevelopment[se::RsaSize];
|
|
||||||
extern const u8 Package2RsaPublicModulusProduction[se::RsaSize];
|
|
||||||
extern const u8 Package2AesKey[se::AesBlockSize];
|
|
||||||
|
|
||||||
}
|
|
77
exosphere2/program/source/boot/secmon_boot_key_data.s
Normal file
77
exosphere2/program/source/boot/secmon_boot_key_data.s
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 Atmosphère-NX
|
||||||
|
*
|
||||||
|
* 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.section .volatile_keys._ZN3ams6secmon4boot15VolatileKeyDataE, "aw", %progbits
|
||||||
|
.global _ZN3ams6secmon4boot15VolatileKeyDataE
|
||||||
|
_ZN3ams6secmon4boot15VolatileKeyDataE:
|
||||||
|
/* BootConfig Rsa Modulus. */
|
||||||
|
.byte 0xB5, 0x96, 0x87, 0x31, 0x39, 0xAA, 0xBB, 0x3C, 0x28, 0xF3, 0xF0, 0x65, 0xF1, 0x50, 0x70, 0x64
|
||||||
|
.byte 0xE6, 0x6C, 0x97, 0x50, 0xCD, 0xA6, 0xEE, 0xEA, 0xC3, 0x8F, 0xE6, 0xB5, 0x81, 0x54, 0x65, 0x33
|
||||||
|
.byte 0x1B, 0x88, 0x4B, 0xCE, 0x9F, 0x53, 0xDF, 0xE4, 0xF6, 0xAD, 0xC3, 0x78, 0xD7, 0x3C, 0xD1, 0xDB
|
||||||
|
.byte 0x27, 0x21, 0xA0, 0x24, 0x30, 0x2D, 0x98, 0x41, 0xA8, 0xDF, 0x50, 0x7D, 0xAB, 0xCE, 0x00, 0xD9
|
||||||
|
.byte 0xCB, 0xAC, 0x8F, 0x37, 0xF5, 0x53, 0xE4, 0x97, 0x1F, 0x13, 0x3C, 0x19, 0xFF, 0x05, 0xA7, 0x3B
|
||||||
|
.byte 0xF6, 0xF4, 0x01, 0xDE, 0xF0, 0xC3, 0x77, 0x7B, 0x83, 0xBA, 0xAF, 0x99, 0x30, 0x94, 0x87, 0x25
|
||||||
|
.byte 0x4E, 0x54, 0x42, 0x3F, 0xAC, 0x27, 0xF9, 0xCC, 0x87, 0xDD, 0xAE, 0xF2, 0x54, 0xF3, 0x97, 0x49
|
||||||
|
.byte 0xF4, 0xB0, 0xF8, 0x6D, 0xDA, 0x60, 0xE0, 0xFD, 0x57, 0xAE, 0x55, 0xA9, 0x76, 0xEA, 0x80, 0x24
|
||||||
|
.byte 0xA0, 0x04, 0x7D, 0xBE, 0xD1, 0x81, 0xD3, 0x0C, 0x95, 0xCF, 0xB7, 0xE0, 0x2D, 0x21, 0x21, 0xFF
|
||||||
|
.byte 0x97, 0x1E, 0xB3, 0xD7, 0x9F, 0xBB, 0x33, 0x0C, 0x23, 0xC5, 0x88, 0x4A, 0x33, 0xB9, 0xC9, 0x4E
|
||||||
|
.byte 0x1E, 0x65, 0x51, 0x45, 0xDE, 0xF9, 0x64, 0x7C, 0xF0, 0xBF, 0x11, 0xB4, 0x93, 0x8D, 0x5D, 0xC6
|
||||||
|
.byte 0xAB, 0x37, 0x9E, 0xE9, 0x39, 0xC1, 0xC8, 0xDB, 0xB9, 0xFE, 0x45, 0xCE, 0x7B, 0xDD, 0x72, 0xD9
|
||||||
|
.byte 0x6F, 0x68, 0x13, 0xC0, 0x4B, 0xBA, 0x00, 0xF4, 0x1E, 0x89, 0x71, 0x91, 0x26, 0xA6, 0x46, 0x12
|
||||||
|
.byte 0xDF, 0x29, 0x6B, 0xC2, 0x5A, 0x53, 0xAF, 0xB9, 0x5B, 0xFD, 0x13, 0x9F, 0xD1, 0x8A, 0x7C, 0xB5
|
||||||
|
.byte 0x04, 0xFD, 0x69, 0xEA, 0x23, 0xB4, 0x6D, 0x16, 0x21, 0x98, 0x54, 0xB4, 0xDF, 0xE6, 0xAB, 0x93
|
||||||
|
.byte 0x36, 0xB6, 0xD2, 0x43, 0xCF, 0x2B, 0x98, 0x1D, 0x45, 0xC9, 0xBB, 0x20, 0x42, 0xB1, 0x9D, 0x1D
|
||||||
|
|
||||||
|
/* Package2 Development Rsa Modulus. */
|
||||||
|
.byte 0xB3, 0x65, 0x54, 0xFB, 0x0A, 0xB0, 0x1E, 0x85, 0xA7, 0xF6, 0xCF, 0x91, 0x8E, 0xBA, 0x96, 0x99
|
||||||
|
.byte 0x0D, 0x8B, 0x91, 0x69, 0x2A, 0xEE, 0x01, 0x20, 0x4F, 0x34, 0x5C, 0x2C, 0x4F, 0x4E, 0x37, 0xC7
|
||||||
|
.byte 0xF1, 0x0B, 0xD4, 0xCD, 0xA1, 0x7F, 0x93, 0xF1, 0x33, 0x59, 0xCE, 0xB1, 0xE9, 0xDD, 0x26, 0xE6
|
||||||
|
.byte 0xF3, 0xBB, 0x77, 0x87, 0x46, 0x7A, 0xD6, 0x4E, 0x47, 0x4A, 0xD1, 0x41, 0xB7, 0x79, 0x4A, 0x38
|
||||||
|
.byte 0x06, 0x6E, 0xCF, 0x61, 0x8F, 0xCD, 0xC1, 0x40, 0x0B, 0xFA, 0x26, 0xDC, 0xC0, 0x34, 0x51, 0x83
|
||||||
|
.byte 0xD9, 0x3B, 0x11, 0x54, 0x3B, 0x96, 0x27, 0x32, 0x9A, 0x95, 0xBE, 0x1E, 0x68, 0x11, 0x50, 0xA0
|
||||||
|
.byte 0x6B, 0x10, 0xA8, 0x83, 0x8B, 0xF5, 0xFC, 0xBC, 0x90, 0x84, 0x7A, 0x5A, 0x5C, 0x43, 0x52, 0xE6
|
||||||
|
.byte 0xC8, 0x26, 0xE9, 0xFE, 0x06, 0xA0, 0x8B, 0x53, 0x0F, 0xAF, 0x1E, 0xC4, 0x1C, 0x0B, 0xCF, 0x50
|
||||||
|
.byte 0x1A, 0xA4, 0xF3, 0x5C, 0xFB, 0xF0, 0x97, 0xE4, 0xDE, 0x32, 0x0A, 0x9F, 0xE3, 0x5A, 0xAA, 0xB7
|
||||||
|
.byte 0x44, 0x7F, 0x5C, 0x33, 0x60, 0xB9, 0x0F, 0x22, 0x2D, 0x33, 0x2A, 0xE9, 0x69, 0x79, 0x31, 0x42
|
||||||
|
.byte 0x8F, 0xE4, 0x3A, 0x13, 0x8B, 0xE7, 0x26, 0xBD, 0x08, 0x87, 0x6C, 0xA6, 0xF2, 0x73, 0xF6, 0x8E
|
||||||
|
.byte 0xA7, 0xF2, 0xFE, 0xFB, 0x6C, 0x28, 0x66, 0x0D, 0xBD, 0xD7, 0xEB, 0x42, 0xA8, 0x78, 0xE6, 0xB8
|
||||||
|
.byte 0x6B, 0xAE, 0xC7, 0xA9, 0xE2, 0x40, 0x6E, 0x89, 0x20, 0x82, 0x25, 0x8E, 0x3C, 0x6A, 0x60, 0xD7
|
||||||
|
.byte 0xF3, 0x56, 0x8E, 0xEC, 0x8D, 0x51, 0x8A, 0x63, 0x3C, 0x04, 0x78, 0x23, 0x0E, 0x90, 0x0C, 0xB4
|
||||||
|
.byte 0xE7, 0x86, 0x3B, 0x4F, 0x8E, 0x13, 0x09, 0x47, 0x32, 0x0E, 0x04, 0xB8, 0x4D, 0x5B, 0xB0, 0x46
|
||||||
|
.byte 0x71, 0xB0, 0x5C, 0xF4, 0xAD, 0x63, 0x4F, 0xC5, 0xE2, 0xAC, 0x1E, 0xC4, 0x33, 0x96, 0x09, 0x7B
|
||||||
|
|
||||||
|
/* Package2 Production Rsa Modulus. */
|
||||||
|
.byte 0x8D, 0x13, 0xA7, 0x77, 0x6A, 0xE5, 0xDC, 0xC0, 0x3B, 0x25, 0xD0, 0x58, 0xE4, 0x20, 0x69, 0x59
|
||||||
|
.byte 0x55, 0x4B, 0xAB, 0x70, 0x40, 0x08, 0x28, 0x07, 0xA8, 0xA7, 0xFD, 0x0F, 0x31, 0x2E, 0x11, 0xFE
|
||||||
|
.byte 0x47, 0xA0, 0xF9, 0x9D, 0xDF, 0x80, 0xDB, 0x86, 0x5A, 0x27, 0x89, 0xCD, 0x97, 0x6C, 0x85, 0xC5
|
||||||
|
.byte 0x6C, 0x39, 0x7F, 0x41, 0xF2, 0xFF, 0x24, 0x20, 0xC3, 0x95, 0xA6, 0xF7, 0x9D, 0x4A, 0x45, 0x74
|
||||||
|
.byte 0x8B, 0x5D, 0x28, 0x8A, 0xC6, 0x99, 0x35, 0x68, 0x85, 0xA5, 0x64, 0x32, 0x80, 0x9F, 0xD3, 0x48
|
||||||
|
.byte 0x39, 0xA2, 0x1D, 0x24, 0x67, 0x69, 0xDF, 0x75, 0xAC, 0x12, 0xB5, 0xBD, 0xC3, 0x29, 0x90, 0xBE
|
||||||
|
.byte 0x37, 0xE4, 0xA0, 0x80, 0x9A, 0xBE, 0x36, 0xBF, 0x1F, 0x2C, 0xAB, 0x2B, 0xAD, 0xF5, 0x97, 0x32
|
||||||
|
.byte 0x9A, 0x42, 0x9D, 0x09, 0x8B, 0x08, 0xF0, 0x63, 0x47, 0xA3, 0xE9, 0x1B, 0x36, 0xD8, 0x2D, 0x8A
|
||||||
|
.byte 0xD7, 0xE1, 0x54, 0x11, 0x95, 0xE4, 0x45, 0x88, 0x69, 0x8A, 0x2B, 0x35, 0xCE, 0xD0, 0xA5, 0x0B
|
||||||
|
.byte 0xD5, 0x5D, 0xAC, 0xDB, 0xAF, 0x11, 0x4D, 0xCA, 0xB8, 0x1E, 0xE7, 0x01, 0x9E, 0xF4, 0x46, 0xA3
|
||||||
|
.byte 0x8A, 0x94, 0x6D, 0x76, 0xBD, 0x8A, 0xC8, 0x3B, 0xD2, 0x31, 0x58, 0x0C, 0x79, 0xA8, 0x26, 0xE9
|
||||||
|
.byte 0xD1, 0x79, 0x9C, 0xCB, 0xD4, 0x2B, 0x6A, 0x4F, 0xC6, 0xCC, 0xCF, 0x90, 0xA7, 0xB9, 0x98, 0x47
|
||||||
|
.byte 0xFD, 0xFA, 0x4C, 0x6C, 0x6F, 0x81, 0x87, 0x3B, 0xCA, 0xB8, 0x50, 0xF6, 0x3E, 0x39, 0x5D, 0x4D
|
||||||
|
.byte 0x97, 0x3F, 0x0F, 0x35, 0x39, 0x53, 0xFB, 0xFA, 0xCD, 0xAB, 0xA8, 0x7A, 0x62, 0x9A, 0x3F, 0xF2
|
||||||
|
.byte 0x09, 0x27, 0x96, 0x3F, 0x07, 0x9A, 0x91, 0xF7, 0x16, 0xBF, 0xC6, 0x3A, 0x82, 0x5A, 0x4B, 0xCF
|
||||||
|
.byte 0x49, 0x50, 0x95, 0x8C, 0x55, 0x80, 0x7E, 0x39, 0xB1, 0x48, 0x05, 0x1E, 0x21, 0xC7, 0x24, 0x4F
|
||||||
|
|
||||||
|
/* Package2 Aes Key Source. */
|
||||||
|
.byte 0xFB, 0x8B, 0x6A, 0x9C, 0x79, 0x00, 0xC8, 0x49, 0xEF, 0xD2, 0x4D, 0x85, 0x4D, 0x30, 0xA0, 0xC7
|
|
@ -73,9 +73,6 @@ namespace ams::secmon {
|
||||||
|
|
||||||
/* Alert the bootloader that we're initialized. */
|
/* Alert the bootloader that we're initialized. */
|
||||||
secmon_params.secmon_state = pkg1::SecureMonitorState_Initialized;
|
secmon_params.secmon_state = pkg1::SecureMonitorState_Initialized;
|
||||||
|
|
||||||
/* Initialize the random cache. */
|
|
||||||
secmon::smc::FillRandomCache();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Wait for NX Bootloader to finish loading the BootConfig. */
|
/* Wait for NX Bootloader to finish loading the BootConfig. */
|
||||||
|
@ -129,7 +126,7 @@ namespace ams::secmon {
|
||||||
secmon::boot::WaitForNxBootloader(secmon_params, pkg1::BootloaderState_LoadedPackage2);
|
secmon::boot::WaitForNxBootloader(secmon_params, pkg1::BootloaderState_LoadedPackage2);
|
||||||
|
|
||||||
/* Parse and decrypt the package2 header. */
|
/* Parse and decrypt the package2 header. */
|
||||||
pkg2::Package2Meta pkg2_meta;
|
pkg2::Package2Meta &pkg2_meta = secmon::boot::GetEphemeralPackage2Meta();
|
||||||
const uintptr_t pkg2_payloads_start = MemoryRegionDramPackage2.GetAddress() + sizeof(pkg2::Package2Header);
|
const uintptr_t pkg2_payloads_start = MemoryRegionDramPackage2.GetAddress() + sizeof(pkg2::Package2Header);
|
||||||
{
|
{
|
||||||
/* Read the encrypred header. */
|
/* Read the encrypred header. */
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
#include "../secmon_error.hpp"
|
#include "../secmon_error.hpp"
|
||||||
#include "../secmon_key_storage.hpp"
|
#include "../secmon_key_storage.hpp"
|
||||||
#include "secmon_boot.hpp"
|
#include "secmon_boot.hpp"
|
||||||
#include "secmon_boot_key_data.hpp"
|
|
||||||
|
|
||||||
namespace ams::secmon::boot {
|
namespace ams::secmon::boot {
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,10 @@ _ZN3ams6secmon5StartEv:
|
||||||
ldr x20, =0x1F01F9000
|
ldr x20, =0x1F01F9000
|
||||||
mov sp, x20
|
mov sp, x20
|
||||||
|
|
||||||
|
/* Initialize the random cache. */
|
||||||
|
/* NOTE: Nintendo does this much earlier, but we reuse volatile space. */
|
||||||
|
bl _ZN3ams6secmon3smc15FillRandomCacheEv
|
||||||
|
|
||||||
/* Unmap the boot code region. */
|
/* Unmap the boot code region. */
|
||||||
bl _ZN3ams6secmon13UnmapBootCodeEv
|
bl _ZN3ams6secmon13UnmapBootCodeEv
|
||||||
|
|
||||||
|
|
|
@ -280,7 +280,7 @@ namespace ams::secmon {
|
||||||
static_assert(MemoryRegionVirtual.Contains(MemoryRegionVirtualTzramL2L3PageTable));
|
static_assert(MemoryRegionVirtual.Contains(MemoryRegionVirtualTzramL2L3PageTable));
|
||||||
static_assert(MemoryRegionPhysicalTzramNonVolatile.Contains(MemoryRegionPhysicalTzramL2L3PageTable));
|
static_assert(MemoryRegionPhysicalTzramNonVolatile.Contains(MemoryRegionPhysicalTzramL2L3PageTable));
|
||||||
|
|
||||||
constexpr inline const MemoryRegion MemoryRegionPhysicalTzramFullProgramImage = MemoryRegion(UINT64_C(0x7C010800), 0xD800);
|
constexpr inline const MemoryRegion MemoryRegionPhysicalTzramFullProgramImage = MemoryRegion(UINT64_C(0x7C010000), 0xE000);
|
||||||
constexpr inline const MemoryRegion MemoryRegionPhysicalIramBootCodeImage = MemoryRegion(UINT64_C(0x40032000), 0xC000);
|
constexpr inline const MemoryRegion MemoryRegionPhysicalIramBootCodeImage = MemoryRegion(UINT64_C(0x40032000), 0xC000);
|
||||||
|
|
||||||
constexpr inline const MemoryRegion MemoryRegionPhysicalIramWarmbootBin = MemoryRegion(UINT64_C(0x4003E000), 0x17F0);
|
constexpr inline const MemoryRegion MemoryRegionPhysicalIramWarmbootBin = MemoryRegion(UINT64_C(0x4003E000), 0x17F0);
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <vapours.hpp>
|
#include <vapours.hpp>
|
||||||
|
#include <exosphere/pkg2.hpp>
|
||||||
|
|
||||||
namespace ams::secmon {
|
namespace ams::secmon {
|
||||||
|
|
||||||
|
@ -23,10 +24,22 @@ namespace ams::secmon {
|
||||||
|
|
||||||
constexpr inline const size_t CoreExceptionStackSize = 0x80;
|
constexpr inline const size_t CoreExceptionStackSize = 0x80;
|
||||||
|
|
||||||
|
/* Volatile keydata that we lose access to after boot. */
|
||||||
|
struct VolatileKeys {
|
||||||
|
u8 boot_config_rsa_modulus[0x100];
|
||||||
|
u8 package2_dev_rsa_modulus[0x100];
|
||||||
|
u8 package2_prod_rsa_modulus[0x100];
|
||||||
|
u8 package2_aes_key[0x10];
|
||||||
|
};
|
||||||
|
|
||||||
/* Nintendo uses the bottom 0x740 of this as a stack for warmboot setup, and another 0x740 for the core 0/1/2 SMC stacks. */
|
/* Nintendo uses the bottom 0x740 of this as a stack for warmboot setup, and another 0x740 for the core 0/1/2 SMC stacks. */
|
||||||
/* This is...wasteful. The warmboot stack is not deep. We will thus save 1K+ of nonvolatile storage by keeping the random cache in here. */
|
/* This is...wasteful. The warmboot stack is not deep. We will thus save 1K+ of nonvolatile storage by keeping the random cache in here. */
|
||||||
struct VolatileData {
|
struct VolatileData {
|
||||||
|
union {
|
||||||
u8 random_cache[0x400];
|
u8 random_cache[0x400];
|
||||||
|
VolatileKeys keys;
|
||||||
|
pkg2::Package2Meta pkg2_meta;
|
||||||
|
};
|
||||||
u8 se_work_block[crypto::AesEncryptor128::BlockSize];
|
u8 se_work_block[crypto::AesEncryptor128::BlockSize];
|
||||||
u8 reserved_danger_zone[0x30]; /* This memory is "available", but careful consideration must be taken before declaring it used. */
|
u8 reserved_danger_zone[0x30]; /* This memory is "available", but careful consideration must be taken before declaring it used. */
|
||||||
u8 warmboot_stack[0x380];
|
u8 warmboot_stack[0x380];
|
||||||
|
@ -35,6 +48,8 @@ namespace ams::secmon {
|
||||||
};
|
};
|
||||||
static_assert(util::is_pod<VolatileData>::value);
|
static_assert(util::is_pod<VolatileData>::value);
|
||||||
static_assert(sizeof(VolatileData) == 0x1000);
|
static_assert(sizeof(VolatileData) == 0x1000);
|
||||||
|
static_assert(sizeof(VolatileKeys{}.boot_config_rsa_modulus) == sizeof(pkg2::Package2Meta));
|
||||||
|
static_assert(offsetof(VolatileData, keys.boot_config_rsa_modulus) == offsetof(VolatileData, pkg2_meta));
|
||||||
|
|
||||||
ALWAYS_INLINE VolatileData &GetVolatileData() {
|
ALWAYS_INLINE VolatileData &GetVolatileData() {
|
||||||
return *MemoryRegionVirtualTzramVolatileData.GetPointer<VolatileData>();
|
return *MemoryRegionVirtualTzramVolatileData.GetPointer<VolatileData>();
|
||||||
|
@ -52,6 +67,27 @@ namespace ams::secmon {
|
||||||
return GetVolatileData().se_work_block;
|
return GetVolatileData().se_work_block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace boot {
|
||||||
|
|
||||||
|
ALWAYS_INLINE const u8 *GetBootConfigRsaModulus() {
|
||||||
|
return GetVolatileData().keys.boot_config_rsa_modulus;
|
||||||
|
}
|
||||||
|
|
||||||
|
ALWAYS_INLINE const u8 *GetPackage2RsaModulus(bool is_prod) {
|
||||||
|
auto &volatile_data = GetVolatileData();
|
||||||
|
return is_prod ? volatile_data.keys.package2_prod_rsa_modulus : volatile_data.keys.package2_dev_rsa_modulus;
|
||||||
|
}
|
||||||
|
|
||||||
|
ALWAYS_INLINE const u8 *GetPackage2AesKey() {
|
||||||
|
return GetVolatileData().keys.package2_aes_key;
|
||||||
|
}
|
||||||
|
|
||||||
|
ALWAYS_INLINE pkg2::Package2Meta &GetEphemeralPackage2Meta() {
|
||||||
|
return GetVolatileData().pkg2_meta;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
constexpr inline const Address WarmbootStackAddress = MemoryRegionVirtualTzramVolatileData.GetAddress() + offsetof(VolatileData, warmboot_stack) + sizeof(VolatileData::warmboot_stack);
|
constexpr inline const Address WarmbootStackAddress = MemoryRegionVirtualTzramVolatileData.GetAddress() + offsetof(VolatileData, warmboot_stack) + sizeof(VolatileData::warmboot_stack);
|
||||||
constexpr inline const Address Core012SmcStackAddress = MemoryRegionVirtualTzramVolatileData.GetAddress() + offsetof(VolatileData, core012_smc_stack) + sizeof(VolatileData::core012_smc_stack);
|
constexpr inline const Address Core012SmcStackAddress = MemoryRegionVirtualTzramVolatileData.GetAddress() + offsetof(VolatileData, core012_smc_stack) + sizeof(VolatileData::core012_smc_stack);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue