summaryrefslogtreecommitdiff
path: root/src/core/arm/dynarmic
diff options
context:
space:
mode:
authorGravatar N00byKing2018-02-14 18:47:48 +0100
committerGravatar N00byKing2018-02-25 11:44:21 +0100
commitbc88cae0c730ece6d027778267eb0fa256479bda (patch)
treeeaf8581141f7240b6cf23eda17834558b6fe1c40 /src/core/arm/dynarmic
parentMerge pull request #190 from bunnei/fix-qt-waittree (diff)
downloadyuzu-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.cpp19
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic.h5
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
104void ARM_Dynarmic::Run() {
105 ASSERT(Memory::GetCurrentPageTable() == current_page_table);
106
107 jit->Run();
108}
109
110void ARM_Dynarmic::Step() {
111 cb->InterpreterFallback(jit->GetPC(), 1);
112}
113
104ARM_Dynarmic::ARM_Dynarmic() 114ARM_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
111ARM_Dynarmic::~ARM_Dynarmic() = default; 122ARM_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
167void 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
174void ARM_Dynarmic::SaveContext(ARM_Interface::ThreadContext& ctx) { 178void 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
204void ARM_Dynarmic::PageTableChanged() { 208void 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};