diff options
| author | 2018-02-14 18:47:48 +0100 | |
|---|---|---|
| committer | 2018-02-25 11:44:21 +0100 | |
| commit | bc88cae0c730ece6d027778267eb0fa256479bda (patch) | |
| tree | eaf8581141f7240b6cf23eda17834558b6fe1c40 /src/core/arm/dynarmic | |
| parent | Merge pull request #190 from bunnei/fix-qt-waittree (diff) | |
| download | yuzu-bc88cae0c730ece6d027778267eb0fa256479bda.tar.gz yuzu-bc88cae0c730ece6d027778267eb0fa256479bda.tar.xz yuzu-bc88cae0c730ece6d027778267eb0fa256479bda.zip | |
Implements citra-emu/citra#3184
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 283d20831..a64ce9551 100644 --- a/src/core/arm/dynarmic/arm_dynarmic.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic.cpp | |||
| @@ -101,11 +101,22 @@ std::unique_ptr<Dynarmic::A64::Jit> MakeJit(const std::unique_ptr<ARM_Dynarmic_C | |||
| 101 | return std::make_unique<Dynarmic::A64::Jit>(config); | 101 | return std::make_unique<Dynarmic::A64::Jit>(config); |
| 102 | } | 102 | } |
| 103 | 103 | ||
| 104 | void ARM_Dynarmic::Run() { | ||
| 105 | ASSERT(Memory::GetCurrentPageTable() == current_page_table); | ||
| 106 | |||
| 107 | jit->Run(); | ||
| 108 | } | ||
| 109 | |||
| 110 | void ARM_Dynarmic::Step() { | ||
| 111 | cb->InterpreterFallback(jit->GetPC(), 1); | ||
| 112 | } | ||
| 113 | |||
| 104 | ARM_Dynarmic::ARM_Dynarmic() | 114 | ARM_Dynarmic::ARM_Dynarmic() |
| 105 | : cb(std::make_unique<ARM_Dynarmic_Callbacks>(*this)), jit(MakeJit(cb)) { | 115 | : cb(std::make_unique<ARM_Dynarmic_Callbacks>(*this)), jit(MakeJit(cb)) { |
| 106 | ARM_Interface::ThreadContext ctx; | 116 | ARM_Interface::ThreadContext ctx; |
| 107 | inner_unicorn.SaveContext(ctx); | 117 | inner_unicorn.SaveContext(ctx); |
| 108 | LoadContext(ctx); | 118 | LoadContext(ctx); |
| 119 | PageTableChanged(); | ||
| 109 | } | 120 | } |
| 110 | 121 | ||
| 111 | ARM_Dynarmic::~ARM_Dynarmic() = default; | 122 | ARM_Dynarmic::~ARM_Dynarmic() = default; |
| @@ -164,13 +175,6 @@ void ARM_Dynarmic::SetTlsAddress(u64 address) { | |||
| 164 | cb->tpidrro_el0 = address; | 175 | cb->tpidrro_el0 = address; |
| 165 | } | 176 | } |
| 166 | 177 | ||
| 167 | void ARM_Dynarmic::ExecuteInstructions(int num_instructions) { | ||
| 168 | cb->ticks_remaining = num_instructions; | ||
| 169 | jit->Run(); | ||
| 170 | CoreTiming::AddTicks(num_instructions - cb->num_interpreted_instructions); | ||
| 171 | cb->num_interpreted_instructions = 0; | ||
| 172 | } | ||
| 173 | |||
| 174 | void ARM_Dynarmic::SaveContext(ARM_Interface::ThreadContext& ctx) { | 178 | void ARM_Dynarmic::SaveContext(ARM_Interface::ThreadContext& ctx) { |
| 175 | ctx.cpu_registers = jit->GetRegisters(); | 179 | ctx.cpu_registers = jit->GetRegisters(); |
| 176 | ctx.sp = jit->GetSP(); | 180 | ctx.sp = jit->GetSP(); |
| @@ -203,4 +207,5 @@ void ARM_Dynarmic::ClearInstructionCache() { | |||
| 203 | 207 | ||
| 204 | void ARM_Dynarmic::PageTableChanged() { | 208 | void ARM_Dynarmic::PageTableChanged() { |
| 205 | jit = MakeJit(cb); | 209 | jit = MakeJit(cb); |
| 210 | current_page_table = Memory::GetCurrentPageTable(); | ||
| 206 | } | 211 | } |
diff --git a/src/core/arm/dynarmic/arm_dynarmic.h b/src/core/arm/dynarmic/arm_dynarmic.h index 1d9dcf5ff..a436ddd0f 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 | }; |