5 changed files with 135 additions and 58 deletions
-
2src/core/CMakeLists.txt
-
57src/core/core.cpp
-
16src/core/core.h
-
72src/core/core_cpu.cpp
-
46src/core/core_cpu.h
@ -0,0 +1,72 @@ |
|||||
|
// Copyright 2018 yuzu emulator team
|
||||
|
// Licensed under GPLv2 or any later version
|
||||
|
// Refer to the license.txt file included.
|
||||
|
|
||||
|
#include "common/logging/log.h"
|
||||
|
#ifdef ARCHITECTURE_x86_64
|
||||
|
#include "core/arm/dynarmic/arm_dynarmic.h"
|
||||
|
#endif
|
||||
|
#include "core/arm/unicorn/arm_unicorn.h"
|
||||
|
#include "core/core_cpu.h"
|
||||
|
#include "core/core_timing.h"
|
||||
|
#include "core/hle/kernel/kernel.h"
|
||||
|
#include "core/hle/kernel/scheduler.h"
|
||||
|
#include "core/hle/kernel/thread.h"
|
||||
|
#include "core/settings.h"
|
||||
|
|
||||
|
namespace Core { |
||||
|
|
||||
|
Cpu::Cpu() { |
||||
|
if (Settings::values.use_cpu_jit) { |
||||
|
#ifdef ARCHITECTURE_x86_64
|
||||
|
arm_interface = std::make_shared<ARM_Dynarmic>(); |
||||
|
#else
|
||||
|
cpu_core = std::make_shared<ARM_Unicorn>(); |
||||
|
NGLOG_WARNING(Core, "CPU JIT requested, but Dynarmic not available"); |
||||
|
#endif
|
||||
|
} else { |
||||
|
arm_interface = std::make_shared<ARM_Unicorn>(); |
||||
|
} |
||||
|
|
||||
|
scheduler = std::make_unique<Kernel::Scheduler>(arm_interface.get()); |
||||
|
} |
||||
|
|
||||
|
void Cpu::RunLoop(bool tight_loop) { |
||||
|
// If we don't have a currently active thread then don't execute instructions,
|
||||
|
// instead advance to the next event and try to yield to the next thread
|
||||
|
if (Kernel::GetCurrentThread() == nullptr) { |
||||
|
NGLOG_TRACE(Core, "Idling"); |
||||
|
CoreTiming::Idle(); |
||||
|
CoreTiming::Advance(); |
||||
|
PrepareReschedule(); |
||||
|
} else { |
||||
|
CoreTiming::Advance(); |
||||
|
if (tight_loop) { |
||||
|
arm_interface->Run(); |
||||
|
} else { |
||||
|
arm_interface->Step(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
Reschedule(); |
||||
|
} |
||||
|
|
||||
|
void Cpu::SingleStep() { |
||||
|
return RunLoop(false); |
||||
|
} |
||||
|
|
||||
|
void Cpu::PrepareReschedule() { |
||||
|
arm_interface->PrepareReschedule(); |
||||
|
reschedule_pending = true; |
||||
|
} |
||||
|
|
||||
|
void Cpu::Reschedule() { |
||||
|
if (!reschedule_pending) { |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
reschedule_pending = false; |
||||
|
scheduler->Reschedule(); |
||||
|
} |
||||
|
|
||||
|
} // namespace Core
|
||||
@ -0,0 +1,46 @@ |
|||||
|
// Copyright 2018 yuzu emulator team |
||||
|
// Licensed under GPLv2 or any later version |
||||
|
// Refer to the license.txt file included. |
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
#include <memory> |
||||
|
#include <string> |
||||
|
#include "common/common_types.h" |
||||
|
|
||||
|
class ARM_Interface; |
||||
|
|
||||
|
namespace Kernel { |
||||
|
class Scheduler; |
||||
|
} |
||||
|
|
||||
|
namespace Core { |
||||
|
|
||||
|
class Cpu { |
||||
|
public: |
||||
|
Cpu(); |
||||
|
|
||||
|
void RunLoop(bool tight_loop = true); |
||||
|
|
||||
|
void SingleStep(); |
||||
|
|
||||
|
void PrepareReschedule(); |
||||
|
|
||||
|
ARM_Interface& CPU() { |
||||
|
return *arm_interface; |
||||
|
} |
||||
|
|
||||
|
Kernel::Scheduler& Scheduler() { |
||||
|
return *scheduler; |
||||
|
} |
||||
|
|
||||
|
private: |
||||
|
void Reschedule(); |
||||
|
|
||||
|
std::shared_ptr<ARM_Interface> arm_interface; |
||||
|
std::unique_ptr<Kernel::Scheduler> scheduler; |
||||
|
|
||||
|
bool reschedule_pending{}; |
||||
|
}; |
||||
|
|
||||
|
} // namespace Core |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue