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.h | 132 ++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 99 insertions(+), 33 deletions(-) (limited to 'src/core/core.h') diff --git a/src/core/core.h b/src/core/core.h index ffbfa91c3..f4326161d 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -5,11 +5,17 @@ #pragma once #include +#include + #include "common/common_types.h" +#include "core/memory.h" +class EmuWindow; class ARM_Interface; -//////////////////////////////////////////////////////////////////////////////////////////////////// +namespace Loader { +class AppLoader; +} namespace Core { @@ -24,37 +30,97 @@ struct ThreadContext { u32 fpexc; }; -extern std::unique_ptr g_app_core; ///< ARM11 application core -extern std::unique_ptr g_sys_core; ///< ARM11 system (OS) core - -//////////////////////////////////////////////////////////////////////////////////////////////////// - -/// Start the core -void Start(); - -/** - * Run the core CPU loop - * This function runs the core for the specified number of CPU instructions before trying to update - * hardware. This is much faster than SingleStep (and should be equivalent), as the CPU is not - * required to do a full dispatch with each instruction. NOTE: the number of instructions requested - * is not guaranteed to run, as this will be interrupted preemptively if a hardware update is - * requested (e.g. on a thread switch). - */ -void RunLoop(int tight_loop = 1000); - -/// Step the CPU one instruction -void SingleStep(); - -/// Halt the core -void Halt(const char* msg); - -/// Kill the core -void Stop(); - -/// Initialize the core -void Init(); +class System { +public: + /** + * Gets the instance of the System singleton class. + * @returns Reference to the instance of the System singleton class. + */ + static System& GetInstance() { + return s_instance; + } + + /// Enumeration representing the return values of the System Initialize and Load process. + enum class ResultStatus : u32 { + Success, ///< Succeeded + ErrorNotInitialized, ///< Error trying to use core prior to initialization + ErrorGetLoader, ///< Error finding the correct application loader + ErrorSystemMode, ///< Error determining the system mode + ErrorLoader, ///< Error loading the specified application + ErrorLoader_ErrorEncrypted, ///< Error loading the specified application due to encryption + ErrorLoader_ErrorInvalidFormat, ///< Error loading the specified application due to an invalid format + ErrorVideoCore, ///< Error in the video core + }; + + /** + * Initialize the emulated system. + * @param emu_window Pointer to the host-system window used for video output and keyboard input. + * @param system_mode The system mode. + * @return ResultStatus code, indicating if the operation succeeded. + */ + ResultStatus Init(EmuWindow* emu_window, u32 system_mode); + + /// Start the core + void Start(); + + /** + * Run the core CPU loop + * This function runs the core for the specified number of CPU instructions before trying to update + * hardware. This is much faster than SingleStep (and should be equivalent), as the CPU is not + * required to do a full dispatch with each instruction. NOTE: the number of instructions requested + * is not guaranteed to run, as this will be interrupted preemptively if a hardware update is + * requested (e.g. on a thread switch). + * @param tight_loop Number of instructions to execute. + * @return Result status, indicating whethor or not the operation succeeded. + */ + ResultStatus RunLoop(int tight_loop = 1000); + + /** + * Step the CPU one instruction + * @return Result status, indicating whethor or not the operation succeeded. + */ + ResultStatus SingleStep(); + + /// Shutdown the emulated system. + void Shutdown(); + + /** + * Load an executable application. + * @param emu_window Pointer to the host-system window used for video output and keyboard input. + * @param filepath String path to the executable application to load on the host file system. + * @returns ResultStatus code, indicating if the operation succeeded. + */ + ResultStatus Load(EmuWindow* emu_window, const std::string& filepath); + + /** + * Indicates if the emulated system is powered on (all subsystems initialized and able to run an + * application). + * @returns True if the emulated system is powered on, otherwise false. + */ + bool IsPoweredOn() const { + return app_core != nullptr; + } + + /** + * Gets a reference to the emulated AppCore CPU. + * @returns A reference to the emulated AppCore CPU. + */ + ARM_Interface& AppCore() { + return *app_core; + } + +private: + /// AppLoader used to load the current executing application + std::unique_ptr app_loader; + + ///< ARM11 application core + std::unique_ptr app_core; + + static System s_instance; +}; -/// Shutdown the core -void Shutdown(); +static ARM_Interface& AppCore() { + return System::GetInstance().AppCore(); +} -} // namespace +} // namespace Core -- 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.h | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) (limited to 'src/core/core.h') diff --git a/src/core/core.h b/src/core/core.h index f4326161d..8194db6a2 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -52,17 +52,6 @@ public: ErrorVideoCore, ///< Error in the video core }; - /** - * Initialize the emulated system. - * @param emu_window Pointer to the host-system window used for video output and keyboard input. - * @param system_mode The system mode. - * @return ResultStatus code, indicating if the operation succeeded. - */ - ResultStatus Init(EmuWindow* emu_window, u32 system_mode); - - /// Start the core - void Start(); - /** * Run the core CPU loop * This function runs the core for the specified number of CPU instructions before trying to update @@ -101,6 +90,9 @@ public: return app_core != nullptr; } + /// Prepare the core emulation for a reschedule + void PrepareReschedule(); + /** * Gets a reference to the emulated AppCore CPU. * @returns A reference to the emulated AppCore CPU. @@ -110,12 +102,26 @@ public: } private: + /** + * Initialize the emulated system. + * @param emu_window Pointer to the host-system window used for video output and keyboard input. + * @param system_mode The system mode. + * @return ResultStatus code, indicating if the operation succeeded. + */ + ResultStatus Init(EmuWindow* emu_window, u32 system_mode); + + /// Reschedule the core emulation + void Reschedule(); + /// AppLoader used to load the current executing application std::unique_ptr app_loader; ///< ARM11 application core std::unique_ptr app_core; + /// When true, signals that a reschedule should happen + bool reschedule_pending{}; + static System s_instance; }; -- 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.h | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) (limited to 'src/core/core.h') diff --git a/src/core/core.h b/src/core/core.h index 8194db6a2..728c24c1c 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -42,23 +42,24 @@ public: /// Enumeration representing the return values of the System Initialize and Load process. enum class ResultStatus : u32 { - Success, ///< Succeeded - ErrorNotInitialized, ///< Error trying to use core prior to initialization - ErrorGetLoader, ///< Error finding the correct application loader - ErrorSystemMode, ///< Error determining the system mode - ErrorLoader, ///< Error loading the specified application + Success, ///< Succeeded + ErrorNotInitialized, ///< Error trying to use core prior to initialization + ErrorGetLoader, ///< Error finding the correct application loader + ErrorSystemMode, ///< Error determining the system mode + ErrorLoader, ///< Error loading the specified application ErrorLoader_ErrorEncrypted, ///< Error loading the specified application due to encryption - ErrorLoader_ErrorInvalidFormat, ///< Error loading the specified application due to an invalid format - ErrorVideoCore, ///< Error in the video core + ErrorLoader_ErrorInvalidFormat, ///< Error loading the specified application due to an + /// invalid format + ErrorVideoCore, ///< Error in the video core }; /** * Run the core CPU loop - * This function runs the core for the specified number of CPU instructions before trying to update - * hardware. This is much faster than SingleStep (and should be equivalent), as the CPU is not - * required to do a full dispatch with each instruction. NOTE: the number of instructions requested - * is not guaranteed to run, as this will be interrupted preemptively if a hardware update is - * requested (e.g. on a thread switch). + * This function runs the core for the specified number of CPU instructions before trying to + * update hardware. This is much faster than SingleStep (and should be equivalent), as the CPU + * is not required to do a full dispatch with each instruction. NOTE: the number of instructions + * requested is not guaranteed to run, as this will be interrupted preemptively if a hardware + * update is requested (e.g. on a thread switch). * @param tight_loop Number of instructions to execute. * @return Result status, indicating whethor or not the operation succeeded. */ -- 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.h | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'src/core/core.h') diff --git a/src/core/core.h b/src/core/core.h index 728c24c1c..b0f8df441 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -88,18 +88,18 @@ public: * @returns True if the emulated system is powered on, otherwise false. */ bool IsPoweredOn() const { - return app_core != nullptr; + return cpu_core != nullptr; } /// Prepare the core emulation for a reschedule void PrepareReschedule(); /** - * Gets a reference to the emulated AppCore CPU. - * @returns A reference to the emulated AppCore CPU. + * Gets a reference to the emulated CPU. + * @returns A reference to the emulated CPU. */ - ARM_Interface& AppCore() { - return *app_core; + ARM_Interface& CPU() { + return *cpu_core; } private: @@ -117,8 +117,8 @@ private: /// AppLoader used to load the current executing application std::unique_ptr app_loader; - ///< ARM11 application core - std::unique_ptr app_core; + ///< ARM11 CPU core + std::unique_ptr cpu_core; /// When true, signals that a reschedule should happen bool reschedule_pending{}; @@ -126,8 +126,8 @@ private: static System s_instance; }; -static ARM_Interface& AppCore() { - return System::GetInstance().AppCore(); +static ARM_Interface& CPU() { + return System::GetInstance().CPU(); } } // namespace Core -- cgit v1.2.3 From 8b1e269e5898ad0b6aadabee41fea777f0e62fdc Mon Sep 17 00:00:00 2001 From: bunnei Date: Thu, 22 Dec 2016 00:08:09 -0500 Subject: ThreadContext: Move from "core" to "arm_interface". --- src/core/core.h | 11 ----------- 1 file changed, 11 deletions(-) (limited to 'src/core/core.h') diff --git a/src/core/core.h b/src/core/core.h index b0f8df441..1015e8847 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -19,17 +19,6 @@ class AppLoader; namespace Core { -struct ThreadContext { - u32 cpu_registers[13]; - u32 sp; - u32 lr; - u32 pc; - u32 cpsr; - u32 fpu_registers[64]; - u32 fpscr; - u32 fpexc; -}; - class System { public: /** -- cgit v1.2.3