232d95b56e
Keeps the CPU-specific behavior from being spread throughout the main System class. This will also act as the home to contain member functions that perform operations on all cores. The reason for this being that the following pattern is sort of prevalent throughout sections of the codebase: If clearing the instruction cache for all 4 cores is necessary: Core::System::GetInstance().ArmInterface(0).ClearInstructionCache(); Core::System::GetInstance().ArmInterface(1).ClearInstructionCache(); Core::System::GetInstance().ArmInterface(2).ClearInstructionCache(); Core::System::GetInstance().ArmInterface(3).ClearInstructionCache(); This is kind of... well, silly to copy around whenever it's needed. especially when it can be reduced down to a single line. This change also puts the basics in place to begin "ungrafting" all of the forwarding member functions from the System class that are used to access CPU state or invoke CPU-specific behavior. As such, this change itself makes no changes to the direct external interface of System. This will be covered by another changeset.
60 lines
1.5 KiB
C++
60 lines
1.5 KiB
C++
// Copyright 2018 yuzu emulator team
|
|
// Licensed under GPLv2 or any later version
|
|
// Refer to the license.txt file included.
|
|
|
|
#pragma once
|
|
|
|
#include <array>
|
|
#include <map>
|
|
#include <memory>
|
|
#include <thread>
|
|
|
|
namespace Core {
|
|
|
|
class Cpu;
|
|
class CpuBarrier;
|
|
class ExclusiveMonitor;
|
|
class System;
|
|
|
|
class CpuCoreManager {
|
|
public:
|
|
CpuCoreManager();
|
|
CpuCoreManager(const CpuCoreManager&) = delete;
|
|
CpuCoreManager(CpuCoreManager&&) = delete;
|
|
|
|
~CpuCoreManager();
|
|
|
|
CpuCoreManager& operator=(const CpuCoreManager&) = delete;
|
|
CpuCoreManager& operator=(CpuCoreManager&&) = delete;
|
|
|
|
void Initialize(System& system);
|
|
void Shutdown();
|
|
|
|
Cpu& GetCore(std::size_t index);
|
|
const Cpu& GetCore(std::size_t index) const;
|
|
|
|
Cpu& GetCurrentCore();
|
|
const Cpu& GetCurrentCore() const;
|
|
|
|
ExclusiveMonitor& GetExclusiveMonitor();
|
|
const ExclusiveMonitor& GetExclusiveMonitor() const;
|
|
|
|
void RunLoop(bool tight_loop);
|
|
|
|
void InvalidateAllInstructionCaches();
|
|
|
|
private:
|
|
static constexpr std::size_t NUM_CPU_CORES = 4;
|
|
|
|
std::unique_ptr<ExclusiveMonitor> exclusive_monitor;
|
|
std::unique_ptr<CpuBarrier> barrier;
|
|
std::array<std::unique_ptr<Cpu>, NUM_CPU_CORES> cores;
|
|
std::array<std::unique_ptr<std::thread>, NUM_CPU_CORES - 1> core_threads;
|
|
std::size_t active_core{}; ///< Active core, only used in single thread mode
|
|
|
|
/// Map of guest threads to CPU cores
|
|
std::map<std::thread::id, Cpu*> thread_to_cpu;
|
|
};
|
|
|
|
} // namespace Core
|