diff options
| author | 2020-03-20 12:36:01 -0400 | |
|---|---|---|
| committer | 2020-06-27 11:35:53 -0400 | |
| commit | 87c49aa7be4b7277f8ae929058633827d339a052 (patch) | |
| tree | 4ecd25f5570a7e86349b076eb67006d515deefd8 /src | |
| parent | SingleCore: Move Host Timing from a sepparate thread to main cpu thread. (diff) | |
| download | yuzu-87c49aa7be4b7277f8ae929058633827d339a052.tar.gz yuzu-87c49aa7be4b7277f8ae929058633827d339a052.tar.xz yuzu-87c49aa7be4b7277f8ae929058633827d339a052.zip | |
SVC/ARM: Correct svcSendSyncRequest and cache ticks on arm interface.
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_32.cpp | 11 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_64.cpp | 12 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 2 |
3 files changed, 20 insertions, 5 deletions
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index 618f02f30..c8a1ce6e7 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp | |||
| @@ -72,17 +72,23 @@ public: | |||
| 72 | } | 72 | } |
| 73 | 73 | ||
| 74 | void AddTicks(u64 ticks) override { | 74 | void AddTicks(u64 ticks) override { |
| 75 | /// We are using host timing, NOP | 75 | this->ticks -= ticks; |
| 76 | } | 76 | } |
| 77 | |||
| 77 | u64 GetTicksRemaining() override { | 78 | u64 GetTicksRemaining() override { |
| 78 | if (!parent.interrupt_handler.IsInterrupted()) { | 79 | if (!parent.interrupt_handler.IsInterrupted()) { |
| 79 | return 1000ULL; | 80 | return std::max<s64>(ticks, 0); |
| 80 | } | 81 | } |
| 81 | return 0ULL; | 82 | return 0ULL; |
| 82 | } | 83 | } |
| 83 | 84 | ||
| 85 | void ResetTicks() { | ||
| 86 | ticks = 1000LL; | ||
| 87 | } | ||
| 88 | |||
| 84 | ARM_Dynarmic_32& parent; | 89 | ARM_Dynarmic_32& parent; |
| 85 | std::size_t num_interpreted_instructions{}; | 90 | std::size_t num_interpreted_instructions{}; |
| 91 | s64 ticks{}; | ||
| 86 | }; | 92 | }; |
| 87 | 93 | ||
| 88 | std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable& page_table, | 94 | std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable& page_table, |
| @@ -97,6 +103,7 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable& | |||
| 97 | } | 103 | } |
| 98 | 104 | ||
| 99 | void ARM_Dynarmic_32::Run() { | 105 | void ARM_Dynarmic_32::Run() { |
| 106 | cb->ResetTicks(); | ||
| 100 | jit->Run(); | 107 | jit->Run(); |
| 101 | } | 108 | } |
| 102 | 109 | ||
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index 2e664cfa8..547a6e07e 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp | |||
| @@ -124,22 +124,29 @@ public: | |||
| 124 | } | 124 | } |
| 125 | 125 | ||
| 126 | void AddTicks(u64 ticks) override { | 126 | void AddTicks(u64 ticks) override { |
| 127 | /// We are using host timing, NOP | 127 | this->ticks -= ticks; |
| 128 | } | 128 | } |
| 129 | |||
| 129 | u64 GetTicksRemaining() override { | 130 | u64 GetTicksRemaining() override { |
| 130 | if (!parent.interrupt_handler.IsInterrupted()) { | 131 | if (!parent.interrupt_handler.IsInterrupted()) { |
| 131 | return 1000ULL; | 132 | return std::max<s64>(ticks, 0); |
| 132 | } | 133 | } |
| 133 | return 0ULL; | 134 | return 0ULL; |
| 134 | } | 135 | } |
| 136 | |||
| 135 | u64 GetCNTPCT() override { | 137 | u64 GetCNTPCT() override { |
| 136 | return parent.system.CoreTiming().GetClockTicks(); | 138 | return parent.system.CoreTiming().GetClockTicks(); |
| 137 | } | 139 | } |
| 138 | 140 | ||
| 141 | void ResetTicks() { | ||
| 142 | ticks = 1000LL; | ||
| 143 | } | ||
| 144 | |||
| 139 | ARM_Dynarmic_64& parent; | 145 | ARM_Dynarmic_64& parent; |
| 140 | std::size_t num_interpreted_instructions = 0; | 146 | std::size_t num_interpreted_instructions = 0; |
| 141 | u64 tpidrro_el0 = 0; | 147 | u64 tpidrro_el0 = 0; |
| 142 | u64 tpidr_el0 = 0; | 148 | u64 tpidr_el0 = 0; |
| 149 | s64 ticks{}; | ||
| 143 | }; | 150 | }; |
| 144 | 151 | ||
| 145 | std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable& page_table, | 152 | std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable& page_table, |
| @@ -181,6 +188,7 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable& | |||
| 181 | } | 188 | } |
| 182 | 189 | ||
| 183 | void ARM_Dynarmic_64::Run() { | 190 | void ARM_Dynarmic_64::Run() { |
| 191 | cb->ResetTicks(); | ||
| 184 | jit->Run(); | 192 | jit->Run(); |
| 185 | } | 193 | } |
| 186 | 194 | ||
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 36e9c48f9..f08745226 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -342,7 +342,7 @@ static ResultCode SendSyncRequest(Core::System& system, Handle handle) { | |||
| 342 | thread->InvokeHLECallback(SharedFrom(thread)); | 342 | thread->InvokeHLECallback(SharedFrom(thread)); |
| 343 | } | 343 | } |
| 344 | 344 | ||
| 345 | return RESULT_SUCCESS; | 345 | return thread->GetSignalingResult(); |
| 346 | } | 346 | } |
| 347 | 347 | ||
| 348 | static ResultCode SendSyncRequest32(Core::System& system, Handle handle) { | 348 | static ResultCode SendSyncRequest32(Core::System& system, Handle handle) { |