diff --git a/libexosphere/include/exosphere/secmon/secmon_memory_layout.hpp b/libexosphere/include/exosphere/secmon/secmon_memory_layout.hpp index 7cc8d2c6..196c1f87 100644 --- a/libexosphere/include/exosphere/secmon/secmon_memory_layout.hpp +++ b/libexosphere/include/exosphere/secmon/secmon_memory_layout.hpp @@ -224,7 +224,7 @@ namespace ams::secmon { static_assert(MemoryRegionVirtual.Contains(MemoryRegionVirtualIramSc7Firmware)); static_assert(MemoryRegionPhysicalIram.Contains(MemoryRegionPhysicalIramSc7Firmware)); - constexpr inline const MemoryRegion MemoryRegionPhysicalIramSecureMonitorDebug(UINT64_C(0x40030000), 0x8000); + constexpr inline const MemoryRegion MemoryRegionPhysicalIramSecureMonitorDebug(UINT64_C(0x40034000), 0x4000); static_assert(MemoryRegionPhysicalIram.Contains(MemoryRegionPhysicalIramSecureMonitorDebug)); constexpr inline const MemoryRegion MemoryRegionVirtualDebugCode = MemoryRegion(UINT64_C(0x1F0150000), 0x4000); @@ -289,7 +289,6 @@ namespace ams::secmon { static_assert(MemoryRegionVirtual.Contains(MemoryRegionVirtualTzramConfigurationData)); static_assert(MemoryRegionPhysicalTzramNonVolatile.Contains(MemoryRegionPhysicalTzramConfigurationData)); - constexpr inline const MemoryRegion MemoryRegionVirtualTzramL1PageTable = MemoryRegion(UINT64_C(0x1F01FCFC0), 0x40); constexpr inline const MemoryRegion MemoryRegionPhysicalTzramL1PageTable = MemoryRegion( UINT64_C(0x7C01EFC0), 0x40); static_assert(MemoryRegionPhysicalTzramConfigurationData.Contains(MemoryRegionPhysicalTzramL1PageTable)); @@ -299,8 +298,11 @@ namespace ams::secmon { static_assert(MemoryRegionVirtual.Contains(MemoryRegionVirtualTzramL2L3PageTable)); static_assert(MemoryRegionPhysicalTzramNonVolatile.Contains(MemoryRegionPhysicalTzramL2L3PageTable)); - constexpr inline const MemoryRegion MemoryRegionPhysicalTzramFullProgramImage = MemoryRegion(UINT64_C(0x7C010000), 0xE000); - constexpr inline const MemoryRegion MemoryRegionPhysicalIramBootCodeImage = MemoryRegion(UINT64_C(0x40032000), 0xC000); + constexpr inline const MemoryRegion MemoryRegionPhysicalTzramFullProgramImage = MemoryRegion(UINT64_C(0x7C010800), 0xD800); + constexpr inline const MemoryRegion MemoryRegionPhysicalIramBootCodeImage = MemoryRegion(UINT64_C(0x40032000), 0x6000); + + constexpr inline const MemoryRegion MemoryRegionPhysicalIramBootCodeCode = MemoryRegion(UINT64_C(0x40032000), 0x1000); + constexpr inline const MemoryRegion MemoryRegionPhysicalIramBootCodeKeys = MemoryRegion(UINT64_C(0x40033000), 0x1000); constexpr inline const MemoryRegion MemoryRegionPhysicalIramWarmbootBin = MemoryRegion(UINT64_C(0x4003E000), 0x17F0); constexpr inline const MemoryRegion MemoryRegionPhysicalIramBootConfig = MemoryRegion(UINT64_C(0x4003F800), 0x400); diff --git a/libexosphere/include/exosphere/secmon/secmon_volatile_context.hpp b/libexosphere/include/exosphere/secmon/secmon_volatile_context.hpp index 33210818..d3940278 100644 --- a/libexosphere/include/exosphere/secmon/secmon_volatile_context.hpp +++ b/libexosphere/include/exosphere/secmon/secmon_volatile_context.hpp @@ -30,17 +30,19 @@ namespace ams::secmon { u8 package2_dev_rsa_modulus[0x100]; u8 package2_prod_rsa_modulus[0x100]; u8 package2_aes_key[0x10]; + u8 padding[0xCF0]; }; + static_assert(util::is_pod::value); + static_assert(sizeof(VolatileKeys) == 0x1000); /* 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. */ struct VolatileData { + u8 se_work_block[crypto::AesEncryptor128::BlockSize]; union { u8 random_cache[0x400]; - VolatileKeys keys; pkg2::Package2Meta pkg2_meta; }; - 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 warmboot_stack[0x380]; u8 core012_smc_stack[0x6C0]; @@ -48,8 +50,6 @@ namespace ams::secmon { }; static_assert(util::is_pod::value); 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() { return *MemoryRegionVirtualTzramVolatileData.GetPointer(); @@ -69,17 +69,21 @@ namespace ams::secmon { namespace boot { + ALWAYS_INLINE VolatileKeys &GetVolatileKeys() { + return *MemoryRegionPhysicalIramBootCodeKeys.GetPointer(); + } + ALWAYS_INLINE const u8 *GetBootConfigRsaModulus() { - return GetVolatileData().keys.boot_config_rsa_modulus; + return GetVolatileKeys().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; + auto &keys = GetVolatileKeys(); + return is_prod ? keys.package2_prod_rsa_modulus : keys.package2_dev_rsa_modulus; } ALWAYS_INLINE const u8 *GetPackage2AesKey() { - return GetVolatileData().keys.package2_aes_key; + return GetVolatileKeys().package2_aes_key; } ALWAYS_INLINE pkg2::Package2Meta &GetEphemeralPackage2Meta() {