|
|
|
@ -83,8 +83,9 @@ struct KernelCore::Impl { |
|
|
|
} |
|
|
|
|
|
|
|
void InitializeCores() { |
|
|
|
for (auto& core : cores) { |
|
|
|
core.Initialize(current_process->Is64BitProcess()); |
|
|
|
for (u32 core_id = 0; core_id < Core::Hardware::NUM_CPU_CORES; core_id++) { |
|
|
|
cores[core_id].Initialize(current_process->Is64BitProcess()); |
|
|
|
system.Memory().SetCurrentPageTable(*current_process, core_id); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -123,15 +124,6 @@ struct KernelCore::Impl { |
|
|
|
next_user_process_id = KProcess::ProcessIDMin; |
|
|
|
next_thread_id = 1; |
|
|
|
|
|
|
|
for (u32 core_id = 0; core_id < Core::Hardware::NUM_CPU_CORES; core_id++) { |
|
|
|
if (suspend_threads[core_id]) { |
|
|
|
suspend_threads[core_id]->Close(); |
|
|
|
suspend_threads[core_id] = nullptr; |
|
|
|
} |
|
|
|
|
|
|
|
schedulers[core_id].reset(); |
|
|
|
} |
|
|
|
|
|
|
|
cores.clear(); |
|
|
|
|
|
|
|
global_handle_table->Finalize(); |
|
|
|
@ -159,6 +151,16 @@ struct KernelCore::Impl { |
|
|
|
CleanupObject(time_shared_mem); |
|
|
|
CleanupObject(system_resource_limit); |
|
|
|
|
|
|
|
for (u32 core_id = 0; core_id < Core::Hardware::NUM_CPU_CORES; core_id++) { |
|
|
|
if (suspend_threads[core_id]) { |
|
|
|
suspend_threads[core_id]->Close(); |
|
|
|
suspend_threads[core_id] = nullptr; |
|
|
|
} |
|
|
|
|
|
|
|
schedulers[core_id]->Finalize(); |
|
|
|
schedulers[core_id].reset(); |
|
|
|
} |
|
|
|
|
|
|
|
// Next host thead ID to use, 0-3 IDs represent core threads, >3 represent others
|
|
|
|
next_host_thread_id = Core::Hardware::NUM_CPU_CORES; |
|
|
|
|
|
|
|
@ -267,14 +269,6 @@ struct KernelCore::Impl { |
|
|
|
|
|
|
|
void MakeCurrentProcess(KProcess* process) { |
|
|
|
current_process = process; |
|
|
|
if (process == nullptr) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
const u32 core_id = GetCurrentHostThreadID(); |
|
|
|
if (core_id < Core::Hardware::NUM_CPU_CORES) { |
|
|
|
system.Memory().SetCurrentPageTable(*process, core_id); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static inline thread_local u32 host_thread_id = UINT32_MAX; |
|
|
|
@ -1079,13 +1073,11 @@ void KernelCore::ExceptionalExit() { |
|
|
|
} |
|
|
|
|
|
|
|
void KernelCore::EnterSVCProfile() { |
|
|
|
std::size_t core = impl->GetCurrentHostThreadID(); |
|
|
|
impl->svc_ticks[core] = MicroProfileEnter(MICROPROFILE_TOKEN(Kernel_SVC)); |
|
|
|
impl->svc_ticks[CurrentPhysicalCoreIndex()] = MicroProfileEnter(MICROPROFILE_TOKEN(Kernel_SVC)); |
|
|
|
} |
|
|
|
|
|
|
|
void KernelCore::ExitSVCProfile() { |
|
|
|
std::size_t core = impl->GetCurrentHostThreadID(); |
|
|
|
MicroProfileLeave(MICROPROFILE_TOKEN(Kernel_SVC), impl->svc_ticks[core]); |
|
|
|
MicroProfileLeave(MICROPROFILE_TOKEN(Kernel_SVC), impl->svc_ticks[CurrentPhysicalCoreIndex()]); |
|
|
|
} |
|
|
|
|
|
|
|
std::weak_ptr<Kernel::ServiceThread> KernelCore::CreateServiceThread(const std::string& name) { |
|
|
|
|