1
0
Fork 1
forked from suyu/suyu

System: Address Feedback

This commit is contained in:
Fernando Sahmkow 2020-01-26 16:14:18 -04:00 committed by FernandoS27
parent de4b01f75d
commit 2d1984c20c
11 changed files with 30 additions and 24 deletions

View file

@ -12,7 +12,8 @@ namespace Core {
ExclusiveMonitor::~ExclusiveMonitor() = default; ExclusiveMonitor::~ExclusiveMonitor() = default;
std::unique_ptr<Core::ExclusiveMonitor> MakeExclusiveMonitor(Memory::Memory& memory, std::size_t num_cores) { std::unique_ptr<Core::ExclusiveMonitor> MakeExclusiveMonitor(Memory::Memory& memory,
std::size_t num_cores) {
#ifdef ARCHITECTURE_x86_64 #ifdef ARCHITECTURE_x86_64
return std::make_unique<Core::DynarmicExclusiveMonitor>(memory, num_cores); return std::make_unique<Core::DynarmicExclusiveMonitor>(memory, num_cores);
#else #else

View file

@ -1,4 +1,4 @@
// Copyright 2020 yuzu emulator team // Copyright 2018 yuzu emulator team
// Licensed under GPLv2 or any later version // Licensed under GPLv2 or any later version
// Refer to the license.txt file included. // Refer to the license.txt file included.
@ -28,6 +28,7 @@ public:
virtual bool ExclusiveWrite128(std::size_t core_index, VAddr vaddr, u128 value) = 0; virtual bool ExclusiveWrite128(std::size_t core_index, VAddr vaddr, u128 value) = 0;
}; };
std::unique_ptr<Core::ExclusiveMonitor> MakeExclusiveMonitor(Memory::Memory& memory, std::size_t num_cores); std::unique_ptr<Core::ExclusiveMonitor> MakeExclusiveMonitor(Memory::Memory& memory,
std::size_t num_cores);
} // namespace Core } // namespace Core

View file

