diff --git a/exosphere/program/source/smc/secmon_smc_info.cpp b/exosphere/program/source/smc/secmon_smc_info.cpp index af030aeda..6bcd0ddd6 100644 --- a/exosphere/program/source/smc/secmon_smc_info.cpp +++ b/exosphere/program/source/smc/secmon_smc_info.cpp @@ -132,10 +132,13 @@ namespace ams::secmon::smc { } u32 GetMemoryMode() { - /* Unless development function is enabled, we're 4 GB. */ + /* Unless development function is enabled or memory_mode_auto is set, we're 4 GB. */ u32 memory_mode = pkg1::MemoryMode_4GB; - if (const auto &bcd = GetBootConfig().data; bcd.IsDevelopmentFunctionEnabled()) { + if (GetSecmonConfiguration().IsMemoryModeAuto()) { + /* If memory_mode_auto is set, determine memory mode from physical memory */ + memory_mode = GetMemoryMode(pkg1::MemoryMode_Auto); + } else if (const auto &bcd = GetBootConfig().data; bcd.IsDevelopmentFunctionEnabled()) { memory_mode = GetMemoryMode(bcd.GetMemoryMode()); } diff --git a/fusee/program/source/fusee_setup_horizon.cpp b/fusee/program/source/fusee_setup_horizon.cpp index cfe87dd74..f75858765 100644 --- a/fusee/program/source/fusee_setup_horizon.cpp +++ b/fusee/program/source/fusee_setup_horizon.cpp @@ -463,6 +463,10 @@ namespace ams::nxboot { if (entry.value[0] == '1') { storage_ctx.log_flags |= uart::Flag_Inverted; } + } else if (std::strcmp(entry.key, "memory_mode_auto") == 0) { + if (entry.value[0] == '1') { + storage_ctx.memory_mode_auto = 1; + } } } } diff --git a/libraries/libexosphere/include/exosphere/secmon/secmon_monitor_context.hpp b/libraries/libexosphere/include/exosphere/secmon/secmon_monitor_context.hpp index dd1286f33..3223202bf 100644 --- a/libraries/libexosphere/include/exosphere/secmon/secmon_monitor_context.hpp +++ b/libraries/libexosphere/include/exosphere/secmon/secmon_monitor_context.hpp @@ -44,7 +44,8 @@ namespace ams::secmon { u8 log_port; u8 log_flags; u32 log_baud_rate; - u32 reserved1[2]; + u8 memory_mode_auto; + u8 reserved1[7]; EmummcConfiguration emummc_cfg; constexpr bool IsValid() const { return this->magic == Magic; } @@ -62,18 +63,19 @@ namespace ams::secmon { u32 flags[2]; u16 lcd_vendor; u8 log_flags; - u8 reserved0; + u8 memory_mode_auto; u32 log_baud_rate; u32 reserved1[(0x80 - 0x1C) / sizeof(u32)]; constexpr void CopyFrom(const SecureMonitorStorageConfiguration &storage) { - this->target_firmware = storage.target_firmware; - this->flags[0] = storage.flags[0]; - this->flags[1] = storage.flags[1]; - this->lcd_vendor = storage.lcd_vendor; - this->log_port = storage.log_port; - this->log_flags = storage.log_flags; - this->log_baud_rate = storage.log_baud_rate != 0 ? storage.log_baud_rate : 115200; + this->target_firmware = storage.target_firmware; + this->flags[0] = storage.flags[0]; + this->flags[1] = storage.flags[1]; + this->lcd_vendor = storage.lcd_vendor; + this->log_port = storage.log_port; + this->log_flags = storage.log_flags; + this->log_baud_rate = storage.log_baud_rate != 0 ? storage.log_baud_rate : 115200; + this->memory_mode_auto = storage.memory_mode_auto; } void SetFuseInfo() { @@ -95,6 +97,7 @@ namespace ams::secmon { constexpr u32 GetLogBaudRate() const { return this->log_baud_rate; } constexpr bool IsProduction() const { return this->GetHardwareState() != fuse::HardwareState_Development; } + constexpr bool IsMemoryModeAuto() const { return (this->memory_mode_auto); } constexpr bool IsDevelopmentFunctionEnabledForKernel() const { return (this->flags[0] & SecureMonitorConfigurationFlag_IsDevelopmentFunctionEnabledForKernel) != 0; } constexpr bool IsDevelopmentFunctionEnabledForUser() const { return (this->flags[0] & SecureMonitorConfigurationFlag_IsDevelopmentFunctionEnabledForUser) != 0; } @@ -110,18 +113,18 @@ namespace ams::secmon { static_assert(sizeof(SecureMonitorConfiguration) == 0x80); constexpr inline const SecureMonitorConfiguration DefaultSecureMonitorConfiguration = { - .target_firmware = ams::TargetFirmware_Current, - .key_generation = {}, - .hardware_type = {}, - .soc_type = {}, - .hardware_state = {}, - .log_port = uart::Port_ReservedDebug, - .flags = { SecureMonitorConfigurationFlag_Default, SecureMonitorConfigurationFlag_None }, - .lcd_vendor = {}, - .log_flags = {}, - .reserved0 = {}, - .log_baud_rate = 115200, - .reserved1 = {}, + .target_firmware = ams::TargetFirmware_Current, + .key_generation = {}, + .hardware_type = {}, + .soc_type = {}, + .hardware_state = {}, + .log_port = uart::Port_ReservedDebug, + .flags = { SecureMonitorConfigurationFlag_Default, SecureMonitorConfigurationFlag_None }, + .lcd_vendor = {}, + .log_flags = {}, + .memory_mode_auto = {}, + .log_baud_rate = 115200, + .reserved1 = {}, }; }