diff --git a/src/core/arm/exclusive_monitor.cpp b/src/core/arm/exclusive_monitor.cpp index abd59ff4b..00e6a19d5 100644 --- a/src/core/arm/exclusive_monitor.cpp +++ b/src/core/arm/exclusive_monitor.cpp @@ -2,10 +2,23 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#ifdef ARCHITECTURE_x86_64 +#include "core/arm/dynarmic/arm_dynarmic.h" +#endif #include "core/arm/exclusive_monitor.h" +#include "core/memory.h" namespace Core { ExclusiveMonitor::~ExclusiveMonitor() = default; +std::unique_ptr MakeExclusiveMonitor(Memory::Memory& memory, std::size_t num_cores) { +#ifdef ARCHITECTURE_x86_64 + return std::make_unique(memory, num_cores); +#else + // TODO(merry): Passthrough exclusive monitor + return nullptr; +#endif +} + } // namespace Core diff --git a/src/core/arm/exclusive_monitor.h b/src/core/arm/exclusive_monitor.h index f59aca667..18461f296 100644 --- a/src/core/arm/exclusive_monitor.h +++ b/src/core/arm/exclusive_monitor.h @@ -1,11 +1,17 @@ -// Copyright 2018 yuzu emulator team +// Copyright 2020 yuzu emulator team // Licensed under GPLv2 or any later version // Refer to the license.txt file included. #pragma once +#include + #include "common/common_types.h" +namespace Memory { +class Memory; +} + namespace Core { class ExclusiveMonitor { @@ -22,4 +28,6 @@ public: virtual bool ExclusiveWrite128(std::size_t core_index, VAddr vaddr, u128 value) = 0; }; +std::unique_ptr MakeExclusiveMonitor(Memory::Memory& memory, std::size_t num_cores); + } // namespace Core diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index b7fd480d1..1986cf65c 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp @@ -3,6 +3,7 @@ // Refer to the license.txt file included. #include +#include #include #include #include @@ -10,9 +11,6 @@ #include "common/assert.h" #include "common/logging/log.h" #include "core/arm/arm_interface.h" -#ifdef ARCHITECTURE_x86_64 -#include "core/arm/dynarmic/arm_dynarmic.h" -#endif #include "core/arm/exclusive_monitor.h" #include "core/core.h" #include "core/core_timing.h" @@ -137,7 +135,7 @@ struct KernelCore::Impl { } void InitializePhysicalCores(KernelCore& kernel) { - exclusive_monitor = MakeExclusiveMonitor(); + exclusive_monitor = Core::MakeExclusiveMonitor(system.Memory(), global_scheduler.CpuCoresCount()); for (std::size_t i = 0; i < global_scheduler.CpuCoresCount(); i++) { cores.emplace_back(system, kernel, i, *exclusive_monitor); } @@ -156,7 +154,6 @@ struct KernelCore::Impl { ASSERT(system_resource_limit->SetLimitValue(ResourceType::Sessions, 900).IsSuccess()); } - void InitializeThreads() { thread_wakeup_event_type = Core::Timing::CreateEvent("ThreadWakeupCallback", ThreadWakeupCallback); @@ -184,16 +181,6 @@ struct KernelCore::Impl { system.Memory().SetCurrentPageTable(*process); } - std::unique_ptr MakeExclusiveMonitor() { - #ifdef ARCHITECTURE_x86_64 - return std::make_unique(system.Memory(), - global_scheduler.CpuCoresCount()); - #else - // TODO(merry): Passthrough exclusive monitor - return nullptr; - #endif - } - std::atomic next_object_id{0}; std::atomic next_kernel_process_id{Process::InitialKIPIDMin}; std::atomic next_user_process_id{Process::ProcessIDMin};