@ -121,8 +121,8 @@ struct System::Impl {
} }
Kernel::PhysicalCore& CurrentPhysicalCore() { Kernel::PhysicalCore& CurrentPhysicalCore() {
const auto i = cpu_manager.GetActiveCoreIndex(); const auto index = cpu_manager.GetActiveCoreIndex();
return kernel.PhysicalCore(i); return kernel.PhysicalCore(index);
} }
Kernel::PhysicalCore& GetPhysicalCore(std::size_t index) { Kernel::PhysicalCore& GetPhysicalCore(std::size_t index) {

View file

@ -24,10 +24,9 @@
namespace Core { namespace Core {
CoreManager::CoreManager(System& system, std::size_t core_index) CoreManager::CoreManager(System& system, std::size_t core_index)
: global_scheduler{system.GlobalScheduler()}, : global_scheduler{system.GlobalScheduler()}, physical_core{system.Kernel().PhysicalCore(
physical_core{system.Kernel().PhysicalCore(core_index)}, core_timing{system.CoreTiming()}, core_index)},
core_index{core_index} { core_timing{system.CoreTiming()}, core_index{core_index} {}
}
CoreManager::~CoreManager() = default; CoreManager::~CoreManager() = default;

View file

@ -5,10 +5,8 @@
#pragma once #pragma once
#include <atomic> #include <atomic>
#include <condition_variable>
#include <cstddef> #include <cstddef>
#include <memory> #include <memory>
#include <mutex>
#include "common/common_types.h" #include "common/common_types.h"
namespace Kernel { namespace Kernel {

View file

@ -17,7 +17,6 @@ CpuManager::CpuManager(System& system) : system{system} {}
CpuManager::~CpuManager() = default; CpuManager::~CpuManager() = default;
void CpuManager::Initialize() { void CpuManager::Initialize() {
for (std::size_t index = 0; index < core_managers.size(); ++index) { for (std::size_t index = 0; index < core_managers.size(); ++index) {
core_managers[index] = std::make_unique<CoreManager>(system, index); core_managers[index] = std::make_unique<CoreManager>(system, index);
} }

View file

@ -5,9 +5,7 @@
#pragma once #pragma once
#include <array> #include <array>
#include <map>
#include <memory> #include <memory>
#include <thread>
namespace Core { namespace Core {

View file

@ -135,7 +135,8 @@ struct KernelCore::Impl {
} }
void InitializePhysicalCores(KernelCore& kernel) { void InitializePhysicalCores(KernelCore& kernel) {
exclusive_monitor = Core::MakeExclusiveMonitor(system.Memory(), global_scheduler.CpuCoresCount()); exclusive_monitor =
Core::MakeExclusiveMonitor(system.Memory(), global_scheduler.CpuCoresCount());
for (std::size_t i = 0; i < global_scheduler.CpuCoresCount(); i++) { for (std::size_t i = 0; i < global_scheduler.CpuCoresCount(); i++) {
cores.emplace_back(system, kernel, i, *exclusive_monitor); cores.emplace_back(system, kernel, i, *exclusive_monitor);
} }
@ -284,7 +285,7 @@ void KernelCore::InvalidateAllInstructionCaches() {
} }
void KernelCore::PrepareReschedule(std::size_t id) { void KernelCore::PrepareReschedule(std::size_t id) {
if (id >= 0 && id < impl->global_scheduler.CpuCoresCount()) { if (id < impl->global_scheduler.CpuCoresCount()) {
impl->cores[id].Stop(); impl->cores[id].Stop();
} }
} }

View file

@ -13,7 +13,7 @@
namespace Core { namespace Core {
class ExclusiveMonitor; class ExclusiveMonitor;
class System; class System;
} } // namespace Core
namespace Core::Timing { namespace Core::Timing {
class CoreTiming; class CoreTiming;

View file

@ -17,18 +17,21 @@
namespace Kernel { namespace Kernel {
PhysicalCore::PhysicalCore(Core::System& system, KernelCore& kernel, std::size_t id, Core::ExclusiveMonitor& exclusive_monitor) PhysicalCore::PhysicalCore(Core::System& system, KernelCore& kernel, std::size_t id,
Core::ExclusiveMonitor& exclusive_monitor)
: core_index{id}, kernel{kernel} { : core_index{id}, kernel{kernel} {
#ifdef ARCHITECTURE_x86_64 #ifdef ARCHITECTURE_x86_64
arm_interface = std::make_unique<Core::ARM_Dynarmic>(system, exclusive_monitor, core_index); arm_interface = std::make_shared<Core::ARM_Dynarmic>(system, exclusive_monitor, core_index);
#else #else
arm_interface = std::make_unique<Core::ARM_Unicorn>(system); arm_interface = std::make_shared<Core::ARM_Unicorn>(system);
LOG_WARNING(Core, "CPU JIT requested, but Dynarmic not available"); LOG_WARNING(Core, "CPU JIT requested, but Dynarmic not available");
#endif #endif
scheduler = std::make_unique<Kernel::Scheduler>(system, *arm_interface, core_index); scheduler = std::make_shared<Kernel::Scheduler>(system, *arm_interface, core_index);
} }
PhysicalCore::~PhysicalCore() = default;
void PhysicalCore::Run() { void PhysicalCore::Run() {
arm_interface->Run(); arm_interface->Run();
arm_interface->ClearExclusiveState(); arm_interface->ClearExclusiveState();

View file

@ -4,6 +4,9 @@
#pragma once #pragma once
#include <cstddef>
#include <memory>
namespace Kernel { namespace Kernel {
class Scheduler; class Scheduler;
} // namespace Kernel } // namespace Kernel
@ -18,7 +21,10 @@ namespace Kernel {
class PhysicalCore { class PhysicalCore {
public: public:
PhysicalCore(Core::System& system, KernelCore& kernel, std::size_t id, Core::ExclusiveMonitor& exclusive_monitor); PhysicalCore(Core::System& system, KernelCore& kernel, std::size_t id,
Core::ExclusiveMonitor& exclusive_monitor);
~PhysicalCore();
/// Execute current jit state /// Execute current jit state
void Run(); void Run();
@ -61,8 +67,8 @@ public:
private: private:
std::size_t core_index; std::size_t core_index;
KernelCore& kernel; KernelCore& kernel;
std::unique_ptr<Core::ARM_Interface> arm_interface; std::shared_ptr<Core::ARM_Interface> arm_interface;
std::unique_ptr<Kernel::Scheduler> scheduler; std::shared_ptr<Kernel::Scheduler> scheduler;
}; };
} // namespace Kernel } // namespace Kernel