mirror of
https://github.com/Atmosphere-NX/Atmosphere
synced 2024-12-22 12:21:18 +00:00
kern: move KTargetSystem into .rodata, split init/verify
This commit is contained in:
parent
3394a88a1a
commit
743634c3fd
6 changed files with 83 additions and 54 deletions
|
@ -45,6 +45,7 @@ namespace ams::kern::board::nintendo::nx {
|
||||||
};
|
};
|
||||||
public:
|
public:
|
||||||
/* Initialization. */
|
/* Initialization. */
|
||||||
|
static NOINLINE void ConfigureKTargetSystem();
|
||||||
static NOINLINE void InitializePhase1();
|
static NOINLINE void InitializePhase1();
|
||||||
static NOINLINE void InitializePhase2();
|
static NOINLINE void InitializePhase2();
|
||||||
static NOINLINE u32 GetCreateProcessMemoryPool();
|
static NOINLINE u32 GetCreateProcessMemoryPool();
|
||||||
|
|
|
@ -69,6 +69,7 @@ namespace ams::kern {
|
||||||
static NOINLINE void InitializePhase1Base(u64 seed);
|
static NOINLINE void InitializePhase1Base(u64 seed);
|
||||||
public:
|
public:
|
||||||
/* Initialization. */
|
/* Initialization. */
|
||||||
|
static NOINLINE void ConfigureKTargetSystem();
|
||||||
static NOINLINE void InitializePhase1();
|
static NOINLINE void InitializePhase1();
|
||||||
static NOINLINE void InitializePhase2();
|
static NOINLINE void InitializePhase2();
|
||||||
static NOINLINE u32 GetCreateProcessMemoryPool();
|
static NOINLINE u32 GetCreateProcessMemoryPool();
|
||||||
|
|
|
@ -24,29 +24,36 @@ namespace ams::kern {
|
||||||
friend class KSystemControlBase;
|
friend class KSystemControlBase;
|
||||||
friend class KSystemControl;
|
friend class KSystemControl;
|
||||||
private:
|
private:
|
||||||
static inline constinit bool s_is_debug_mode;
|
struct KTargetSystemData {
|
||||||
static inline constinit bool s_enable_debug_logging;
|
bool is_debug_mode;
|
||||||
static inline constinit bool s_enable_user_exception_handlers;
|
bool enable_debug_logging;
|
||||||
static inline constinit bool s_enable_debug_memory_fill;
|
bool enable_user_exception_handlers;
|
||||||
static inline constinit bool s_enable_user_pmu_access;
|
bool enable_debug_memory_fill;
|
||||||
static inline constinit bool s_enable_kernel_debugging;
|
bool enable_user_pmu_access;
|
||||||
static inline constinit bool s_enable_dynamic_resource_limits;
|
bool enable_kernel_debugging;
|
||||||
|
bool enable_dynamic_resource_limits;
|
||||||
|
};
|
||||||
private:
|
private:
|
||||||
static ALWAYS_INLINE void SetIsDebugMode(bool en) { s_is_debug_mode = en; }
|
static inline constinit bool s_is_initialized = false;
|
||||||
static ALWAYS_INLINE void EnableDebugLogging(bool en) { s_enable_debug_logging = en; }
|
static inline constinit const volatile KTargetSystemData s_data = {
|
||||||
static ALWAYS_INLINE void EnableUserExceptionHandlers(bool en) { s_enable_user_exception_handlers = en; }
|
.is_debug_mode = true,
|
||||||
static ALWAYS_INLINE void EnableDebugMemoryFill(bool en) { s_enable_debug_memory_fill = en; }
|
.enable_debug_logging = true,
|
||||||
static ALWAYS_INLINE void EnableUserPmuAccess(bool en) { s_enable_user_pmu_access = en; }
|
.enable_user_exception_handlers = true,
|
||||||
static ALWAYS_INLINE void EnableKernelDebugging(bool en) { s_enable_kernel_debugging = en; }
|
.enable_debug_memory_fill = true,
|
||||||
static ALWAYS_INLINE void EnableDynamicResourceLimits(bool en) { s_enable_dynamic_resource_limits = en; }
|
.enable_user_pmu_access = true,
|
||||||
|
.enable_kernel_debugging = true,
|
||||||
|
.enable_dynamic_resource_limits = false,
|
||||||
|
};
|
||||||
|
private:
|
||||||
|
static ALWAYS_INLINE void SetInitialized() { s_is_initialized = true; }
|
||||||
public:
|
public:
|
||||||
static ALWAYS_INLINE bool IsDebugMode() { return s_is_debug_mode; }
|
static ALWAYS_INLINE bool IsDebugMode() { return s_is_initialized && s_data.is_debug_mode; }
|
||||||
static ALWAYS_INLINE bool IsDebugLoggingEnabled() { return s_enable_debug_logging; }
|
static ALWAYS_INLINE bool IsDebugLoggingEnabled() { return s_is_initialized && s_data.enable_debug_logging; }
|
||||||
static ALWAYS_INLINE bool IsUserExceptionHandlersEnabled() { return s_enable_user_exception_handlers; }
|
static ALWAYS_INLINE bool IsUserExceptionHandlersEnabled() { return s_is_initialized && s_data.enable_user_exception_handlers; }
|
||||||
static ALWAYS_INLINE bool IsDebugMemoryFillEnabled() { return s_enable_debug_memory_fill; }
|
static ALWAYS_INLINE bool IsDebugMemoryFillEnabled() { return s_is_initialized && s_data.enable_debug_memory_fill; }
|
||||||
static ALWAYS_INLINE bool IsUserPmuAccessEnabled() { return s_enable_user_pmu_access; }
|
static ALWAYS_INLINE bool IsUserPmuAccessEnabled() { return s_is_initialized && s_data.enable_user_pmu_access; }
|
||||||
static ALWAYS_INLINE bool IsKernelDebuggingEnabled() { return s_enable_kernel_debugging; }
|
static ALWAYS_INLINE bool IsKernelDebuggingEnabled() { return s_is_initialized && s_data.enable_kernel_debugging; }
|
||||||
static ALWAYS_INLINE bool IsDynamicResourceLimitsEnabled() { return s_enable_dynamic_resource_limits; }
|
static ALWAYS_INLINE bool IsDynamicResourceLimitsEnabled() { return s_is_initialized && s_data.enable_dynamic_resource_limits; }
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
|
@ -26,7 +26,7 @@ namespace ams::kern::board::nintendo::nx {
|
||||||
constexpr size_t SecureSizeMax = util::AlignDown(512_MB - 1, SecureAlignment);
|
constexpr size_t SecureSizeMax = util::AlignDown(512_MB - 1, SecureAlignment);
|
||||||
|
|
||||||
/* Global variables for panic. */
|
/* Global variables for panic. */
|
||||||
constinit bool g_call_smc_on_panic;
|
constinit const volatile bool g_call_smc_on_panic = false;
|
||||||
|
|
||||||
/* Global variables for secure memory. */
|
/* Global variables for secure memory. */
|
||||||
constinit KSpinLock g_secure_applet_lock;
|
constinit KSpinLock g_secure_applet_lock;
|
||||||
|
@ -401,34 +401,67 @@ namespace ams::kern::board::nintendo::nx {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* System Initialization. */
|
/* System Initialization. */
|
||||||
void KSystemControl::InitializePhase1() {
|
void KSystemControl::ConfigureKTargetSystem() {
|
||||||
/* Configure KTargetSystem. */
|
/* Configure KTargetSystem. */
|
||||||
|
volatile auto *ts = const_cast<volatile KTargetSystem::KTargetSystemData *>(std::addressof(KTargetSystem::s_data));
|
||||||
{
|
{
|
||||||
/* Set IsDebugMode. */
|
/* Set IsDebugMode. */
|
||||||
{
|
{
|
||||||
KTargetSystem::SetIsDebugMode(GetConfigBool(smc::ConfigItem::IsDebugMode));
|
ts->is_debug_mode = GetConfigBool(smc::ConfigItem::IsDebugMode);
|
||||||
|
|
||||||
/* If debug mode, we want to initialize uart logging. */
|
/* If debug mode, we want to initialize uart logging. */
|
||||||
KTargetSystem::EnableDebugLogging(KTargetSystem::IsDebugMode());
|
ts->enable_debug_logging = ts->is_debug_mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set Kernel Configuration. */
|
/* Set Kernel Configuration. */
|
||||||
{
|
{
|
||||||
const auto kernel_config = util::BitPack32{GetConfigU32(smc::ConfigItem::KernelConfiguration)};
|
const auto kernel_config = util::BitPack32{GetConfigU32(smc::ConfigItem::KernelConfiguration)};
|
||||||
|
|
||||||
KTargetSystem::EnableDebugMemoryFill(kernel_config.Get<smc::KernelConfiguration::DebugFillMemory>());
|
ts->enable_debug_memory_fill = kernel_config.Get<smc::KernelConfiguration::DebugFillMemory>();
|
||||||
KTargetSystem::EnableUserExceptionHandlers(kernel_config.Get<smc::KernelConfiguration::EnableUserExceptionHandlers>());
|
ts->enable_user_exception_handlers = kernel_config.Get<smc::KernelConfiguration::EnableUserExceptionHandlers>();
|
||||||
KTargetSystem::EnableDynamicResourceLimits(!kernel_config.Get<smc::KernelConfiguration::DisableDynamicResourceLimits>());
|
ts->enable_dynamic_resource_limits = !kernel_config.Get<smc::KernelConfiguration::DisableDynamicResourceLimits>();
|
||||||
KTargetSystem::EnableUserPmuAccess(kernel_config.Get<smc::KernelConfiguration::EnableUserPmuAccess>());
|
ts->enable_user_pmu_access = kernel_config.Get<smc::KernelConfiguration::EnableUserPmuAccess>();
|
||||||
|
|
||||||
g_call_smc_on_panic = kernel_config.Get<smc::KernelConfiguration::UseSecureMonitorPanicCall>();
|
/* Configure call smc on panic. */
|
||||||
|
*const_cast<volatile bool *>(std::addressof(g_call_smc_on_panic)) = kernel_config.Get<smc::KernelConfiguration::UseSecureMonitorPanicCall>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set Kernel Debugging. */
|
/* Set Kernel Debugging. */
|
||||||
{
|
{
|
||||||
/* NOTE: This is used to restrict access to SvcKernelDebug/SvcChangeKernelTraceState. */
|
/* NOTE: This is used to restrict access to SvcKernelDebug/SvcChangeKernelTraceState. */
|
||||||
/* Mesosphere may wish to not require this, as we'd ideally keep ProgramVerification enabled for userland. */
|
/* Mesosphere may wish to not require this, as we'd ideally keep ProgramVerification enabled for userland. */
|
||||||
KTargetSystem::EnableKernelDebugging(GetConfigBool(smc::ConfigItem::DisableProgramVerification));
|
ts->enable_kernel_debugging = GetConfigBool(smc::ConfigItem::DisableProgramVerification);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void KSystemControl::InitializePhase1() {
|
||||||
|
/* Enable KTargetSystem. */
|
||||||
|
KTargetSystem::SetInitialized();
|
||||||
|
|
||||||
|
/* Check KTargetSystem was configured correctly. */
|
||||||
|
{
|
||||||
|
/* Check IsDebugMode. */
|
||||||
|
{
|
||||||
|
MESOSPHERE_ABORT_UNLESS(KTargetSystem::IsDebugMode() == GetConfigBool(smc::ConfigItem::IsDebugMode));
|
||||||
|
MESOSPHERE_ABORT_UNLESS(KTargetSystem::IsDebugLoggingEnabled() == GetConfigBool(smc::ConfigItem::IsDebugMode));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check Kernel Configuration. */
|
||||||
|
{
|
||||||
|
const auto kernel_config = util::BitPack32{GetConfigU32(smc::ConfigItem::KernelConfiguration)};
|
||||||
|
|
||||||
|
MESOSPHERE_ABORT_UNLESS(KTargetSystem::IsDebugMemoryFillEnabled() == kernel_config.Get<smc::KernelConfiguration::DebugFillMemory>());
|
||||||
|
MESOSPHERE_ABORT_UNLESS(KTargetSystem::IsUserExceptionHandlersEnabled() == kernel_config.Get<smc::KernelConfiguration::EnableUserExceptionHandlers>());
|
||||||
|
MESOSPHERE_ABORT_UNLESS(KTargetSystem::IsDynamicResourceLimitsEnabled() == !kernel_config.Get<smc::KernelConfiguration::DisableDynamicResourceLimits>());
|
||||||
|
MESOSPHERE_ABORT_UNLESS(KTargetSystem::IsUserPmuAccessEnabled() == kernel_config.Get<smc::KernelConfiguration::EnableUserPmuAccess>());
|
||||||
|
|
||||||
|
MESOSPHERE_ABORT_UNLESS(g_call_smc_on_panic == kernel_config.Get<smc::KernelConfiguration::UseSecureMonitorPanicCall>());
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check Kernel Debugging. */
|
||||||
|
{
|
||||||
|
MESOSPHERE_ABORT_UNLESS(KTargetSystem::IsKernelDebuggingEnabled() == GetConfigBool(smc::ConfigItem::DisableProgramVerification));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -124,31 +124,14 @@ namespace ams::kern {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* System Initialization. */
|
/* System Initialization. */
|
||||||
|
void KSystemControlBase::ConfigureKTargetSystem() {
|
||||||
|
/* By default, use the default config set in the KTargetSystem header. */
|
||||||
|
}
|
||||||
|
|
||||||
void KSystemControlBase::InitializePhase1() {
|
void KSystemControlBase::InitializePhase1() {
|
||||||
/* Configure KTargetSystem. */
|
/* Enable KTargetSystem. */
|
||||||
{
|
{
|
||||||
/* Set IsDebugMode. */
|
KTargetSystem::SetInitialized();
|
||||||
{
|
|
||||||
KTargetSystem::SetIsDebugMode(true);
|
|
||||||
|
|
||||||
/* If debug mode, we want to initialize uart logging. */
|
|
||||||
KTargetSystem::EnableDebugLogging(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set Kernel Configuration. */
|
|
||||||
{
|
|
||||||
KTargetSystem::EnableDebugMemoryFill(false);
|
|
||||||
KTargetSystem::EnableUserExceptionHandlers(true);
|
|
||||||
KTargetSystem::EnableDynamicResourceLimits(true);
|
|
||||||
KTargetSystem::EnableUserPmuAccess(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set Kernel Debugging. */
|
|
||||||
{
|
|
||||||
/* NOTE: This is used to restrict access to SvcKernelDebug/SvcChangeKernelTraceState. */
|
|
||||||
/* Mesosphere may wish to not require this, as we'd ideally keep ProgramVerification enabled for userland. */
|
|
||||||
KTargetSystem::EnableKernelDebugging(true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize random and resource limit. */
|
/* Initialize random and resource limit. */
|
||||||
|
|
|
@ -111,4 +111,8 @@ namespace ams::kern {
|
||||||
KThread &Kernel::GetMainThread(s32 core_id) { return g_main_threads.m_arr[core_id]; }
|
KThread &Kernel::GetMainThread(s32 core_id) { return g_main_threads.m_arr[core_id]; }
|
||||||
KThread &Kernel::GetIdleThread(s32 core_id) { return g_idle_threads.m_arr[core_id]; }
|
KThread &Kernel::GetIdleThread(s32 core_id) { return g_idle_threads.m_arr[core_id]; }
|
||||||
|
|
||||||
|
__attribute__((constructor)) void ConfigureKTargetSystem() {
|
||||||
|
KSystemControl::ConfigureKTargetSystem();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue