diff options
| author | 2020-04-17 16:33:08 -0400 | |
|---|---|---|
| committer | 2020-04-17 16:33:08 -0400 | |
| commit | b8f5c71f2d7f819821acf036175cce65ab1ae12c (patch) | |
| tree | 151d7ed4e47536dc0e149a7117387b6a502d7da6 /src/core/arm | |
| parent | Merge pull request #3682 from lioncash/uam (diff) | |
| parent | core: hle: Address various feedback & code cleanup. (diff) | |
| download | yuzu-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.cpp | 2 | ||||
| -rw-r--r-- | src/core/arm/arm_interface.h | 32 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_32.cpp | 2 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_32.h | 2 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_64.cpp | 7 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_64.h | 4 | ||||
| -rw-r--r-- | src/core/arm/exclusive_monitor.h | 2 | ||||
| -rw-r--r-- | src/core/arm/unicorn/arm_unicorn.cpp | 2 |
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 | ||
| 61 | using Symbols = std::vector<std::pair<ELFSymbol, std::string>>; | 61 | using Symbols = std::vector<std::pair<ELFSymbol, std::string>>; |
| 62 | 62 | ||
| 63 | Symbols GetSymbols(VAddr text_offset, Memory::Memory& memory) { | 63 | Symbols 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 | ||
| 18 | namespace Memory { | 18 | namespace Core::Memory { |
| 19 | class Memory; | 19 | class 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 | ||
| 24 | namespace Core { | 24 | namespace 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 | ||
| 18 | namespace Memory { | 18 | namespace Core::Memory { |
| 19 | class Memory; | 19 | class Memory; |
| 20 | } | 20 | } |
| 21 | 21 | ||
| @@ -92,7 +92,7 @@ public: | |||
| 92 | private: | 92 | private: |
| 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 | ||
| 11 | namespace Memory { | 11 | namespace Core::Memory { |
| 12 | class Memory; | 12 | class 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 | } |