diff options
Diffstat (limited to 'src/core/arm')
| -rw-r--r-- | src/core/arm/arm_interface.h | 11 | ||||
| -rw-r--r-- | src/core/arm/cpu_interrupt_handler.cpp | 24 | ||||
| -rw-r--r-- | src/core/arm/cpu_interrupt_handler.h | 39 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_32.cpp | 13 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_32.h | 5 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_64.cpp | 12 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_64.h | 6 |
7 files changed, 25 insertions, 85 deletions
diff --git a/src/core/arm/arm_interface.h b/src/core/arm/arm_interface.h index 73f259525..7d62d030e 100644 --- a/src/core/arm/arm_interface.h +++ b/src/core/arm/arm_interface.h | |||
| @@ -27,7 +27,6 @@ namespace Core { | |||
| 27 | class System; | 27 | class System; |
| 28 | class CPUInterruptHandler; | 28 | class CPUInterruptHandler; |
| 29 | 29 | ||
| 30 | using CPUInterrupts = std::array<CPUInterruptHandler, Core::Hardware::NUM_CPU_CORES>; | ||
| 31 | using WatchpointArray = std::array<Kernel::DebugWatchpoint, Core::Hardware::NUM_WATCHPOINTS>; | 30 | using WatchpointArray = std::array<Kernel::DebugWatchpoint, Core::Hardware::NUM_WATCHPOINTS>; |
| 32 | 31 | ||
| 33 | /// Generic ARMv8 CPU interface | 32 | /// Generic ARMv8 CPU interface |
| @@ -36,10 +35,8 @@ public: | |||
| 36 | YUZU_NON_COPYABLE(ARM_Interface); | 35 | YUZU_NON_COPYABLE(ARM_Interface); |
| 37 | YUZU_NON_MOVEABLE(ARM_Interface); | 36 | YUZU_NON_MOVEABLE(ARM_Interface); |
| 38 | 37 | ||
| 39 | explicit ARM_Interface(System& system_, CPUInterrupts& interrupt_handlers_, | 38 | explicit ARM_Interface(System& system_, bool uses_wall_clock_) |
| 40 | bool uses_wall_clock_) | 39 | : system{system_}, uses_wall_clock{uses_wall_clock_} {} |
| 41 | : system{system_}, interrupt_handlers{interrupt_handlers_}, uses_wall_clock{ | ||
| 42 | uses_wall_clock_} {} | ||
| 43 | virtual ~ARM_Interface() = default; | 40 | virtual ~ARM_Interface() = default; |
| 44 | 41 | ||
| 45 | struct ThreadContext32 { | 42 | struct ThreadContext32 { |
| @@ -181,6 +178,9 @@ public: | |||
| 181 | /// Signal an interrupt and ask the core to halt as soon as possible. | 178 | /// Signal an interrupt and ask the core to halt as soon as possible. |
| 182 | virtual void SignalInterrupt() = 0; | 179 | virtual void SignalInterrupt() = 0; |
| 183 | 180 | ||
| 181 | /// Clear a previous interrupt. | ||
| 182 | virtual void ClearInterrupt() = 0; | ||
| 183 | |||
| 184 | struct BacktraceEntry { | 184 | struct BacktraceEntry { |
| 185 | std::string module; | 185 | std::string module; |
| 186 | u64 address; | 186 | u64 address; |
| @@ -208,7 +208,6 @@ public: | |||
| 208 | protected: | 208 | protected: |
| 209 | /// System context that this ARM interface is running under. | 209 | /// System context that this ARM interface is running under. |
| 210 | System& system; | 210 | System& system; |
| 211 | CPUInterrupts& interrupt_handlers; | ||
| 212 | const WatchpointArray* watchpoints; | 211 | const WatchpointArray* watchpoints; |
| 213 | bool uses_wall_clock; | 212 | bool uses_wall_clock; |
| 214 | 213 | ||
diff --git a/src/core/arm/cpu_interrupt_handler.cpp b/src/core/arm/cpu_interrupt_handler.cpp deleted file mode 100644 index 77b6194d7..000000000 --- a/src/core/arm/cpu_interrupt_handler.cpp +++ /dev/null | |||
| @@ -1,24 +0,0 @@ | |||
| 1 | // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | #include "common/thread.h" | ||
| 5 | #include "core/arm/cpu_interrupt_handler.h" | ||
| 6 | |||
| 7 | namespace Core { | ||
| 8 | |||
| 9 | CPUInterruptHandler::CPUInterruptHandler() : interrupt_event{std::make_unique<Common::Event>()} {} | ||
| 10 | |||
| 11 | CPUInterruptHandler::~CPUInterruptHandler() = default; | ||
| 12 | |||
| 13 | void CPUInterruptHandler::SetInterrupt(bool is_interrupted_) { | ||
| 14 | if (is_interrupted_) { | ||
| 15 | interrupt_event->Set(); | ||
| 16 | } | ||
| 17 | is_interrupted = is_interrupted_; | ||
| 18 | } | ||
| 19 | |||
| 20 | void CPUInterruptHandler::AwaitInterrupt() { | ||
| 21 | interrupt_event->Wait(); | ||
| 22 | } | ||
| 23 | |||
| 24 | } // namespace Core | ||
diff --git a/src/core/arm/cpu_interrupt_handler.h b/src/core/arm/cpu_interrupt_handler.h deleted file mode 100644 index 286e12e53..000000000 --- a/src/core/arm/cpu_interrupt_handler.h +++ /dev/null | |||
| @@ -1,39 +0,0 @@ | |||
| 1 | // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | #pragma once | ||
| 5 | |||
| 6 | #include <atomic> | ||
| 7 | #include <memory> | ||
| 8 | |||
| 9 | namespace Common { | ||
| 10 | class Event; | ||
| 11 | } | ||
| 12 | |||
| 13 | namespace Core { | ||
| 14 | |||
| 15 | class CPUInterruptHandler { | ||
| 16 | public: | ||
| 17 | CPUInterruptHandler(); | ||
| 18 | ~CPUInterruptHandler(); | ||
| 19 | |||
| 20 | CPUInterruptHandler(const CPUInterruptHandler&) = delete; | ||
| 21 | CPUInterruptHandler& operator=(const CPUInterruptHandler&) = delete; | ||
| 22 | |||
| 23 | CPUInterruptHandler(CPUInterruptHandler&&) = delete; | ||
| 24 | CPUInterruptHandler& operator=(CPUInterruptHandler&&) = delete; | ||
| 25 | |||
| 26 | bool IsInterrupted() const { | ||
| 27 | return is_interrupted; | ||
| 28 | } | ||
| 29 | |||
| 30 | void SetInterrupt(bool is_interrupted); | ||
| 31 | |||
| 32 | void AwaitInterrupt(); | ||
| 33 | |||
| 34 | private: | ||
| 35 | std::unique_ptr<Common::Event> interrupt_event; | ||
| 36 | std::atomic_bool is_interrupted{false}; | ||
| 37 | }; | ||
| 38 | |||
| 39 | } // namespace Core | ||
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index 99fab6384..2e0e16b6e 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp | |||
| @@ -11,7 +11,6 @@ | |||
| 11 | #include "common/logging/log.h" | 11 | #include "common/logging/log.h" |
| 12 | #include "common/page_table.h" | 12 | #include "common/page_table.h" |
| 13 | #include "common/settings.h" | 13 | #include "common/settings.h" |
| 14 | #include "core/arm/cpu_interrupt_handler.h" | ||
| 15 | #include "core/arm/dynarmic/arm_dynarmic_32.h" | 14 | #include "core/arm/dynarmic/arm_dynarmic_32.h" |
| 16 | #include "core/arm/dynarmic/arm_dynarmic_cp15.h" | 15 | #include "core/arm/dynarmic/arm_dynarmic_cp15.h" |
| 17 | #include "core/arm/dynarmic/arm_exclusive_monitor.h" | 16 | #include "core/arm/dynarmic/arm_exclusive_monitor.h" |
| @@ -318,11 +317,9 @@ void ARM_Dynarmic_32::RewindBreakpointInstruction() { | |||
| 318 | LoadContext(breakpoint_context); | 317 | LoadContext(breakpoint_context); |
| 319 | } | 318 | } |
| 320 | 319 | ||
| 321 | ARM_Dynarmic_32::ARM_Dynarmic_32(System& system_, CPUInterrupts& interrupt_handlers_, | 320 | ARM_Dynarmic_32::ARM_Dynarmic_32(System& system_, bool uses_wall_clock_, |
| 322 | bool uses_wall_clock_, ExclusiveMonitor& exclusive_monitor_, | 321 | ExclusiveMonitor& exclusive_monitor_, std::size_t core_index_) |
| 323 | std::size_t core_index_) | 322 | : ARM_Interface{system_, uses_wall_clock_}, cb(std::make_unique<DynarmicCallbacks32>(*this)), |
| 324 | : ARM_Interface{system_, interrupt_handlers_, uses_wall_clock_}, | ||
| 325 | cb(std::make_unique<DynarmicCallbacks32>(*this)), | ||
| 326 | cp15(std::make_shared<DynarmicCP15>(*this)), core_index{core_index_}, | 323 | cp15(std::make_shared<DynarmicCP15>(*this)), core_index{core_index_}, |
| 327 | exclusive_monitor{dynamic_cast<DynarmicExclusiveMonitor&>(exclusive_monitor_)}, | 324 | exclusive_monitor{dynamic_cast<DynarmicExclusiveMonitor&>(exclusive_monitor_)}, |
| 328 | null_jit{MakeJit(nullptr)}, jit{null_jit.get()} {} | 325 | null_jit{MakeJit(nullptr)}, jit{null_jit.get()} {} |
| @@ -401,6 +398,10 @@ void ARM_Dynarmic_32::SignalInterrupt() { | |||
| 401 | jit.load()->HaltExecution(break_loop); | 398 | jit.load()->HaltExecution(break_loop); |
| 402 | } | 399 | } |
| 403 | 400 | ||
| 401 | void ARM_Dynarmic_32::ClearInterrupt() { | ||
| 402 | jit.load()->ClearHalt(break_loop); | ||
| 403 | } | ||
| 404 | |||
| 404 | void ARM_Dynarmic_32::ClearInstructionCache() { | 405 | void ARM_Dynarmic_32::ClearInstructionCache() { |
| 405 | jit.load()->ClearCache(); | 406 | jit.load()->ClearCache(); |
| 406 | } | 407 | } |
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.h b/src/core/arm/dynarmic/arm_dynarmic_32.h index 346e9abf8..d24ba2289 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.h +++ b/src/core/arm/dynarmic/arm_dynarmic_32.h | |||
| @@ -28,8 +28,8 @@ class System; | |||
| 28 | 28 | ||
| 29 | class ARM_Dynarmic_32 final : public ARM_Interface { | 29 | class ARM_Dynarmic_32 final : public ARM_Interface { |
| 30 | public: | 30 | public: |
| 31 | ARM_Dynarmic_32(System& system_, CPUInterrupts& interrupt_handlers_, bool uses_wall_clock_, | 31 | ARM_Dynarmic_32(System& system_, bool uses_wall_clock_, ExclusiveMonitor& exclusive_monitor_, |
| 32 | ExclusiveMonitor& exclusive_monitor_, std::size_t core_index_); | 32 | std::size_t core_index_); |
| 33 | ~ARM_Dynarmic_32() override; | 33 | ~ARM_Dynarmic_32() override; |
| 34 | 34 | ||
| 35 | void SetPC(u64 pc) override; | 35 | void SetPC(u64 pc) override; |
| @@ -56,6 +56,7 @@ public: | |||
| 56 | void LoadContext(const ThreadContext64& ctx) override {} | 56 | void LoadContext(const ThreadContext64& ctx) override {} |
| 57 | 57 | ||
| 58 | void SignalInterrupt() override; | 58 | void SignalInterrupt() override; |
| 59 | void ClearInterrupt() override; | ||
| 59 | void ClearExclusiveState() override; | 60 | void ClearExclusiveState() override; |
| 60 | 61 | ||
| 61 | void ClearInstructionCache() override; | 62 | void ClearInstructionCache() override; |
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index a91b587ce..bf971b7dc 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp | |||
| @@ -10,7 +10,6 @@ | |||
| 10 | #include "common/logging/log.h" | 10 | #include "common/logging/log.h" |
| 11 | #include "common/page_table.h" | 11 | #include "common/page_table.h" |
| 12 | #include "common/settings.h" | 12 | #include "common/settings.h" |
| 13 | #include "core/arm/cpu_interrupt_handler.h" | ||
| 14 | #include "core/arm/dynarmic/arm_dynarmic_64.h" | 13 | #include "core/arm/dynarmic/arm_dynarmic_64.h" |
| 15 | #include "core/arm/dynarmic/arm_exclusive_monitor.h" | 14 | #include "core/arm/dynarmic/arm_exclusive_monitor.h" |
| 16 | #include "core/core.h" | 15 | #include "core/core.h" |
| @@ -378,10 +377,9 @@ void ARM_Dynarmic_64::RewindBreakpointInstruction() { | |||
| 378 | LoadContext(breakpoint_context); | 377 | LoadContext(breakpoint_context); |
| 379 | } | 378 | } |
| 380 | 379 | ||
| 381 | ARM_Dynarmic_64::ARM_Dynarmic_64(System& system_, CPUInterrupts& interrupt_handlers_, | 380 | ARM_Dynarmic_64::ARM_Dynarmic_64(System& system_, bool uses_wall_clock_, |
| 382 | bool uses_wall_clock_, ExclusiveMonitor& exclusive_monitor_, | 381 | ExclusiveMonitor& exclusive_monitor_, std::size_t core_index_) |
| 383 | std::size_t core_index_) | 382 | : ARM_Interface{system_, uses_wall_clock_}, |
| 384 | : ARM_Interface{system_, interrupt_handlers_, uses_wall_clock_}, | ||
| 385 | cb(std::make_unique<DynarmicCallbacks64>(*this)), core_index{core_index_}, | 383 | cb(std::make_unique<DynarmicCallbacks64>(*this)), core_index{core_index_}, |
| 386 | exclusive_monitor{dynamic_cast<DynarmicExclusiveMonitor&>(exclusive_monitor_)}, | 384 | exclusive_monitor{dynamic_cast<DynarmicExclusiveMonitor&>(exclusive_monitor_)}, |
| 387 | null_jit{MakeJit(nullptr, 48)}, jit{null_jit.get()} {} | 385 | null_jit{MakeJit(nullptr, 48)}, jit{null_jit.get()} {} |
| @@ -468,6 +466,10 @@ void ARM_Dynarmic_64::SignalInterrupt() { | |||
| 468 | jit.load()->HaltExecution(break_loop); | 466 | jit.load()->HaltExecution(break_loop); |
| 469 | } | 467 | } |
| 470 | 468 | ||
| 469 | void ARM_Dynarmic_64::ClearInterrupt() { | ||
| 470 | jit.load()->ClearHalt(break_loop); | ||
| 471 | } | ||
| 472 | |||
| 471 | void ARM_Dynarmic_64::ClearInstructionCache() { | 473 | void ARM_Dynarmic_64::ClearInstructionCache() { |
| 472 | jit.load()->ClearCache(); | 474 | jit.load()->ClearCache(); |
| 473 | } | 475 | } |
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.h b/src/core/arm/dynarmic/arm_dynarmic_64.h index c77a83ad7..ed1a5eb96 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.h +++ b/src/core/arm/dynarmic/arm_dynarmic_64.h | |||
| @@ -20,14 +20,13 @@ class Memory; | |||
| 20 | namespace Core { | 20 | namespace Core { |
| 21 | 21 | ||
| 22 | class DynarmicCallbacks64; | 22 | class DynarmicCallbacks64; |
| 23 | class CPUInterruptHandler; | ||
| 24 | class DynarmicExclusiveMonitor; | 23 | class DynarmicExclusiveMonitor; |
| 25 | class System; | 24 | class System; |
| 26 | 25 | ||
| 27 | class ARM_Dynarmic_64 final : public ARM_Interface { | 26 | class ARM_Dynarmic_64 final : public ARM_Interface { |
| 28 | public: | 27 | public: |
| 29 | ARM_Dynarmic_64(System& system_, CPUInterrupts& interrupt_handlers_, bool uses_wall_clock_, | 28 | ARM_Dynarmic_64(System& system_, bool uses_wall_clock_, ExclusiveMonitor& exclusive_monitor_, |
| 30 | ExclusiveMonitor& exclusive_monitor_, std::size_t core_index_); | 29 | std::size_t core_index_); |
| 31 | ~ARM_Dynarmic_64() override; | 30 | ~ARM_Dynarmic_64() override; |
| 32 | 31 | ||
| 33 | void SetPC(u64 pc) override; | 32 | void SetPC(u64 pc) override; |
| @@ -50,6 +49,7 @@ public: | |||
| 50 | void LoadContext(const ThreadContext64& ctx) override; | 49 | void LoadContext(const ThreadContext64& ctx) override; |
| 51 | 50 | ||
| 52 | void SignalInterrupt() override; | 51 | void SignalInterrupt() override; |
| 52 | void ClearInterrupt() override; | ||
| 53 | void ClearExclusiveState() override; | 53 | void ClearExclusiveState() override; |
| 54 | 54 | ||
| 55 | void ClearInstructionCache() override; | 55 | void ClearInstructionCache() override; |