|
|
@@ -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) {
|