From 232ef55c1a13552e5ba8b72d61d1d072f5851598 Mon Sep 17 00:00:00 2001 From: bunnei Date: Thu, 15 Dec 2016 19:01:48 -0500 Subject: core: Consolidate core and system state, remove system module & cleanups. --- src/core/core.cpp | 112 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 87 insertions(+), 25 deletions(-) (limited to 'src/core/core.cpp') diff --git a/src/core/core.cpp b/src/core/core.cpp index 6efa18159..b4df90efd 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -3,6 +3,8 @@ // Refer to the license.txt file included. #include + +#include "audio_core/audio_core.h" #include "common/logging/log.h" #include "core/arm/arm_interface.h" #include "core/arm/dynarmic/arm_dynarmic.h" @@ -11,17 +13,23 @@ #include "core/core_timing.h" #include "core/gdbstub/gdbstub.h" #include "core/hle/hle.h" +#include "core/hle/kernel/kernel.h" +#include "core/hle/kernel/memory.h" #include "core/hle/kernel/thread.h" #include "core/hw/hw.h" +#include "core/loader/loader.h" #include "core/settings.h" +#include "video_core/video_core.h" namespace Core { -std::unique_ptr g_app_core; ///< ARM11 application core -std::unique_ptr g_sys_core; ///< ARM11 system (OS) core +/*static*/ System System::s_instance; + +System::ResultStatus System::RunLoop(int tight_loop) { + if (!app_core) { + return ResultStatus::ErrorNotInitialized; + } -/// Run the core CPU loop -void RunLoop(int tight_loop) { if (GDBStub::IsServerEnabled()) { GDBStub::HandlePacket(); @@ -32,7 +40,7 @@ void RunLoop(int tight_loop) { GDBStub::SetCpuStepFlag(false); tight_loop = 1; } else { - return; + return ResultStatus::Success; } } } @@ -45,46 +53,100 @@ void RunLoop(int tight_loop) { CoreTiming::Advance(); HLE::Reschedule(__func__); } else { - g_app_core->Run(tight_loop); + app_core->Run(tight_loop); } HW::Update(); if (HLE::IsReschedulePending()) { Kernel::Reschedule(); } -} -/// Step the CPU one instruction -void SingleStep() { - RunLoop(1); + return ResultStatus::Success; } -/// Halt the core -void Halt(const char* msg) { - // TODO(ShizZy): ImplementMe +System::ResultStatus System::SingleStep() { + return RunLoop(1); } -/// Kill the core -void Stop() { - // TODO(ShizZy): ImplementMe +System::ResultStatus System::Load(EmuWindow* emu_window, const std::string& filepath) { + if (app_loader) { + app_loader.reset(); + } + + app_loader = Loader::GetLoader(filepath); + + if (!app_loader) { + LOG_CRITICAL(Core, "Failed to obtain loader for %s!", filepath.c_str()); + return ResultStatus::ErrorGetLoader; + } + + boost::optional system_mode{ app_loader->LoadKernelSystemMode() }; + if (!system_mode) { + LOG_CRITICAL(Core, "Failed to determine system mode!"); + return ResultStatus::ErrorSystemMode; + } + + ResultStatus init_result{ Init(emu_window, system_mode.get()) }; + if (init_result != ResultStatus::Success) { + LOG_CRITICAL(Core, "Failed to initialize system (Error %i)!", init_result); + System::Shutdown(); + return init_result; + } + + const Loader::ResultStatus load_result{ app_loader->Load() }; + if (Loader::ResultStatus::Success != load_result) { + LOG_CRITICAL(Core, "Failed to load ROM (Error %i)!", load_result); + System::Shutdown(); + + switch (load_result) { + case Loader::ResultStatus::ErrorEncrypted: + return ResultStatus::ErrorLoader_ErrorEncrypted; + case Loader::ResultStatus::ErrorInvalidFormat: + return ResultStatus::ErrorLoader_ErrorInvalidFormat; + default: + return ResultStatus::ErrorLoader; + } + } + return ResultStatus::Success; } -/// Initialize the core -void Init() { +System::ResultStatus System::Init(EmuWindow* emu_window, u32 system_mode) { + if (app_core) { + app_core.reset(); + } + + Memory::Init(); + if (Settings::values.use_cpu_jit) { - g_sys_core = std::make_unique(USER32MODE); - g_app_core = std::make_unique(USER32MODE); + app_core = std::make_unique(USER32MODE); } else { - g_sys_core = std::make_unique(USER32MODE); - g_app_core = std::make_unique(USER32MODE); + app_core = std::make_unique(USER32MODE); + } + + CoreTiming::Init(); + HW::Init(); + Kernel::Init(system_mode); + HLE::Init(); + AudioCore::Init(); + GDBStub::Init(); + + if (!VideoCore::Init(emu_window)) { + return ResultStatus::ErrorVideoCore; } LOG_DEBUG(Core, "Initialized OK"); + + return ResultStatus::Success; } -void Shutdown() { - g_app_core.reset(); - g_sys_core.reset(); +void System::Shutdown() { + GDBStub::Shutdown(); + AudioCore::Shutdown(); + VideoCore::Shutdown(); + HLE::Shutdown(); + Kernel::Shutdown(); + HW::Shutdown(); + CoreTiming::Shutdown(); LOG_DEBUG(Core, "Shutdown OK"); } -- cgit v1.2.3 From 4fc8b8229ed1d9ea9d20faee7059c898265db6cf Mon Sep 17 00:00:00 2001 From: bunnei Date: Fri, 16 Dec 2016 00:37:38 -0500 Subject: core: Remove HLE module, consolidate code & various cleanups. --- src/core/core.cpp | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) (limited to 'src/core/core.cpp') diff --git a/src/core/core.cpp b/src/core/core.cpp index b4df90efd..67d7cf7b2 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -12,10 +12,10 @@ #include "core/core.h" #include "core/core_timing.h" #include "core/gdbstub/gdbstub.h" -#include "core/hle/hle.h" #include "core/hle/kernel/kernel.h" #include "core/hle/kernel/memory.h" #include "core/hle/kernel/thread.h" +#include "core/hle/service/service.h" #include "core/hw/hw.h" #include "core/loader/loader.h" #include "core/settings.h" @@ -51,15 +51,13 @@ System::ResultStatus System::RunLoop(int tight_loop) { LOG_TRACE(Core_ARM11, "Idling"); CoreTiming::Idle(); CoreTiming::Advance(); - HLE::Reschedule(__func__); + PrepareReschedule(); } else { app_core->Run(tight_loop); } HW::Update(); - if (HLE::IsReschedulePending()) { - Kernel::Reschedule(); - } + Reschedule(); return ResultStatus::Success; } @@ -110,6 +108,20 @@ System::ResultStatus System::Load(EmuWindow* emu_window, const std::string& file return ResultStatus::Success; } +void System::PrepareReschedule() { + app_core->PrepareReschedule(); + reschedule_pending = true; +} + +void System::Reschedule() { + if (!reschedule_pending) { + return; + } + + reschedule_pending = false; + Kernel::Reschedule(); +} + System::ResultStatus System::Init(EmuWindow* emu_window, u32 system_mode) { if (app_core) { app_core.reset(); @@ -126,7 +138,7 @@ System::ResultStatus System::Init(EmuWindow* emu_window, u32 system_mode) { CoreTiming::Init(); HW::Init(); Kernel::Init(system_mode); - HLE::Init(); + Service::Init(); AudioCore::Init(); GDBStub::Init(); @@ -143,7 +155,7 @@ void System::Shutdown() { GDBStub::Shutdown(); AudioCore::Shutdown(); VideoCore::Shutdown(); - HLE::Shutdown(); + Service::Shutdown(); Kernel::Shutdown(); HW::Shutdown(); CoreTiming::Shutdown(); -- cgit v1.2.3 From 5ac5cbeab7387b2eabd4618291e223fd7189bb8b Mon Sep 17 00:00:00 2001 From: bunnei Date: Sat, 17 Dec 2016 01:20:47 -0500 Subject: Address clang-format issues. --- src/core/core.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/core/core.cpp') diff --git a/src/core/core.cpp b/src/core/core.cpp index 67d7cf7b2..fabd3f42a 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -78,20 +78,20 @@ System::ResultStatus System::Load(EmuWindow* emu_window, const std::string& file return ResultStatus::ErrorGetLoader; } - boost::optional system_mode{ app_loader->LoadKernelSystemMode() }; + boost::optional system_mode{app_loader->LoadKernelSystemMode()}; if (!system_mode) { LOG_CRITICAL(Core, "Failed to determine system mode!"); return ResultStatus::ErrorSystemMode; } - ResultStatus init_result{ Init(emu_window, system_mode.get()) }; + ResultStatus init_result{Init(emu_window, system_mode.get())}; if (init_result != ResultStatus::Success) { LOG_CRITICAL(Core, "Failed to initialize system (Error %i)!", init_result); System::Shutdown(); return init_result; } - const Loader::ResultStatus load_result{ app_loader->Load() }; + const Loader::ResultStatus load_result{app_loader->Load()}; if (Loader::ResultStatus::Success != load_result) { LOG_CRITICAL(Core, "Failed to load ROM (Error %i)!", load_result); System::Shutdown(); -- cgit v1.2.3 From e26fbfd1d72c026d0f25c09595e7123459b1734f Mon Sep 17 00:00:00 2001 From: bunnei Date: Thu, 22 Dec 2016 00:00:01 -0500 Subject: core: Replace "AppCore" nomenclature with just "CPU". --- src/core/core.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'src/core/core.cpp') diff --git a/src/core/core.cpp b/src/core/core.cpp index fabd3f42a..ee5237096 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -26,7 +26,7 @@ namespace Core { /*static*/ System System::s_instance; System::ResultStatus System::RunLoop(int tight_loop) { - if (!app_core) { + if (!cpu_core) { return ResultStatus::ErrorNotInitialized; } @@ -53,7 +53,7 @@ System::ResultStatus System::RunLoop(int tight_loop) { CoreTiming::Advance(); PrepareReschedule(); } else { - app_core->Run(tight_loop); + cpu_core->Run(tight_loop); } HW::Update(); @@ -109,7 +109,7 @@ System::ResultStatus System::Load(EmuWindow* emu_window, const std::string& file } void System::PrepareReschedule() { - app_core->PrepareReschedule(); + cpu_core->PrepareReschedule(); reschedule_pending = true; } @@ -123,16 +123,16 @@ void System::Reschedule() { } System::ResultStatus System::Init(EmuWindow* emu_window, u32 system_mode) { - if (app_core) { - app_core.reset(); + if (cpu_core) { + cpu_core.reset(); } Memory::Init(); if (Settings::values.use_cpu_jit) { - app_core = std::make_unique(USER32MODE); + cpu_core = std::make_unique(USER32MODE); } else { - app_core = std::make_unique(USER32MODE); + cpu_core = std::make_unique(USER32MODE); } CoreTiming::Init(); -- cgit v1.2.3