mirror of
https://github.com/Atmosphere-NX/Atmosphere.git
synced 2025-06-02 23:59:49 -04:00
kern: Kill KCoreLocalRegion
This commit is contained in:
parent
24d545701c
commit
b0debd72a7
24 changed files with 165 additions and 334 deletions
|
@ -37,6 +37,8 @@ namespace ams::kern::init {
|
|||
/* Global initial arguments array. */
|
||||
KPhysicalAddress g_init_arguments_phys_addr[cpu::NumCores];
|
||||
|
||||
KInitArguments g_init_arguments[cpu::NumCores];
|
||||
|
||||
/* Page table attributes. */
|
||||
constexpr PageTableEntry KernelRoDataAttribute(PageTableEntry::Permission_KernelR, PageTableEntry::PageAttribute_NormalMemory, PageTableEntry::Shareable_InnerShareable, PageTableEntry::MappingFlag_Mapped);
|
||||
constexpr PageTableEntry KernelRwDataAttribute(PageTableEntry::Permission_KernelRW, PageTableEntry::PageAttribute_NormalMemory, PageTableEntry::Shareable_InnerShareable, PageTableEntry::MappingFlag_Mapped);
|
||||
|
@ -73,6 +75,48 @@ namespace ams::kern::init {
|
|||
}
|
||||
}
|
||||
|
||||
void SetupInitialArguments(KInitialPageTable &ttbr1_table, KInitialPageAllocator &allocator) {
|
||||
AMS_UNUSED(ttbr1_table, allocator);
|
||||
|
||||
/* Get parameters for initial arguments. */
|
||||
const u64 ttbr0 = cpu::GetTtbr0El1();
|
||||
const u64 ttbr1 = cpu::GetTtbr1El1();
|
||||
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) {
|
||||
/* Get the arguments. */
|
||||
KInitArguments *init_args = g_init_arguments + i;
|
||||
|
||||
/* Translate to a physical address. */
|
||||
/* KPhysicalAddress phys_addr = Null<KPhysicalAddress>; */
|
||||
/* if (cpu::GetPhysicalAddressWritable(std::addressof(phys_addr), KVirtualAddress(init_args), true)) { */
|
||||
/* g_init_arguments_phys_addr[i] = phys_addr; */
|
||||
/* } */
|
||||
g_init_arguments_phys_addr[i] = ttbr1_table.GetPhysicalAddress(KVirtualAddress(init_args));
|
||||
|
||||
/* 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->cpuectlr = cpuectlr;
|
||||
init_args->sctlr = sctlr;
|
||||
init_args->sp = GetInteger(KMemoryLayout::GetMainStackTopAddress(i)) - sizeof(KThread::StackParameters);
|
||||
init_args->entrypoint = reinterpret_cast<uintptr_t>(::ams::kern::HorizonKernelMain);
|
||||
init_args->argument = static_cast<u64>(i);
|
||||
init_args->setup_function = reinterpret_cast<uintptr_t>(::ams::kern::init::StartOtherCore);
|
||||
init_args->exception_stack = GetInteger(KMemoryLayout::GetExceptionStackTopAddress(i)) - sizeof(KThread::StackParameters);
|
||||
}
|
||||
|
||||
/* Ensure the arguments are written to memory. */
|
||||
StoreDataCache(g_init_arguments, sizeof(g_init_arguments));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void InitializeCore(uintptr_t misc_unk_debug_phys_addr, uintptr_t initial_page_allocator_state) {
|
||||
|
@ -295,8 +339,8 @@ namespace ams::kern::init {
|
|||
MapStackForCore(ttbr1_table, KMemoryRegionType_KernelMiscExceptionStack, i);
|
||||
}
|
||||
|
||||
/* Setup the KCoreLocalRegion regions. */
|
||||
SetupCoreLocalRegionMemoryRegions(ttbr1_table, g_initial_page_allocator);
|
||||
/* Setup the initial arguments. */
|
||||
SetupInitialArguments(ttbr1_table, g_initial_page_allocator);
|
||||
|
||||
/* Finalize the page allocator, we're done allocating at this point. */
|
||||
KInitialPageAllocator::State final_init_page_table_state;
|
||||
|
@ -329,28 +373,6 @@ namespace ams::kern::init {
|
|||
return g_init_arguments_phys_addr[core_id];
|
||||
}
|
||||
|
||||
void SetInitArguments(s32 core_id, KPhysicalAddress address, uintptr_t arg) {
|
||||
/* Set the arguments. */
|
||||
KInitArguments *init_args = reinterpret_cast<KInitArguments *>(GetInteger(address));
|
||||
init_args->ttbr0 = cpu::GetTtbr0El1();
|
||||
init_args->ttbr1 = arg;
|
||||
init_args->tcr = cpu::GetTcrEl1();
|
||||
init_args->mair = cpu::GetMairEl1();
|
||||
init_args->cpuactlr = cpu::GetCpuActlrEl1();
|
||||
init_args->cpuectlr = cpu::GetCpuEctlrEl1();
|
||||
init_args->sctlr = cpu::GetSctlrEl1();
|
||||
init_args->sp = GetInteger(KMemoryLayout::GetMainStackTopAddress(core_id)) - sizeof(KThread::StackParameters);
|
||||
init_args->entrypoint = reinterpret_cast<uintptr_t>(::ams::kern::HorizonKernelMain);
|
||||
init_args->argument = static_cast<u64>(core_id);
|
||||
init_args->setup_function = reinterpret_cast<uintptr_t>(::ams::kern::init::StartOtherCore);
|
||||
|
||||
/* Ensure the arguments are written to memory. */
|
||||
StoreDataCache(init_args, sizeof(*init_args));
|
||||
|
||||
/* Save the pointer to the arguments to use as argument upon core wakeup. */
|
||||
g_init_arguments_phys_addr[core_id] = address;
|
||||
}
|
||||
|
||||
void InitializeDebugRegisters() {
|
||||
/* Determine how many watchpoints and breakpoints we have */
|
||||
cpu::DebugFeatureRegisterAccessor aa64dfr0;
|
||||
|
@ -417,6 +439,7 @@ namespace ams::kern::init {
|
|||
|
||||
void InitializeExceptionVectors() {
|
||||
cpu::SetVbarEl1(reinterpret_cast<uintptr_t>(::ams::kern::ExceptionVectors));
|
||||
cpu::SetExceptionThreadStackTop(0);
|
||||
cpu::EnsureInstructionConsistency();
|
||||
}
|
||||
|
||||
|
|
|
@ -227,6 +227,10 @@ _ZN3ams4kern4init16InvokeEntrypointEPKNS1_14KInitArgumentsE:
|
|||
/* Ensure that the exception vectors are setup. */
|
||||
bl _ZN3ams4kern4init26InitializeExceptionVectorsEv
|
||||
|
||||
/* Setup the exception stack in tpidr_el1. */
|
||||
ldr x1, [x20, #0x58]
|
||||
msr tpidr_el1, x1
|
||||
|
||||
/* Jump to the entrypoint. */
|
||||
ldr x1, [x20, #0x40]
|
||||
ldr x0, [x20, #0x48]
|
||||
|
|
|
@ -31,9 +31,8 @@ _ZN3ams4kern4arch5arm6422EL1IrqExceptionHandlerEv:
|
|||
stp x12, x13, [sp, #(8 * 12)]
|
||||
stp x14, x15, [sp, #(8 * 14)]
|
||||
stp x16, x17, [sp, #(8 * 16)]
|
||||
stp x18, x19, [sp, #(8 * 18)]
|
||||
stp x20, x21, [sp, #(8 * 20)]
|
||||
stp x22, x30, [sp, #(8 * 22)]
|
||||
stp x19, x20, [sp, #(8 * 18)]
|
||||
stp x21, x30, [sp, #(8 * 20)]
|
||||
|
||||
mrs x19, sp_el0
|
||||
mrs x20, elr_el1
|
||||
|
@ -41,7 +40,6 @@ _ZN3ams4kern4arch5arm6422EL1IrqExceptionHandlerEv:
|
|||
mov w21, w21
|
||||
|
||||
/* Invoke KInterruptManager::HandleInterrupt(bool user_mode). */
|
||||
mrs x18, tpidr_el1
|
||||
mov x0, #0
|
||||
bl _ZN3ams4kern4arch5arm6417KInterruptManager15HandleInterruptEb
|
||||
|
||||
|
@ -59,9 +57,8 @@ _ZN3ams4kern4arch5arm6422EL1IrqExceptionHandlerEv:
|
|||
ldp x12, x13, [sp, #(8 * 12)]
|
||||
ldp x14, x15, [sp, #(8 * 14)]
|
||||
ldp x16, x17, [sp, #(8 * 16)]
|
||||
ldp x18, x19, [sp, #(8 * 18)]
|
||||
ldp x20, x21, [sp, #(8 * 20)]
|
||||
ldp x22, x30, [sp, #(8 * 22)]
|
||||
ldp x19, x20, [sp, #(8 * 18)]
|
||||
ldp x21, x30, [sp, #(8 * 20)]
|
||||
|
||||
add sp, sp, #(8 * 24)
|
||||
|
||||
|
@ -74,7 +71,7 @@ _ZN3ams4kern4arch5arm6422EL1IrqExceptionHandlerEv:
|
|||
.type _ZN3ams4kern4arch5arm6422EL0IrqExceptionHandlerEv, %function
|
||||
_ZN3ams4kern4arch5arm6422EL0IrqExceptionHandlerEv:
|
||||
/* Save registers that need saving. */
|
||||
sub sp, sp, #(8 * 36)
|
||||
sub sp, sp, #0x120
|
||||
|
||||
stp x0, x1, [sp, #(8 * 0)]
|
||||
stp x2, x3, [sp, #(8 * 2)]
|
||||
|
@ -102,7 +99,7 @@ _ZN3ams4kern4arch5arm6422EL0IrqExceptionHandlerEv:
|
|||
str x23, [sp, #(8 * 34)]
|
||||
|
||||
/* Invoke KInterruptManager::HandleInterrupt(bool user_mode). */
|
||||
mrs x18, tpidr_el1
|
||||
ldr x18, [sp, #(0x120 + 0x28)]
|
||||
mov x0, #1
|
||||
bl _ZN3ams4kern4arch5arm6417KInterruptManager15HandleInterruptEb
|
||||
|
||||
|
@ -199,7 +196,7 @@ _ZN3ams4kern4arch5arm6430EL0SynchronousExceptionHandlerEv:
|
|||
str x23, [sp, #(8 * 34)]
|
||||
|
||||
/* Call ams::kern::arch::arm64::HandleException(ams::kern::arch::arm64::KExceptionContext *) */
|
||||
mrs x18, tpidr_el1
|
||||
ldr x18, [sp, #(0x120 + 0x28)]
|
||||
mov x0, sp
|
||||
bl _ZN3ams4kern4arch5arm6415HandleExceptionEPNS2_17KExceptionContextE
|
||||
|
||||
|
@ -299,12 +296,8 @@ _ZN3ams4kern4arch5arm6430EL1SynchronousExceptionHandlerEv:
|
|||
b.eq 5f
|
||||
|
||||
1: /* The exception is not a data abort or instruction abort caused by a TLB conflict. */
|
||||
/* Load the CoreLocalContext into x0. */
|
||||
/* Load the exception stack top from tpidr_el1. */
|
||||
mrs x0, tpidr_el1
|
||||
cbz x0, 2f
|
||||
|
||||
/* Load the exception stack top from the context. */
|
||||
ldr x0, [x0, #0x28]
|
||||
|
||||
/* Setup the stack for a generic exception handle */
|
||||
sub x0, x0, #0x20
|
||||
|
@ -342,21 +335,6 @@ _ZN3ams4kern4arch5arm6430EL1SynchronousExceptionHandlerEv:
|
|||
msr elr_el1, x30
|
||||
eret
|
||||
|
||||
2: /* The CoreLocalContext is nullptr. */
|
||||
/* Setup the stack for a generic exception handle. */
|
||||
/* NOTE: Nintendo does not restore X0 here, and thus saves nullptr. */
|
||||
/* This is probably not their intention, so we'll fix it. */
|
||||
/* NOTE: Nintendo also does not really save SP correctly, and so we */
|
||||
/* will also fix that. */
|
||||
mov x0, sp
|
||||
sub x0, x0, #0x20
|
||||
str x1, [x0, #16]
|
||||
mov x1, sp
|
||||
str x1, [x0]
|
||||
mov sp, x0
|
||||
mrs x0, cntv_cval_el0
|
||||
str x0, [sp, #8]
|
||||
|
||||
3: /* The exception wasn't an triggered by copying memory from userspace. */
|
||||
ldr x0, [sp, #8]
|
||||
ldr x1, [sp, #16]
|
||||
|
@ -388,7 +366,6 @@ _ZN3ams4kern4arch5arm6430EL1SynchronousExceptionHandlerEv:
|
|||
str x23, [sp, #(8 * 34)]
|
||||
|
||||
/* Call ams::kern::arch::arm64::HandleException(ams::kern::arch::arm64::KExceptionContext *) */
|
||||
mrs x18, tpidr_el1
|
||||
mov x0, sp
|
||||
bl _ZN3ams4kern4arch5arm6415HandleExceptionEPNS2_17KExceptionContextE
|
||||
|
||||
|
@ -440,7 +417,7 @@ _ZN3ams4kern4arch5arm6430EL1SynchronousExceptionHandlerEv:
|
|||
.type _ZN3ams4kern4arch5arm6425FpuAccessExceptionHandlerEv, %function
|
||||
_ZN3ams4kern4arch5arm6425FpuAccessExceptionHandlerEv:
|
||||
/* Save registers that need saving. */
|
||||
sub sp, sp, #(8 * 24)
|
||||
sub sp, sp, #0x120
|
||||
|
||||
stp x0, x1, [sp, #(8 * 0)]
|
||||
stp x2, x3, [sp, #(8 * 2)]
|
||||
|
@ -453,17 +430,23 @@ _ZN3ams4kern4arch5arm6425FpuAccessExceptionHandlerEv:
|
|||
stp x16, x17, [sp, #(8 * 16)]
|
||||
stp x18, x19, [sp, #(8 * 18)]
|
||||
stp x20, x21, [sp, #(8 * 20)]
|
||||
stp x22, x30, [sp, #(8 * 22)]
|
||||
|
||||
mrs x18, tpidr_el1
|
||||
mrs x19, sp_el0
|
||||
mrs x20, elr_el1
|
||||
mrs x21, spsr_el1
|
||||
mov w21, w21
|
||||
|
||||
stp x30, x19, [sp, #(8 * 30)]
|
||||
stp x20, x21, [sp, #(8 * 32)]
|
||||
|
||||
/* Invoke the FPU context switch handler. */
|
||||
ldr x18, [sp, #(0x120 + 0x28)]
|
||||
bl _ZN3ams4kern4arch5arm6423FpuContextSwitchHandlerEv
|
||||
|
||||
/* Restore registers that we saved. */
|
||||
ldp x30, x19, [sp, #(8 * 30)]
|
||||
ldp x20, x21, [sp, #(8 * 32)]
|
||||
|
||||
msr sp_el0, x19
|
||||
msr elr_el1, x20
|
||||
msr spsr_el1, x21
|
||||
|
@ -479,9 +462,8 @@ _ZN3ams4kern4arch5arm6425FpuAccessExceptionHandlerEv:
|
|||
ldp x16, x17, [sp, #(8 * 16)]
|
||||
ldp x18, x19, [sp, #(8 * 18)]
|
||||
ldp x20, x21, [sp, #(8 * 20)]
|
||||
ldp x22, x30, [sp, #(8 * 22)]
|
||||
|
||||
add sp, sp, #(8 * 24)
|
||||
add sp, sp, #0x120
|
||||
|
||||
/* Return from the exception. */
|
||||
eret
|
||||
|
@ -494,8 +476,8 @@ _ZN3ams4kern4arch5arm6421EL1SystemErrorHandlerEv:
|
|||
/* Nintendo uses the "unused" virtual timer compare value as a scratch register. */
|
||||
msr cntv_cval_el0, x0
|
||||
|
||||
/* Load the exception stack top from the context. */
|
||||
ldr x0, [x0, #0x28]
|
||||
/* Load the exception stack top from tpidr_el1. */
|
||||
mrs x0, tpidr_el1
|
||||
|
||||
/* Setup the stack for a generic exception handle */
|
||||
sub x0, x0, #0x20
|
||||
|
@ -534,16 +516,12 @@ _ZN3ams4kern4arch5arm6421EL1SystemErrorHandlerEv:
|
|||
str x23, [sp, #(8 * 34)]
|
||||
|
||||
/* Invoke ams::kern::arch::arm64::HandleException(ams::kern::arch::arm64::KExceptionContext *). */
|
||||
mrs x18, tpidr_el1
|
||||
mov x0, sp
|
||||
bl _ZN3ams4kern4arch5arm6415HandleExceptionEPNS2_17KExceptionContextE
|
||||
|
||||
1: /* HandleException should never return. The best we can do is infinite loop. */
|
||||
b 1b
|
||||
|
||||
/* Return from the exception. */
|
||||
eret
|
||||
|
||||
/* ams::kern::arch::arm64::EL0SystemErrorHandler() */
|
||||
.section .text._ZN3ams4kern4arch5arm6421EL0SystemErrorHandlerEv, "ax", %progbits
|
||||
.global _ZN3ams4kern4arch5arm6421EL0SystemErrorHandlerEv
|
||||
|
@ -576,7 +554,7 @@ _ZN3ams4kern4arch5arm6421EL0SystemErrorHandlerEv:
|
|||
str x23, [sp, #(8 * 34)]
|
||||
|
||||
/* Invoke ams::kern::arch::arm64::HandleException(ams::kern::arch::arm64::KExceptionContext *). */
|
||||
mrs x18, tpidr_el1
|
||||
ldr x18, [sp, #(0x120 + 0x28)]
|
||||
mov x0, sp
|
||||
bl _ZN3ams4kern4arch5arm6415HandleExceptionEPNS2_17KExceptionContextE
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue