mirror of
https://github.com/Atmosphere-NX/Atmosphere
synced 2024-12-22 20:31:14 +00:00
kern: remove unnecessary fields from InitArgs (0x80 -> 0x40)
This commit is contained in:
parent
1491a7b159
commit
ec96203cb7
4 changed files with 22 additions and 61 deletions
|
@ -19,13 +19,8 @@
|
||||||
namespace ams::kern::init {
|
namespace ams::kern::init {
|
||||||
|
|
||||||
struct alignas(util::CeilingPowerOfTwo(INIT_ARGUMENTS_SIZE)) KInitArguments {
|
struct alignas(util::CeilingPowerOfTwo(INIT_ARGUMENTS_SIZE)) KInitArguments {
|
||||||
u64 ttbr0;
|
|
||||||
u64 ttbr1;
|
|
||||||
u64 tcr;
|
|
||||||
u64 mair;
|
|
||||||
u64 cpuactlr;
|
u64 cpuactlr;
|
||||||
u64 cpuectlr;
|
u64 cpuectlr;
|
||||||
u64 sctlr;
|
|
||||||
u64 sp;
|
u64 sp;
|
||||||
u64 entrypoint;
|
u64 entrypoint;
|
||||||
u64 argument;
|
u64 argument;
|
||||||
|
@ -33,13 +28,8 @@ namespace ams::kern::init {
|
||||||
static_assert(alignof(KInitArguments) == util::CeilingPowerOfTwo(INIT_ARGUMENTS_SIZE));
|
static_assert(alignof(KInitArguments) == util::CeilingPowerOfTwo(INIT_ARGUMENTS_SIZE));
|
||||||
static_assert(sizeof(KInitArguments) == std::max(INIT_ARGUMENTS_SIZE, util::CeilingPowerOfTwo(INIT_ARGUMENTS_SIZE)));
|
static_assert(sizeof(KInitArguments) == std::max(INIT_ARGUMENTS_SIZE, util::CeilingPowerOfTwo(INIT_ARGUMENTS_SIZE)));
|
||||||
|
|
||||||
static_assert(AMS_OFFSETOF(KInitArguments, ttbr0) == INIT_ARGUMENTS_TTBR0);
|
|
||||||
static_assert(AMS_OFFSETOF(KInitArguments, ttbr1) == INIT_ARGUMENTS_TTBR1);
|
|
||||||
static_assert(AMS_OFFSETOF(KInitArguments, tcr) == INIT_ARGUMENTS_TCR);
|
|
||||||
static_assert(AMS_OFFSETOF(KInitArguments, mair) == INIT_ARGUMENTS_MAIR);
|
|
||||||
static_assert(AMS_OFFSETOF(KInitArguments, cpuactlr) == INIT_ARGUMENTS_CPUACTLR);
|
static_assert(AMS_OFFSETOF(KInitArguments, cpuactlr) == INIT_ARGUMENTS_CPUACTLR);
|
||||||
static_assert(AMS_OFFSETOF(KInitArguments, cpuectlr) == INIT_ARGUMENTS_CPUECTLR);
|
static_assert(AMS_OFFSETOF(KInitArguments, cpuectlr) == INIT_ARGUMENTS_CPUECTLR);
|
||||||
static_assert(AMS_OFFSETOF(KInitArguments, sctlr) == INIT_ARGUMENTS_SCTLR);
|
|
||||||
static_assert(AMS_OFFSETOF(KInitArguments, sp) == INIT_ARGUMENTS_SP);
|
static_assert(AMS_OFFSETOF(KInitArguments, sp) == INIT_ARGUMENTS_SP);
|
||||||
static_assert(AMS_OFFSETOF(KInitArguments, entrypoint) == INIT_ARGUMENTS_ENTRYPOINT);
|
static_assert(AMS_OFFSETOF(KInitArguments, entrypoint) == INIT_ARGUMENTS_ENTRYPOINT);
|
||||||
static_assert(AMS_OFFSETOF(KInitArguments, argument) == INIT_ARGUMENTS_ARGUMENT);
|
static_assert(AMS_OFFSETOF(KInitArguments, argument) == INIT_ARGUMENTS_ARGUMENT);
|
||||||
|
|
|
@ -246,17 +246,12 @@
|
||||||
#define THREAD_LOCAL_REGION_SIZE 0x200
|
#define THREAD_LOCAL_REGION_SIZE 0x200
|
||||||
|
|
||||||
/* ams::kern::init::KInitArguments, https://github.com/Atmosphere-NX/Atmosphere/blob/master/libraries/libmesosphere/include/mesosphere/arch/arm64/init/kern_k_init_arguments.hpp */
|
/* ams::kern::init::KInitArguments, https://github.com/Atmosphere-NX/Atmosphere/blob/master/libraries/libmesosphere/include/mesosphere/arch/arm64/init/kern_k_init_arguments.hpp */
|
||||||
#define INIT_ARGUMENTS_SIZE 0x50
|
#define INIT_ARGUMENTS_SIZE 0x28
|
||||||
#define INIT_ARGUMENTS_TTBR0 0x00
|
#define INIT_ARGUMENTS_CPUACTLR 0x00
|
||||||
#define INIT_ARGUMENTS_TTBR1 0x08
|
#define INIT_ARGUMENTS_CPUECTLR 0x08
|
||||||
#define INIT_ARGUMENTS_TCR 0x10
|
#define INIT_ARGUMENTS_SP 0x10
|
||||||
#define INIT_ARGUMENTS_MAIR 0x18
|
#define INIT_ARGUMENTS_ENTRYPOINT 0x18
|
||||||
#define INIT_ARGUMENTS_CPUACTLR 0x20
|
#define INIT_ARGUMENTS_ARGUMENT 0x20
|
||||||
#define INIT_ARGUMENTS_CPUECTLR 0x28
|
|
||||||
#define INIT_ARGUMENTS_SCTLR 0x30
|
|
||||||
#define INIT_ARGUMENTS_SP 0x38
|
|
||||||
#define INIT_ARGUMENTS_ENTRYPOINT 0x40
|
|
||||||
#define INIT_ARGUMENTS_ARGUMENT 0x48
|
|
||||||
|
|
||||||
/* ams::kern::KScheduler (::SchedulingState), https://github.com/Atmosphere-NX/Atmosphere/blob/master/libraries/libmesosphere/include/mesosphere/kern_k_scheduler.hpp */
|
/* ams::kern::KScheduler (::SchedulingState), https://github.com/Atmosphere-NX/Atmosphere/blob/master/libraries/libmesosphere/include/mesosphere/kern_k_scheduler.hpp */
|
||||||
/* NOTE: Due to constraints on ldarb relative offsets, KSCHEDULER_NEEDS_SCHEDULING cannot trivially be changed, and will require assembly edits. */
|
/* NOTE: Due to constraints on ldarb relative offsets, KSCHEDULER_NEEDS_SCHEDULING cannot trivially be changed, and will require assembly edits. */
|
||||||
|
|
|
@ -32,7 +32,6 @@ namespace ams::kern::board::nintendo::nx {
|
||||||
class SavedSystemRegisters {
|
class SavedSystemRegisters {
|
||||||
private:
|
private:
|
||||||
u64 ttbr0_el1;
|
u64 ttbr0_el1;
|
||||||
u64 tcr_el1;
|
|
||||||
u64 elr_el1;
|
u64 elr_el1;
|
||||||
u64 sp_el0;
|
u64 sp_el0;
|
||||||
u64 spsr_el1;
|
u64 spsr_el1;
|
||||||
|
@ -92,7 +91,6 @@ namespace ams::kern::board::nintendo::nx {
|
||||||
void SavedSystemRegisters::Save() {
|
void SavedSystemRegisters::Save() {
|
||||||
/* Save system registers. */
|
/* Save system registers. */
|
||||||
this->ttbr0_el1 = cpu::GetTtbr0El1();
|
this->ttbr0_el1 = cpu::GetTtbr0El1();
|
||||||
this->tcr_el1 = cpu::GetTcrEl1();
|
|
||||||
this->tpidr_el0 = cpu::GetTpidrEl0();
|
this->tpidr_el0 = cpu::GetTpidrEl0();
|
||||||
this->elr_el1 = cpu::GetElrEl1();
|
this->elr_el1 = cpu::GetElrEl1();
|
||||||
this->sp_el0 = cpu::GetSpEl0();
|
this->sp_el0 = cpu::GetSpEl0();
|
||||||
|
@ -408,7 +406,6 @@ namespace ams::kern::board::nintendo::nx {
|
||||||
|
|
||||||
/* Restore system registers. */
|
/* Restore system registers. */
|
||||||
cpu::SetTtbr0El1 (this->ttbr0_el1);
|
cpu::SetTtbr0El1 (this->ttbr0_el1);
|
||||||
cpu::SetTcrEl1 (this->tcr_el1);
|
|
||||||
cpu::SetTpidrEl0 (this->tpidr_el0);
|
cpu::SetTpidrEl0 (this->tpidr_el0);
|
||||||
cpu::SetElrEl1 (this->elr_el1);
|
cpu::SetElrEl1 (this->elr_el1);
|
||||||
cpu::SetSpEl0 (this->sp_el0);
|
cpu::SetSpEl0 (this->sp_el0);
|
||||||
|
@ -515,24 +512,6 @@ namespace ams::kern::board::nintendo::nx {
|
||||||
/* Save the system registers for the current core. */
|
/* Save the system registers for the current core. */
|
||||||
g_sleep_system_registers[core_id].Save();
|
g_sleep_system_registers[core_id].Save();
|
||||||
|
|
||||||
/* Change the translation tables to use the kernel table. */
|
|
||||||
{
|
|
||||||
/* Get the current value of the translation control register. */
|
|
||||||
const u64 tcr = cpu::GetTcrEl1();
|
|
||||||
|
|
||||||
/* Disable translation table walks on tlb miss. */
|
|
||||||
cpu::TranslationControlRegisterAccessor(tcr).SetEpd0(true).Store();
|
|
||||||
cpu::EnsureInstructionConsistency();
|
|
||||||
|
|
||||||
/* Change the translation table base (ttbr0) to use the kernel table. */
|
|
||||||
cpu::SetTtbr0El1(Kernel::GetKernelPageTable().GetIdentityMapTtbr0(core_id));
|
|
||||||
cpu::EnsureInstructionConsistency();
|
|
||||||
|
|
||||||
/* Enable translation table walks on tlb miss. */
|
|
||||||
cpu::TranslationControlRegisterAccessor(tcr).SetEpd0(false).Store();
|
|
||||||
cpu::EnsureInstructionConsistency();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Invalidate the entire tlb. */
|
/* Invalidate the entire tlb. */
|
||||||
cpu::InvalidateEntireTlb();
|
cpu::InvalidateEntireTlb();
|
||||||
|
|
||||||
|
@ -552,13 +531,14 @@ namespace ams::kern::board::nintendo::nx {
|
||||||
|
|
||||||
/* Setup the initial arguments. */
|
/* Setup the initial arguments. */
|
||||||
{
|
{
|
||||||
init_args->ttbr0 = cpu::GetTtbr0El1();
|
/* Determine whether we're running on a cortex-a53 or a-57. */
|
||||||
init_args->ttbr1 = cpu::GetTtbr1El1();
|
cpu::MainIdRegisterAccessor midr_el1;
|
||||||
init_args->tcr = cpu::GetTcrEl1();
|
const auto implementer = midr_el1.GetImplementer();
|
||||||
init_args->mair = cpu::GetMairEl1();
|
const auto primary_part = midr_el1.GetPrimaryPartNumber();
|
||||||
init_args->cpuactlr = cpu::GetCpuActlrEl1();
|
const bool needs_cpu_ctlr = (implementer == cpu::MainIdRegisterAccessor::Implementer::ArmLimited) && (primary_part == cpu::MainIdRegisterAccessor::PrimaryPartNumber::CortexA57 || primary_part == cpu::MainIdRegisterAccessor::PrimaryPartNumber::CortexA53);
|
||||||
init_args->cpuectlr = cpu::GetCpuEctlrEl1();
|
|
||||||
init_args->sctlr = cpu::GetSctlrEl1();
|
init_args->cpuactlr = needs_cpu_ctlr ? cpu::GetCpuActlrEl1() : 0;
|
||||||
|
init_args->cpuectlr = needs_cpu_ctlr ? cpu::GetCpuEctlrEl1() : 0;
|
||||||
init_args->sp = 0;
|
init_args->sp = 0;
|
||||||
init_args->entrypoint = reinterpret_cast<uintptr_t>(::ams::kern::board::nintendo::nx::KSleepManager::ResumeEntry);
|
init_args->entrypoint = reinterpret_cast<uintptr_t>(::ams::kern::board::nintendo::nx::KSleepManager::ResumeEntry);
|
||||||
init_args->argument = sleep_buffer;
|
init_args->argument = sleep_buffer;
|
||||||
|
|
|
@ -86,27 +86,23 @@ namespace ams::kern::init {
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetupInitialArguments() {
|
void SetupInitialArguments() {
|
||||||
|
/* Determine whether we're running on a cortex-a53 or a-57. */
|
||||||
|
cpu::MainIdRegisterAccessor midr_el1;
|
||||||
|
const auto implementer = midr_el1.GetImplementer();
|
||||||
|
const auto primary_part = midr_el1.GetPrimaryPartNumber();
|
||||||
|
const bool needs_cpu_ctlr = (implementer == cpu::MainIdRegisterAccessor::Implementer::ArmLimited) && (primary_part == cpu::MainIdRegisterAccessor::PrimaryPartNumber::CortexA57 || primary_part == cpu::MainIdRegisterAccessor::PrimaryPartNumber::CortexA53);
|
||||||
|
|
||||||
/* Get parameters for initial arguments. */
|
/* Get parameters for initial arguments. */
|
||||||
const u64 ttbr0 = cpu::GetTtbr0El1();
|
const u64 cpuactlr = needs_cpu_ctlr ? cpu::GetCpuActlrEl1() : 0;
|
||||||
const u64 ttbr1 = cpu::GetTtbr1El1();
|
const u64 cpuectlr = needs_cpu_ctlr ? cpu::GetCpuEctlrEl1() : 0;
|
||||||
const u64 tcr = cpu::GetTcrEl1();
|
|
||||||
const u64 mair = cpu::GetMairEl1();
|
|
||||||
const u64 cpuactlr = cpu::GetCpuActlrEl1();
|
|
||||||
const u64 cpuectlr = cpu::GetCpuEctlrEl1();
|
|
||||||
const u64 sctlr = cpu::GetSctlrEl1();
|
|
||||||
|
|
||||||
for (s32 i = 0; i < static_cast<s32>(cpu::NumCores); ++i) {
|
for (s32 i = 0; i < static_cast<s32>(cpu::NumCores); ++i) {
|
||||||
/* Get the arguments. */
|
/* Get the arguments. */
|
||||||
KInitArguments *init_args = g_init_arguments + i;
|
KInitArguments *init_args = g_init_arguments + i;
|
||||||
|
|
||||||
/* Set the arguments. */
|
/* Set the arguments. */
|
||||||
init_args->ttbr0 = ttbr0;
|
|
||||||
init_args->ttbr1 = ttbr1;
|
|
||||||
init_args->tcr = tcr;
|
|
||||||
init_args->mair = mair;
|
|
||||||
init_args->cpuactlr = cpuactlr;
|
init_args->cpuactlr = cpuactlr;
|
||||||
init_args->cpuectlr = cpuectlr;
|
init_args->cpuectlr = cpuectlr;
|
||||||
init_args->sctlr = sctlr;
|
|
||||||
init_args->sp = GetInteger(KMemoryLayout::GetMainStackTopAddress(i)) - sizeof(KThread::StackParameters);
|
init_args->sp = GetInteger(KMemoryLayout::GetMainStackTopAddress(i)) - sizeof(KThread::StackParameters);
|
||||||
init_args->entrypoint = reinterpret_cast<uintptr_t>(::ams::kern::init::InvokeMain);
|
init_args->entrypoint = reinterpret_cast<uintptr_t>(::ams::kern::init::InvokeMain);
|
||||||
init_args->argument = static_cast<u64>(i);
|
init_args->argument = static_cast<u64>(i);
|
||||||
|
|
Loading…
Reference in a new issue