meso: use BitPack

This commit is contained in:
Michael Scire 2020-01-02 03:30:10 -08:00
parent 0d8bde6079
commit 43c0e39c34
3 changed files with 23 additions and 16 deletions

View file

@ -33,10 +33,10 @@ namespace ams::kern {
return static_cast<size_t>(config_value & 0x3FFF) << 20; return static_cast<size_t>(config_value & 0x3FFF) << 20;
} }
ALWAYS_INLINE u64 GetKernelConfigurationForInit() { ALWAYS_INLINE util::BitPack32 GetKernelConfigurationForInit() {
u64 value = 0; u64 value = 0;
smc::init::GetConfig(&value, 1, smc::ConfigItem::KernelConfiguration); smc::init::GetConfig(&value, 1, smc::ConfigItem::KernelConfiguration);
return value; return util::BitPack32{static_cast<u32>(value)};
} }
ALWAYS_INLINE u64 GenerateRandomU64ForInit() { ALWAYS_INLINE u64 GenerateRandomU64ForInit() {
@ -45,18 +45,14 @@ namespace ams::kern {
return value; return value;
} }
ALWAYS_INLINE smc::MemoryMode GetMemoryModeForInit() {
return static_cast<smc::MemoryMode>((GetKernelConfigurationForInit() >> 10) & 0x3);
}
ALWAYS_INLINE size_t GetIntendedMemorySizeForInit() { ALWAYS_INLINE size_t GetIntendedMemorySizeForInit() {
switch (GetMemoryModeForInit()) { switch (GetKernelConfigurationForInit().Get<smc::KernelConfiguration::MemorySize>()) {
case smc::MemoryMode_4GB: case smc::MemorySize_4GB:
default: /* All invalid modes should go to 4GB. */ default: /* All invalid modes should go to 4GB. */
return FourGigabytes; return FourGigabytes;
case smc::MemoryMode_6GB: case smc::MemorySize_6GB:
return SixGigabytes; return SixGigabytes;
case smc::MemoryMode_8GB: case smc::MemorySize_8GB:
return EightGigabytes; return EightGigabytes;
} }
} }
@ -75,7 +71,7 @@ namespace ams::kern {
} }
bool KSystemControl::Init::ShouldIncreaseThreadResourceLimit() { bool KSystemControl::Init::ShouldIncreaseThreadResourceLimit() {
return (GetKernelConfigurationForInit() >> 3) & 1; return GetKernelConfigurationForInit().Get<smc::KernelConfiguration::IncreaseThreadResourceLimit>();
} }
/* Randomness for Initialization. */ /* Randomness for Initialization. */

View file

@ -19,10 +19,10 @@
namespace ams::kern::smc { namespace ams::kern::smc {
/* Types. */ /* Types. */
enum MemoryMode { enum MemorySize {
MemoryMode_4GB = 0, MemorySize_4GB = 0,
MemoryMode_6GB = 1, MemorySize_6GB = 1,
MemoryMode_8GB = 2, MemorySize_8GB = 2,
}; };
enum class ConfigItem : u32 { enum class ConfigItem : u32 {
@ -63,6 +63,17 @@ namespace ams::kern::smc {
NotPermitted = 6, NotPermitted = 6,
}; };
struct KernelConfiguration {
using DebugFillMemory = util::BitPack32::Field<0, 1, bool>;
using EnableUserExceptionHandlers = util::BitPack32::Field<DebugFillMemory::Next, 1, bool>;
using EnableUserPmuAccess = util::BitPack32::Field<EnableUserExceptionHandlers::Next, 1, bool>;
using IncreaseThreadResourceLimit = util::BitPack32::Field<EnableUserPmuAccess::Next, 1, bool>;
using Reserved4 = util::BitPack32::Field<IncreaseThreadResourceLimit::Next, 4, u32>;
using UseSecureMonitorPanicCall = util::BitPack32::Field<Reserved4::Next, 1, bool>;
using Reserved9 = util::BitPack32::Field<UseSecureMonitorPanicCall::Next, 7, u32>;
using MemorySize = util::BitPack32::Field<Reserved9::Next, 2, smc::MemorySize>;
};
/* TODO: Rest of Secure Monitor API. */ /* TODO: Rest of Secure Monitor API. */
void NORETURN Panic(u32 color); void NORETURN Panic(u32 color);

View file

@ -50,7 +50,7 @@ namespace ams::util {
using BitPackType = BitPack<IntegralStorageType>; using BitPackType = BitPack<IntegralStorageType>;
static_assert(Mask<Index, Count> != 0); static_assert(Mask<Index, Count> != 0);
static_assert(std::is_integral<T>::value); static_assert(std::is_integral<T>::value || std::is_enum<T>::value);
static_assert(!std::is_same<T, bool>::value || Count == 1); static_assert(!std::is_same<T, bool>::value || Count == 1);
}; };
private: private: