summaryrefslogtreecommitdiff
path: root/src/core/arm
diff options
context:
space:
mode:
authorGravatar bunnei2020-04-17 16:33:08 -0400
committerGravatar GitHub2020-04-17 16:33:08 -0400
commitb8f5c71f2d7f819821acf036175cce65ab1ae12c (patch)
tree151d7ed4e47536dc0e149a7117387b6a502d7da6 /src/core/arm
parentMerge pull request #3682 from lioncash/uam (diff)
parentcore: hle: Address various feedback & code cleanup. (diff)
downloadyuzu-b8f5c71f2d7f819821acf036175cce65ab1ae12c.tar.gz
yuzu-b8f5c71f2d7f819821acf036175cce65ab1ae12c.tar.xz
yuzu-b8f5c71f2d7f819821acf036175cce65ab1ae12c.zip
Merge pull request #3666 from bunnei/new-vmm
Implement a new virtual memory manager
Diffstat (limited to 'src/core/arm')
-rw-r--r--src/core/arm/arm_interface.cpp2
-rw-r--r--src/core/arm/arm_interface.h32
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_32.cpp2
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_32.h2
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.cpp7
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.h4
-rw-r--r--src/core/arm/exclusive_monitor.h2
-rw-r--r--src/core/arm/unicorn/arm_unicorn.cpp2
8 files changed, 28 insertions, 25 deletions
diff --git a/src/core/arm/arm_interface.cpp b/src/core/arm/arm_interface.cpp
index fb9e616b9..d079a1bc8 100644
--- a/src/core/arm/arm_interface.cpp
+++ b/src/core/arm/arm_interface.cpp
@@ -60,7 +60,7 @@ static_assert(sizeof(ELFSymbol) == 0x18, "ELFSymbol has incorrect size.");
60 60
61using Symbols = std::vector<std::pair<ELFSymbol, std::string>>; 61using Symbols = std::vector<std::pair<ELFSymbol, std::string>>;
62 62
63Symbols GetSymbols(VAddr text_offset, Memory::Memory& memory) { 63Symbols GetSymbols(VAddr text_offset, Core::Memory::Memory& memory) {
64 const auto mod_offset = text_offset + memory.Read32(text_offset + 4); 64 const auto mod_offset = text_offset + memory.Read32(text_offset + 4);
65 65
66 if (mod_offset < text_offset || (mod_offset & 0b11) != 0 || 66 if (mod_offset < text_offset || (mod_offset & 0b11) != 0 ||
diff --git a/src/core/arm/arm_interface.h b/src/core/arm/arm_interface.h
index 57eae839e..cb2e640e2 100644
--- a/src/core/arm/arm_interface.h
+++ b/src/core/arm/arm_interface.h
@@ -26,28 +26,28 @@ public:
26 virtual ~ARM_Interface() = default; 26 virtual ~ARM_Interface() = default;
27 27
28 struct ThreadContext32 { 28 struct ThreadContext32 {
29 std::array<u32, 16> cpu_registers; 29 std::array<u32, 16> cpu_registers{};
30 u32 cpsr; 30 u32 cpsr{};
31 std::array<u8, 4> padding; 31 std::array<u8, 4> padding{};
32 std::array<u64, 32> fprs; 32 std::array<u64, 32> fprs{};
33 u32 fpscr; 33 u32 fpscr{};
34 u32 fpexc; 34 u32 fpexc{};
35 u32 tpidr; 35 u32 tpidr{};
36 }; 36 };
37 // Internally within the kernel, it expects the AArch32 version of the 37 // Internally within the kernel, it expects the AArch32 version of the
38 // thread context to be 344 bytes in size. 38 // thread context to be 344 bytes in size.
39 static_assert(sizeof(ThreadContext32) == 0x158); 39 static_assert(sizeof(ThreadContext32) == 0x158);
40 40
41 struct ThreadContext64 { 41 struct ThreadContext64 {
42 std::array<u64, 31> cpu_registers; 42 std::array<u64, 31> cpu_registers{};
43 u64 sp; 43 u64 sp{};
44 u64 pc; 44 u64 pc{};
45 u32 pstate; 45 u32 pstate{};
46 std::array<u8, 4> padding; 46 std::array<u8, 4> padding{};
47 std::array<u128, 32> vector_registers; 47 std::array<u128, 32> vector_registers{};
48 u32 fpcr; 48 u32 fpcr{};
49 u32 fpsr; 49 u32 fpsr{};
50 u64 tpidr; 50 u64 tpidr{};
51 }; 51 };
52 // Internally within the kernel, it expects the AArch64 version of the 52 // Internally within the kernel, it expects the AArch64 version of the
53 // thread context to be 800 bytes in size. 53 // thread context to be 800 bytes in size.
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp
index 187a972ac..9bc86e3b9 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp
@@ -67,7 +67,7 @@ public:
67 } 67 }
68 68
69 void CallSVC(u32 swi) override { 69 void CallSVC(u32 swi) override {
70 Kernel::CallSVC(parent.system, swi); 70 Kernel::Svc::Call(parent.system, swi);
71 } 71 }
72 72
73 void AddTicks(u64 ticks) override { 73 void AddTicks(u64 ticks) override {
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.h b/src/core/arm/dynarmic/arm_dynarmic_32.h
index 143e46e4d..8ba9cea8f 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_32.h
+++ b/src/core/arm/dynarmic/arm_dynarmic_32.h
@@ -15,7 +15,7 @@
15#include "core/arm/arm_interface.h" 15#include "core/arm/arm_interface.h"
16#include "core/arm/exclusive_monitor.h" 16#include "core/arm/exclusive_monitor.h"
17 17
18namespace Memory { 18namespace Core::Memory {
19class Memory; 19class Memory;
20} 20}
21 21
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp
index a53a58ba0..9add5d363 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp
@@ -8,6 +8,7 @@
8#include <dynarmic/A64/config.h> 8#include <dynarmic/A64/config.h>
9#include "common/logging/log.h" 9#include "common/logging/log.h"
10#include "common/microprofile.h" 10#include "common/microprofile.h"
11#include "common/page_table.h"
11#include "core/arm/dynarmic/arm_dynarmic_64.h" 12#include "core/arm/dynarmic/arm_dynarmic_64.h"
12#include "core/core.h" 13#include "core/core.h"
13#include "core/core_manager.h" 14#include "core/core_manager.h"
@@ -18,7 +19,6 @@
18#include "core/hle/kernel/process.h" 19#include "core/hle/kernel/process.h"
19#include "core/hle/kernel/scheduler.h" 20#include "core/hle/kernel/scheduler.h"
20#include "core/hle/kernel/svc.h" 21#include "core/hle/kernel/svc.h"
21#include "core/hle/kernel/vm_manager.h"
22#include "core/memory.h" 22#include "core/memory.h"
23 23
24namespace Core { 24namespace Core {
@@ -103,7 +103,7 @@ public:
103 } 103 }
104 104
105 void CallSVC(u32 swi) override { 105 void CallSVC(u32 swi) override {
106 Kernel::CallSVC(parent.system, swi); 106 Kernel::Svc::Call(parent.system, swi);
107 } 107 }
108 108
109 void AddTicks(u64 ticks) override { 109 void AddTicks(u64 ticks) override {
@@ -159,6 +159,9 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable&
159 // Unpredictable instructions 159 // Unpredictable instructions
160 config.define_unpredictable_behaviour = true; 160 config.define_unpredictable_behaviour = true;
161 161
162 config.detect_misaligned_access_via_page_table = 16 | 32 | 64 | 128;
163 config.only_detect_misalignment_via_page_table_on_page_boundary = true;
164
162 return std::make_shared<Dynarmic::A64::Jit>(config); 165 return std::make_shared<Dynarmic::A64::Jit>(config);
163} 166}
164 167
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.h b/src/core/arm/dynarmic/arm_dynarmic_64.h
index e71240a96..647cecaf0 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_64.h
+++ b/src/core/arm/dynarmic/arm_dynarmic_64.h
@@ -15,7 +15,7 @@
15#include "core/arm/exclusive_monitor.h" 15#include "core/arm/exclusive_monitor.h"
16#include "core/arm/unicorn/arm_unicorn.h" 16#include "core/arm/unicorn/arm_unicorn.h"
17 17
18namespace Memory { 18namespace Core::Memory {
19class Memory; 19class Memory;
20} 20}
21 21
@@ -92,7 +92,7 @@ public:
92private: 92private:
93 friend class ARM_Dynarmic_64; 93 friend class ARM_Dynarmic_64;
94 Dynarmic::A64::ExclusiveMonitor monitor; 94 Dynarmic::A64::ExclusiveMonitor monitor;
95 Memory::Memory& memory; 95 Core::Memory::Memory& memory;
96}; 96};
97 97
98} // namespace Core 98} // namespace Core
diff --git a/src/core/arm/exclusive_monitor.h b/src/core/arm/exclusive_monitor.h
index 4ef418b90..ccd73b80f 100644
--- a/src/core/arm/exclusive_monitor.h
+++ b/src/core/arm/exclusive_monitor.h
@@ -8,7 +8,7 @@
8 8
9#include "common/common_types.h" 9#include "common/common_types.h"
10 10
11namespace Memory { 11namespace Core::Memory {
12class Memory; 12class Memory;
13} 13}
14 14
diff --git a/src/core/arm/unicorn/arm_unicorn.cpp b/src/core/arm/unicorn/arm_unicorn.cpp
index 8a9800a96..d189efb63 100644
--- a/src/core/arm/unicorn/arm_unicorn.cpp
+++ b/src/core/arm/unicorn/arm_unicorn.cpp
@@ -266,7 +266,7 @@ void ARM_Unicorn::InterruptHook(uc_engine* uc, u32 int_no, void* user_data) {
266 266
267 switch (ec) { 267 switch (ec) {
268 case 0x15: // SVC 268 case 0x15: // SVC
269 Kernel::CallSVC(arm_instance->system, iss); 269 Kernel::Svc::Call(arm_instance->system, iss);
270 break; 270 break;
271 } 271 }
272} 272}