summaryrefslogtreecommitdiff
path: root/src/core/arm/dynarmic
diff options
context:
space:
mode:
authorGravatar bunnei2018-03-18 22:35:47 -0400
committerGravatar GitHub2018-03-18 22:35:47 -0400
commit23a0d2d7b77fa619edc7d69d0162bd3071b67b4b (patch)
tree85f20b5e8bbd0b1b2b6e28eac6224908a0f3b7fe /src/core/arm/dynarmic
parentMerge pull request #250 from bunnei/buffer-dequeue-wait (diff)
parentImplements citra-emu/citra#3184 (diff)
downloadyuzu-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.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 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
125void ARM_Dynarmic::Run() {
126 ASSERT(Memory::GetCurrentPageTable() == current_page_table);
127
128 jit->Run();
129}
130
131void ARM_Dynarmic::Step() {
132 cb->InterpreterFallback(jit->GetPC(), 1);
133}
134
125ARM_Dynarmic::ARM_Dynarmic() 135ARM_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
132ARM_Dynarmic::~ARM_Dynarmic() = default; 143ARM_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
192void 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
199void ARM_Dynarmic::SaveContext(ARM_Interface::ThreadContext& ctx) { 203void 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
229void ARM_Dynarmic::PageTableChanged() { 233void 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};