diff options
| author | 2018-03-18 22:35:47 -0400 | |
|---|---|---|
| committer | 2018-03-18 22:35:47 -0400 | |
| commit | 23a0d2d7b77fa619edc7d69d0162bd3071b67b4b (patch) | |
| tree | 85f20b5e8bbd0b1b2b6e28eac6224908a0f3b7fe /src/core/arm/dynarmic | |
| parent | Merge pull request #250 from bunnei/buffer-dequeue-wait (diff) | |
| parent | Implements citra-emu/citra#3184 (diff) | |
| download | yuzu-23a0d2d7b77fa619edc7d69d0162bd3071b67b4b.tar.gz yuzu-23a0d2d7b77fa619edc7d69d0162bd3071b67b4b.tar.xz yuzu-23a0d2d7b77fa619edc7d69d0162bd3071b67b4b.zip | |
Merge pull request #193 from N00byKing/3184_2_robotic_boogaloo
Implement Pull #3184 from citra: core/arm: Improve timing accuracy before service calls in JIT (Rebased)
Diffstat (limited to 'src/core/arm/dynarmic')
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic.cpp | 19 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic.h | 5 |
2 files changed, 16 insertions, 8 deletions
diff --git a/src/core/arm/dynarmic/arm_dynarmic.cpp b/src/core/arm/dynarmic/arm_dynarmic.cpp index 0902c6df3..7d83f9717 100644 --- a/src/core/arm/dynarmic/arm_dynarmic.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic.cpp | |||
| @@ -122,11 +122,22 @@ std::unique_ptr<Dynarmic::A64::Jit> MakeJit(const std::unique_ptr<ARM_Dynarmic_C | |||
| 122 | return std::make_unique<Dynarmic::A64::Jit>(config); | 122 | return std::make_unique<Dynarmic::A64::Jit>(config); |
| 123 | } | 123 | } |
| 124 | 124 | ||
| 125 | void ARM_Dynarmic::Run() { | ||
| 126 | ASSERT(Memory::GetCurrentPageTable() == current_page_table); | ||
| 127 | |||
| 128 | jit->Run(); | ||
| 129 | } | ||
| 130 | |||
| 131 | void ARM_Dynarmic::Step() { | ||
| 132 | cb->InterpreterFallback(jit->GetPC(), 1); | ||
| 133 | } | ||
| 134 | |||
| 125 | ARM_Dynarmic::ARM_Dynarmic() | 135 | ARM_Dynarmic::ARM_Dynarmic() |
| 126 | : cb(std::make_unique<ARM_Dynarmic_Callbacks>(*this)), jit(MakeJit(cb)) { | 136 | : cb(std::make_unique<ARM_Dynarmic_Callbacks>(*this)), jit(MakeJit(cb)) { |
| 127 | ARM_Interface::ThreadContext ctx; | 137 | ARM_Interface::ThreadContext ctx; |
| 128 | inner_unicorn.SaveContext(ctx); | 138 | inner_unicorn.SaveContext(ctx); |
| 129 | LoadContext(ctx); | 139 | LoadContext(ctx); |
| 140 | PageTableChanged(); | ||
| 130 | } | 141 | } |
| 131 | 142 | ||
| 132 | ARM_Dynarmic::~ARM_Dynarmic() = default; | 143 | ARM_Dynarmic::~ARM_Dynarmic() = default; |
| @@ -189,13 +200,6 @@ void ARM_Dynarmic::SetTlsAddress(u64 address) { | |||
| 189 | cb->tpidrro_el0 = address; | 200 | cb->tpidrro_el0 = address; |
| 190 | } | 201 | } |
| 191 | 202 | ||
| 192 | void ARM_Dynarmic::ExecuteInstructions(int num_instructions) { | ||
| 193 | cb->ticks_remaining = num_instructions; | ||
| 194 | jit->Run(); | ||
| 195 | CoreTiming::AddTicks(num_instructions - cb->num_interpreted_instructions); | ||
| 196 | cb->num_interpreted_instructions = 0; | ||
| 197 | } | ||
| 198 | |||
| 199 | void ARM_Dynarmic::SaveContext(ARM_Interface::ThreadContext& ctx) { | 203 | void ARM_Dynarmic::SaveContext(ARM_Interface::ThreadContext& ctx) { |
| 200 | ctx.cpu_registers = jit->GetRegisters(); | 204 | ctx.cpu_registers = jit->GetRegisters(); |
| 201 | ctx.sp = jit->GetSP(); | 205 | ctx.sp = jit->GetSP(); |
| @@ -228,4 +232,5 @@ void ARM_Dynarmic::ClearInstructionCache() { | |||
| 228 | 232 | ||
| 229 | void ARM_Dynarmic::PageTableChanged() { | 233 | void ARM_Dynarmic::PageTableChanged() { |
| 230 | jit = MakeJit(cb); | 234 | jit = MakeJit(cb); |
| 235 | current_page_table = Memory::GetCurrentPageTable(); | ||
| 231 | } | 236 | } |
diff --git a/src/core/arm/dynarmic/arm_dynarmic.h b/src/core/arm/dynarmic/arm_dynarmic.h index fd1a44802..128669d01 100644 --- a/src/core/arm/dynarmic/arm_dynarmic.h +++ b/src/core/arm/dynarmic/arm_dynarmic.h | |||
| @@ -29,6 +29,8 @@ public: | |||
| 29 | u32 GetVFPReg(int index) const override; | 29 | u32 GetVFPReg(int index) const override; |
| 30 | void SetVFPReg(int index, u32 value) override; | 30 | void SetVFPReg(int index, u32 value) override; |
| 31 | u32 GetCPSR() const override; | 31 | u32 GetCPSR() const override; |
| 32 | void Run() override; | ||
| 33 | void Step() override; | ||
| 32 | void SetCPSR(u32 cpsr) override; | 34 | void SetCPSR(u32 cpsr) override; |
| 33 | VAddr GetTlsAddress() const override; | 35 | VAddr GetTlsAddress() const override; |
| 34 | void SetTlsAddress(VAddr address) override; | 36 | void SetTlsAddress(VAddr address) override; |
| @@ -37,7 +39,6 @@ public: | |||
| 37 | void LoadContext(const ThreadContext& ctx) override; | 39 | void LoadContext(const ThreadContext& ctx) override; |
| 38 | 40 | ||
| 39 | void PrepareReschedule() override; | 41 | void PrepareReschedule() override; |
| 40 | void ExecuteInstructions(int num_instructions) override; | ||
| 41 | 42 | ||
| 42 | void ClearInstructionCache() override; | 43 | void ClearInstructionCache() override; |
| 43 | void PageTableChanged() override; | 44 | void PageTableChanged() override; |
| @@ -47,4 +48,6 @@ private: | |||
| 47 | std::unique_ptr<ARM_Dynarmic_Callbacks> cb; | 48 | std::unique_ptr<ARM_Dynarmic_Callbacks> cb; |
| 48 | std::unique_ptr<Dynarmic::A64::Jit> jit; | 49 | std::unique_ptr<Dynarmic::A64::Jit> jit; |
| 49 | ARM_Unicorn inner_unicorn; | 50 | ARM_Unicorn inner_unicorn; |
| 51 | |||
| 52 | Memory::PageTable* current_page_table = nullptr; | ||
| 50 | }; | 53 | }; |