diff options
| author | Mat M <mathew1800@gmail.com> | 2018-07-22 12:48:44 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-07-22 12:48:44 -0400 |
| commit | 5fc99553d20d7d747730f7da4d12bdeb0593adb2 (patch) | |
| tree | 4f3217d3f564c47b8aeecac046e389ba6d3d07ed /src/core/core_cpu.cpp | |
| parent | 3e2b32a3ee4ee6c212972c544d7844632d202fd9 (diff) | |
| parent | 0b1c2e5505c6478ef10e65c0b002eeb242e15540 (diff) | |
Merge pull request #638 from MerryMage/mp
Implement exclusive monitor
Diffstat (limited to 'src/core/core_cpu.cpp')
| -rw-r--r-- | src/core/core_cpu.cpp | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/src/core/core_cpu.cpp b/src/core/core_cpu.cpp index f22d6a9d0..54e15a701 100644 --- a/src/core/core_cpu.cpp +++ b/src/core/core_cpu.cpp @@ -48,14 +48,15 @@ bool CpuBarrier::Rendezvous() { return false; } -Cpu::Cpu(std::shared_ptr<CpuBarrier> cpu_barrier, size_t core_index) +Cpu::Cpu(std::shared_ptr<ExclusiveMonitor> exclusive_monitor, + std::shared_ptr<CpuBarrier> cpu_barrier, size_t core_index) : cpu_barrier{std::move(cpu_barrier)}, core_index{core_index} { if (Settings::values.use_cpu_jit) { #ifdef ARCHITECTURE_x86_64 - arm_interface = std::make_shared<ARM_Dynarmic>(); + arm_interface = std::make_shared<ARM_Dynarmic>(exclusive_monitor, core_index); #else - cpu_core = std::make_shared<ARM_Unicorn>(); + arm_interface = std::make_shared<ARM_Unicorn>(); LOG_WARNING(Core, "CPU JIT requested, but Dynarmic not available"); #endif } else { @@ -65,6 +66,18 @@ Cpu::Cpu(std::shared_ptr<CpuBarrier> cpu_barrier, size_t core_index) scheduler = std::make_shared<Kernel::Scheduler>(arm_interface.get()); } +std::shared_ptr<ExclusiveMonitor> Cpu::MakeExclusiveMonitor(size_t num_cores) { + if (Settings::values.use_cpu_jit) { +#ifdef ARCHITECTURE_x86_64 + return std::make_shared<DynarmicExclusiveMonitor>(num_cores); +#else + return nullptr; // TODO(merry): Passthrough exclusive monitor +#endif + } else { + return nullptr; // TODO(merry): Passthrough exclusive monitor + } +} + void Cpu::RunLoop(bool tight_loop) { // Wait for all other CPU cores to complete the previous slice, such that they run in lock-step if (!cpu_barrier->Rendezvous()) { |
