diff options
| author | 2019-04-06 18:46:18 -0400 | |
|---|---|---|
| committer | 2019-04-07 20:30:05 -0400 | |
| commit | b117ca5fce0344997a09260d835b27dbd2602507 (patch) | |
| tree | a351c981e559de4cb31142b4b7436a638511c0f3 /src/core/arm/dynarmic | |
| parent | Merge pull request #2300 from FernandoS27/null-shader (diff) | |
| download | yuzu-b117ca5fce0344997a09260d835b27dbd2602507.tar.gz yuzu-b117ca5fce0344997a09260d835b27dbd2602507.tar.xz yuzu-b117ca5fce0344997a09260d835b27dbd2602507.zip | |
kernel/svc: Deglobalize the supervisor call handlers
Adjusts the interface of the wrappers to take a system reference, which
allows accessing a system instance without using the global accessors.
This also allows getting rid of all global accessors within the
supervisor call handling code. While this does make the wrappers
themselves slightly more noisy, this will be further cleaned up in a
follow-up. This eliminates the global system accessors in the current
code while preserving the existing interface.
Diffstat (limited to 'src/core/arm/dynarmic')
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic.cpp | 17 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic.h | 10 |
2 files changed, 12 insertions, 15 deletions
diff --git a/src/core/arm/dynarmic/arm_dynarmic.cpp b/src/core/arm/dynarmic/arm_dynarmic.cpp index 49145911b..dc96e35d5 100644 --- a/src/core/arm/dynarmic/arm_dynarmic.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic.cpp | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | #include "core/core_timing.h" | 14 | #include "core/core_timing.h" |
| 15 | #include "core/core_timing_util.h" | 15 | #include "core/core_timing_util.h" |
| 16 | #include "core/gdbstub/gdbstub.h" | 16 | #include "core/gdbstub/gdbstub.h" |
| 17 | #include "core/hle/kernel/kernel.h" | ||
| 17 | #include "core/hle/kernel/process.h" | 18 | #include "core/hle/kernel/process.h" |
| 18 | #include "core/hle/kernel/svc.h" | 19 | #include "core/hle/kernel/svc.h" |
| 19 | #include "core/hle/kernel/vm_manager.h" | 20 | #include "core/hle/kernel/vm_manager.h" |
| @@ -99,7 +100,7 @@ public: | |||
| 99 | } | 100 | } |
| 100 | 101 | ||
| 101 | void CallSVC(u32 swi) override { | 102 | void CallSVC(u32 swi) override { |
| 102 | Kernel::CallSVC(swi); | 103 | Kernel::CallSVC(parent.system, swi); |
| 103 | } | 104 | } |
| 104 | 105 | ||
| 105 | void AddTicks(u64 ticks) override { | 106 | void AddTicks(u64 ticks) override { |
| @@ -112,14 +113,14 @@ public: | |||
| 112 | // Always execute at least one tick. | 113 | // Always execute at least one tick. |
| 113 | amortized_ticks = std::max<u64>(amortized_ticks, 1); | 114 | amortized_ticks = std::max<u64>(amortized_ticks, 1); |
| 114 | 115 | ||
| 115 | parent.core_timing.AddTicks(amortized_ticks); | 116 | parent.system.CoreTiming().AddTicks(amortized_ticks); |
| 116 | num_interpreted_instructions = 0; | 117 | num_interpreted_instructions = 0; |
| 117 | } | 118 | } |
| 118 | u64 GetTicksRemaining() override { | 119 | u64 GetTicksRemaining() override { |
| 119 | return std::max(parent.core_timing.GetDowncount(), 0); | 120 | return std::max(parent.system.CoreTiming().GetDowncount(), 0); |
| 120 | } | 121 | } |
| 121 | u64 GetCNTPCT() override { | 122 | u64 GetCNTPCT() override { |
| 122 | return Timing::CpuCyclesToClockCycles(parent.core_timing.GetTicks()); | 123 | return Timing::CpuCyclesToClockCycles(parent.system.CoreTiming().GetTicks()); |
| 123 | } | 124 | } |
| 124 | 125 | ||
| 125 | ARM_Dynarmic& parent; | 126 | ARM_Dynarmic& parent; |
| @@ -129,7 +130,7 @@ public: | |||
| 129 | }; | 130 | }; |
| 130 | 131 | ||
| 131 | std::unique_ptr<Dynarmic::A64::Jit> ARM_Dynarmic::MakeJit() const { | 132 | std::unique_ptr<Dynarmic::A64::Jit> ARM_Dynarmic::MakeJit() const { |
| 132 | auto* current_process = Core::CurrentProcess(); | 133 | auto* current_process = system.Kernel().CurrentProcess(); |
| 133 | auto** const page_table = current_process->VMManager().page_table.pointers.data(); | 134 | auto** const page_table = current_process->VMManager().page_table.pointers.data(); |
| 134 | 135 | ||
| 135 | Dynarmic::A64::UserConfig config; | 136 | Dynarmic::A64::UserConfig config; |
| @@ -171,10 +172,10 @@ void ARM_Dynarmic::Step() { | |||
| 171 | cb->InterpreterFallback(jit->GetPC(), 1); | 172 | cb->InterpreterFallback(jit->GetPC(), 1); |
| 172 | } | 173 | } |
| 173 | 174 | ||
| 174 | ARM_Dynarmic::ARM_Dynarmic(Timing::CoreTiming& core_timing, ExclusiveMonitor& exclusive_monitor, | 175 | ARM_Dynarmic::ARM_Dynarmic(System& system, ExclusiveMonitor& exclusive_monitor, |
| 175 | std::size_t core_index) | 176 | std::size_t core_index) |
| 176 | : cb(std::make_unique<ARM_Dynarmic_Callbacks>(*this)), inner_unicorn{core_timing}, | 177 | : cb(std::make_unique<ARM_Dynarmic_Callbacks>(*this)), inner_unicorn{system}, |
| 177 | core_index{core_index}, core_timing{core_timing}, | 178 | core_index{core_index}, system{system}, |
| 178 | exclusive_monitor{dynamic_cast<DynarmicExclusiveMonitor&>(exclusive_monitor)} { | 179 | exclusive_monitor{dynamic_cast<DynarmicExclusiveMonitor&>(exclusive_monitor)} { |
| 179 | ThreadContext ctx{}; | 180 | ThreadContext ctx{}; |
| 180 | inner_unicorn.SaveContext(ctx); | 181 | inner_unicorn.SaveContext(ctx); |
diff --git a/src/core/arm/dynarmic/arm_dynarmic.h b/src/core/arm/dynarmic/arm_dynarmic.h index d867c2a50..c1db254e8 100644 --- a/src/core/arm/dynarmic/arm_dynarmic.h +++ b/src/core/arm/dynarmic/arm_dynarmic.h | |||
| @@ -12,19 +12,15 @@ | |||
| 12 | #include "core/arm/exclusive_monitor.h" | 12 | #include "core/arm/exclusive_monitor.h" |
| 13 | #include "core/arm/unicorn/arm_unicorn.h" | 13 | #include "core/arm/unicorn/arm_unicorn.h" |
| 14 | 14 | ||
| 15 | namespace Core::Timing { | ||
| 16 | class CoreTiming; | ||
| 17 | } | ||
| 18 | |||
| 19 | namespace Core { | 15 | namespace Core { |
| 20 | 16 | ||
| 21 | class ARM_Dynarmic_Callbacks; | 17 | class ARM_Dynarmic_Callbacks; |
| 22 | class DynarmicExclusiveMonitor; | 18 | class DynarmicExclusiveMonitor; |
| 19 | class System; | ||
| 23 | 20 | ||
| 24 | class ARM_Dynarmic final : public ARM_Interface { | 21 | class ARM_Dynarmic final : public ARM_Interface { |
| 25 | public: | 22 | public: |
| 26 | ARM_Dynarmic(Timing::CoreTiming& core_timing, ExclusiveMonitor& exclusive_monitor, | 23 | ARM_Dynarmic(System& system, ExclusiveMonitor& exclusive_monitor, std::size_t core_index); |
| 27 | std::size_t core_index); | ||
| 28 | ~ARM_Dynarmic() override; | 24 | ~ARM_Dynarmic() override; |
| 29 | 25 | ||
| 30 | void MapBackingMemory(VAddr address, std::size_t size, u8* memory, | 26 | void MapBackingMemory(VAddr address, std::size_t size, u8* memory, |
| @@ -63,7 +59,7 @@ private: | |||
| 63 | ARM_Unicorn inner_unicorn; | 59 | ARM_Unicorn inner_unicorn; |
| 64 | 60 | ||
| 65 | std::size_t core_index; | 61 | std::size_t core_index; |
| 66 | Timing::CoreTiming& core_timing; | 62 | System& system; |
| 67 | DynarmicExclusiveMonitor& exclusive_monitor; | 63 | DynarmicExclusiveMonitor& exclusive_monitor; |
| 68 | }; | 64 | }; |
| 69 | 65 | ||