diff --git a/libraries/libmesosphere/source/board/nintendo/switch/kern_k_system_control.cpp b/libraries/libmesosphere/source/board/nintendo/switch/kern_k_system_control.cpp index 6746223c2..87b1ecd41 100644 --- a/libraries/libmesosphere/source/board/nintendo/switch/kern_k_system_control.cpp +++ b/libraries/libmesosphere/source/board/nintendo/switch/kern_k_system_control.cpp @@ -33,10 +33,10 @@ namespace ams::kern { return static_cast(config_value & 0x3FFF) << 20; } - ALWAYS_INLINE u64 GetKernelConfigurationForInit() { + ALWAYS_INLINE util::BitPack32 GetKernelConfigurationForInit() { u64 value = 0; smc::init::GetConfig(&value, 1, smc::ConfigItem::KernelConfiguration); - return value; + return util::BitPack32{static_cast(value)}; } ALWAYS_INLINE u64 GenerateRandomU64ForInit() { @@ -45,18 +45,14 @@ namespace ams::kern { return value; } - ALWAYS_INLINE smc::MemoryMode GetMemoryModeForInit() { - return static_cast((GetKernelConfigurationForInit() >> 10) & 0x3); - } - ALWAYS_INLINE size_t GetIntendedMemorySizeForInit() { - switch (GetMemoryModeForInit()) { - case smc::MemoryMode_4GB: + switch (GetKernelConfigurationForInit().Get()) { + case smc::MemorySize_4GB: default: /* All invalid modes should go to 4GB. */ return FourGigabytes; - case smc::MemoryMode_6GB: + case smc::MemorySize_6GB: return SixGigabytes; - case smc::MemoryMode_8GB: + case smc::MemorySize_8GB: return EightGigabytes; } } @@ -75,7 +71,7 @@ namespace ams::kern { } bool KSystemControl::Init::ShouldIncreaseThreadResourceLimit() { - return (GetKernelConfigurationForInit() >> 3) & 1; + return GetKernelConfigurationForInit().Get(); } /* Randomness for Initialization. */ diff --git a/libraries/libmesosphere/source/board/nintendo/switch/kern_secure_monitor.hpp b/libraries/libmesosphere/source/board/nintendo/switch/kern_secure_monitor.hpp index e3c88b2fa..00e1ac5d0 100644 --- a/libraries/libmesosphere/source/board/nintendo/switch/kern_secure_monitor.hpp +++ b/libraries/libmesosphere/source/board/nintendo/switch/kern_secure_monitor.hpp @@ -19,10 +19,10 @@ namespace ams::kern::smc { /* Types. */ - enum MemoryMode { - MemoryMode_4GB = 0, - MemoryMode_6GB = 1, - MemoryMode_8GB = 2, + enum MemorySize { + MemorySize_4GB = 0, + MemorySize_6GB = 1, + MemorySize_8GB = 2, }; enum class ConfigItem : u32 { @@ -63,6 +63,17 @@ namespace ams::kern::smc { NotPermitted = 6, }; + struct KernelConfiguration { + using DebugFillMemory = util::BitPack32::Field<0, 1, bool>; + using EnableUserExceptionHandlers = util::BitPack32::Field; + using EnableUserPmuAccess = util::BitPack32::Field; + using IncreaseThreadResourceLimit = util::BitPack32::Field; + using Reserved4 = util::BitPack32::Field; + using UseSecureMonitorPanicCall = util::BitPack32::Field; + using Reserved9 = util::BitPack32::Field; + using MemorySize = util::BitPack32::Field; + }; + /* TODO: Rest of Secure Monitor API. */ void NORETURN Panic(u32 color); diff --git a/libraries/libvapours/include/vapours/util/util_bitpack.hpp b/libraries/libvapours/include/vapours/util/util_bitpack.hpp index 914d5b2d8..6d60af0d9 100644 --- a/libraries/libvapours/include/vapours/util/util_bitpack.hpp +++ b/libraries/libvapours/include/vapours/util/util_bitpack.hpp @@ -50,7 +50,7 @@ namespace ams::util { using BitPackType = BitPack; static_assert(Mask != 0); - static_assert(std::is_integral::value); + static_assert(std::is_integral::value || std::is_enum::value); static_assert(!std::is_same::value || Count == 1); }; private: