summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar MerryMage2018-02-09 00:04:05 +0000
committerGravatar MerryMage2018-02-09 00:29:36 +0000
commitd3bbed5e78e6f324ff417d887b60df20cafc7a90 (patch)
tree1f17a63f865591e026c0cd1dc17168dda11802a3
parentMerge pull request #169 from bunnei/gpu-mem (diff)
downloadyuzu-d3bbed5e78e6f324ff417d887b60df20cafc7a90.tar.gz
yuzu-d3bbed5e78e6f324ff417d887b60df20cafc7a90.tar.xz
yuzu-d3bbed5e78e6f324ff417d887b60df20cafc7a90.zip
dynarmic: Update to 41ae12263
Changes: Primarily implementing more A64 instructions
-rwxr-xr-x.travis/macos/build.sh2
m---------externals/dynarmic0
m---------externals/xbyak0
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic.cpp74
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic.h2
5 files changed, 46 insertions, 32 deletions
diff --git a/.travis/macos/build.sh b/.travis/macos/build.sh
index 1d0d120ac..f633f618f 100755
--- a/.travis/macos/build.sh
+++ b/.travis/macos/build.sh
@@ -2,7 +2,7 @@
2 2
3set -o pipefail 3set -o pipefail
4 4
5export MACOSX_DEPLOYMENT_TARGET=10.9 5export MACOSX_DEPLOYMENT_TARGET=10.12
6export Qt5_DIR=$(brew --prefix)/opt/qt5 6export Qt5_DIR=$(brew --prefix)/opt/qt5
7export UNICORNDIR=$(pwd)/externals/unicorn 7export UNICORNDIR=$(pwd)/externals/unicorn
8 8
diff --git a/externals/dynarmic b/externals/dynarmic
Subproject a6d17e6bb0ffd16464b7dae8c1124b0c6a742a1 Subproject 41ae12263da7c6d1ffafec6a5b9095977b42367
diff --git a/externals/xbyak b/externals/xbyak
Subproject d512551e914737300ba35f3c049d1b40effbe76 Subproject 2794cde79eb71e86490061cac9622ad0067b8d1
diff --git a/src/core/arm/dynarmic/arm_dynarmic.cpp b/src/core/arm/dynarmic/arm_dynarmic.cpp
index 72c54f984..302bae569 100644
--- a/src/core/arm/dynarmic/arm_dynarmic.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic.cpp
@@ -8,9 +8,12 @@
8#include <dynarmic/A64/config.h> 8#include <dynarmic/A64/config.h>
9#include "core/arm/dynarmic/arm_dynarmic.h" 9#include "core/arm/dynarmic/arm_dynarmic.h"
10#include "core/core_timing.h" 10#include "core/core_timing.h"
11#include "core/hle/kernel/memory.h"
11#include "core/hle/kernel/svc.h" 12#include "core/hle/kernel/svc.h"
12#include "core/memory.h" 13#include "core/memory.h"
13 14
15using Vector = Dynarmic::A64::Vector;
16
14class ARM_Dynarmic_Callbacks : public Dynarmic::A64::UserCallbacks { 17class ARM_Dynarmic_Callbacks : public Dynarmic::A64::UserCallbacks {
15public: 18public:
16 explicit ARM_Dynarmic_Callbacks(ARM_Dynarmic& parent) : parent(parent) {} 19 explicit ARM_Dynarmic_Callbacks(ARM_Dynarmic& parent) : parent(parent) {}
@@ -28,6 +31,9 @@ public:
28 u64 MemoryRead64(u64 vaddr) override { 31 u64 MemoryRead64(u64 vaddr) override {
29 return Memory::Read64(vaddr); 32 return Memory::Read64(vaddr);
30 } 33 }
34 Vector MemoryRead128(u64 vaddr) override {
35 return {Memory::Read64(vaddr), Memory::Read64(vaddr + 8)};
36 }
31 37
32 void MemoryWrite8(u64 vaddr, u8 value) override { 38 void MemoryWrite8(u64 vaddr, u8 value) override {
33 Memory::Write8(vaddr, value); 39 Memory::Write8(vaddr, value);
@@ -41,6 +47,10 @@ public:
41 void MemoryWrite64(u64 vaddr, u64 value) override { 47 void MemoryWrite64(u64 vaddr, u64 value) override {
42 Memory::Write64(vaddr, value); 48 Memory::Write64(vaddr, value);
43 } 49 }
50 void MemoryWrite128(u64 vaddr, Vector value) override {
51 Memory::Write64(vaddr, value[0]);
52 Memory::Write64(vaddr + 8, value[1]);
53 }
44 54
45 void InterpreterFallback(u64 pc, size_t num_instructions) override { 55 void InterpreterFallback(u64 pc, size_t num_instructions) override {
46 ARM_Interface::ThreadContext ctx; 56 ARM_Interface::ThreadContext ctx;
@@ -52,12 +62,12 @@ public:
52 num_interpreted_instructions += num_instructions; 62 num_interpreted_instructions += num_instructions;
53 } 63 }
54 64
55 void ExceptionRaised(u64 pc, Dynarmic::A64::Exception /*exception*/) override { 65 void ExceptionRaised(u64 pc, Dynarmic::A64::Exception exception) override {
56 ASSERT_MSG(false, "ExceptionRaised(%" PRIx64 ")", pc); 66 ASSERT_MSG(false, "ExceptionRaised(exception = %zu, pc = %" PRIx64 ")",
67 static_cast<size_t>(exception), pc);
57 } 68 }
58 69
59 void CallSVC(u32 swi) override { 70 void CallSVC(u32 swi) override {
60 printf("svc %x\n", swi);
61 Kernel::CallSVC(swi); 71 Kernel::CallSVC(swi);
62 } 72 }
63 73
@@ -78,9 +88,13 @@ public:
78 u64 tpidrr0_el0 = 0; 88 u64 tpidrr0_el0 = 0;
79}; 89};
80 90
91std::unique_ptr<Dynarmic::A64::Jit> MakeJit(const std::unique_ptr<ARM_Dynarmic_Callbacks>& cb) {
92 Dynarmic::A64::UserConfig config{cb.get()};
93 return std::make_unique<Dynarmic::A64::Jit>(config);
94}
95
81ARM_Dynarmic::ARM_Dynarmic() 96ARM_Dynarmic::ARM_Dynarmic()
82 : cb(std::make_unique<ARM_Dynarmic_Callbacks>(*this)), 97 : cb(std::make_unique<ARM_Dynarmic_Callbacks>(*this)), jit(MakeJit(cb)) {
83 jit(Dynarmic::A64::UserConfig{cb.get()}) {
84 ARM_Interface::ThreadContext ctx; 98 ARM_Interface::ThreadContext ctx;
85 inner_unicorn.SaveContext(ctx); 99 inner_unicorn.SaveContext(ctx);
86 LoadContext(ctx); 100 LoadContext(ctx);
@@ -94,27 +108,27 @@ void ARM_Dynarmic::MapBackingMemory(u64 address, size_t size, u8* memory,
94} 108}
95 109
96void ARM_Dynarmic::SetPC(u64 pc) { 110void ARM_Dynarmic::SetPC(u64 pc) {
97 jit.SetPC(pc); 111 jit->SetPC(pc);
98} 112}
99 113
100u64 ARM_Dynarmic::GetPC() const { 114u64 ARM_Dynarmic::GetPC() const {
101 return jit.GetPC(); 115 return jit->GetPC();
102} 116}
103 117
104u64 ARM_Dynarmic::GetReg(int index) const { 118u64 ARM_Dynarmic::GetReg(int index) const {
105 return jit.GetRegister(index); 119 return jit->GetRegister(index);
106} 120}
107 121
108void ARM_Dynarmic::SetReg(int index, u64 value) { 122void ARM_Dynarmic::SetReg(int index, u64 value) {
109 jit.SetRegister(index, value); 123 jit->SetRegister(index, value);
110} 124}
111 125
112u128 ARM_Dynarmic::GetExtReg(int index) const { 126u128 ARM_Dynarmic::GetExtReg(int index) const {
113 return jit.GetVector(index); 127 return jit->GetVector(index);
114} 128}
115 129
116void ARM_Dynarmic::SetExtReg(int index, u128 value) { 130void ARM_Dynarmic::SetExtReg(int index, u128 value) {
117 jit.SetVector(index, value); 131 jit->SetVector(index, value);
118} 132}
119 133
120u32 ARM_Dynarmic::GetVFPReg(int /*index*/) const { 134u32 ARM_Dynarmic::GetVFPReg(int /*index*/) const {
@@ -127,11 +141,11 @@ void ARM_Dynarmic::SetVFPReg(int /*index*/, u32 /*value*/) {
127} 141}
128 142
129u32 ARM_Dynarmic::GetCPSR() const { 143u32 ARM_Dynarmic::GetCPSR() const {
130 return jit.GetPstate(); 144 return jit->GetPstate();
131} 145}
132 146
133void ARM_Dynarmic::SetCPSR(u32 cpsr) { 147void ARM_Dynarmic::SetCPSR(u32 cpsr) {
134 jit.SetPstate(cpsr); 148 jit->SetPstate(cpsr);
135} 149}
136 150
137u64 ARM_Dynarmic::GetTlsAddress() const { 151u64 ARM_Dynarmic::GetTlsAddress() const {
@@ -144,41 +158,41 @@ void ARM_Dynarmic::SetTlsAddress(u64 address) {
144 158
145void ARM_Dynarmic::ExecuteInstructions(int num_instructions) { 159void ARM_Dynarmic::ExecuteInstructions(int num_instructions) {
146 cb->ticks_remaining = num_instructions; 160 cb->ticks_remaining = num_instructions;
147 jit.Run(); 161 jit->Run();
148 CoreTiming::AddTicks(num_instructions - cb->num_interpreted_instructions); 162 CoreTiming::AddTicks(num_instructions - cb->num_interpreted_instructions);
149 cb->num_interpreted_instructions = 0; 163 cb->num_interpreted_instructions = 0;
150} 164}
151 165
152void ARM_Dynarmic::SaveContext(ARM_Interface::ThreadContext& ctx) { 166void ARM_Dynarmic::SaveContext(ARM_Interface::ThreadContext& ctx) {
153 ctx.cpu_registers = jit.GetRegisters(); 167 ctx.cpu_registers = jit->GetRegisters();
154 ctx.sp = jit.GetSP(); 168 ctx.sp = jit->GetSP();
155 ctx.pc = jit.GetPC(); 169 ctx.pc = jit->GetPC();
156 ctx.cpsr = jit.GetPstate(); 170 ctx.cpsr = jit->GetPstate();
157 ctx.fpu_registers = jit.GetVectors(); 171 ctx.fpu_registers = jit->GetVectors();
158 ctx.fpscr = jit.GetFpcr(); 172 ctx.fpscr = jit->GetFpcr();
159 ctx.tls_address = cb->tpidrr0_el0; 173 ctx.tls_address = cb->tpidrr0_el0;
160} 174}
161 175
162void ARM_Dynarmic::LoadContext(const ARM_Interface::ThreadContext& ctx) { 176void ARM_Dynarmic::LoadContext(const ARM_Interface::ThreadContext& ctx) {
163 jit.SetRegisters(ctx.cpu_registers); 177 jit->SetRegisters(ctx.cpu_registers);
164 jit.SetSP(ctx.sp); 178 jit->SetSP(ctx.sp);
165 jit.SetPC(ctx.pc); 179 jit->SetPC(ctx.pc);
166 jit.SetPstate(static_cast<u32>(ctx.cpsr)); 180 jit->SetPstate(static_cast<u32>(ctx.cpsr));
167 jit.SetVectors(ctx.fpu_registers); 181 jit->SetVectors(ctx.fpu_registers);
168 jit.SetFpcr(static_cast<u32>(ctx.fpscr)); 182 jit->SetFpcr(static_cast<u32>(ctx.fpscr));
169 cb->tpidrr0_el0 = ctx.tls_address; 183 cb->tpidrr0_el0 = ctx.tls_address;
170} 184}
171 185
172void ARM_Dynarmic::PrepareReschedule() { 186void ARM_Dynarmic::PrepareReschedule() {
173 if (jit.IsExecuting()) { 187 if (jit->IsExecuting()) {
174 jit.HaltExecution(); 188 jit->HaltExecution();
175 } 189 }
176} 190}
177 191
178void ARM_Dynarmic::ClearInstructionCache() { 192void ARM_Dynarmic::ClearInstructionCache() {
179 jit.ClearCache(); 193 jit->ClearCache();
180} 194}
181 195
182void ARM_Dynarmic::PageTableChanged() { 196void ARM_Dynarmic::PageTableChanged() {
183 UNIMPLEMENTED(); 197 jit = MakeJit(cb);
184} 198}
diff --git a/src/core/arm/dynarmic/arm_dynarmic.h b/src/core/arm/dynarmic/arm_dynarmic.h
index 43dc56d74..1d9dcf5ff 100644
--- a/src/core/arm/dynarmic/arm_dynarmic.h
+++ b/src/core/arm/dynarmic/arm_dynarmic.h
@@ -45,6 +45,6 @@ public:
45private: 45private:
46 friend class ARM_Dynarmic_Callbacks; 46 friend class ARM_Dynarmic_Callbacks;
47 std::unique_ptr<ARM_Dynarmic_Callbacks> cb; 47 std::unique_ptr<ARM_Dynarmic_Callbacks> cb;
48 Dynarmic::A64::Jit jit; 48 std::unique_ptr<Dynarmic::A64::Jit> jit;
49 ARM_Unicorn inner_unicorn; 49 ARM_Unicorn inner_unicorn;
50}; 50};