diff options
| author | 2022-11-06 16:45:36 -0500 | |
|---|---|---|
| committer | 2022-11-09 16:58:49 -0500 | |
| commit | cbaf642ffe4b05f8796798ebdc5c6892605928cc (patch) | |
| tree | 8ac4094f709da71b334c152e111247c89c958cee /src/core/arm | |
| parent | Merge pull request #9215 from liamwhite/swordfight (diff) | |
| download | yuzu-cbaf642ffe4b05f8796798ebdc5c6892605928cc.tar.gz yuzu-cbaf642ffe4b05f8796798ebdc5c6892605928cc.tar.xz yuzu-cbaf642ffe4b05f8796798ebdc5c6892605928cc.zip | |
Initial ARM64 support
Diffstat (limited to 'src/core/arm')
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_32.cpp | 5 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_cp15.cpp | 22 | ||||
| -rw-r--r-- | src/core/arm/exclusive_monitor.cpp | 4 |
3 files changed, 22 insertions, 9 deletions
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index 287ba102e..227e06ea1 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp | |||
| @@ -301,6 +301,11 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable* | |||
| 301 | } | 301 | } |
| 302 | } | 302 | } |
| 303 | 303 | ||
| 304 | #ifdef ARCHITECTURE_arm64 | ||
| 305 | // TODO: remove when fixed in dynarmic | ||
| 306 | config.optimizations &= ~Dynarmic::OptimizationFlag::BlockLinking; | ||
| 307 | #endif | ||
| 308 | |||
| 304 | return std::make_unique<Dynarmic::A32::Jit>(config); | 309 | return std::make_unique<Dynarmic::A32::Jit>(config); |
| 305 | } | 310 | } |
| 306 | 311 | ||
diff --git a/src/core/arm/dynarmic/arm_dynarmic_cp15.cpp b/src/core/arm/dynarmic/arm_dynarmic_cp15.cpp index 200efe4db..5a4eba3eb 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_cp15.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_cp15.cpp | |||
| @@ -52,12 +52,16 @@ CallbackOrAccessOneWord DynarmicCP15::CompileSendOneWord(bool two, unsigned opc1 | |||
| 52 | case 4: | 52 | case 4: |
| 53 | // CP15_DATA_SYNC_BARRIER | 53 | // CP15_DATA_SYNC_BARRIER |
| 54 | return Callback{ | 54 | return Callback{ |
| 55 | [](Dynarmic::A32::Jit*, void*, std::uint32_t, std::uint32_t) -> std::uint64_t { | 55 | [](void*, std::uint32_t, std::uint32_t) -> std::uint64_t { |
| 56 | #ifdef _MSC_VER | 56 | #if defined(_MSC_VER) && defined(ARCHITECTURE_x86_64) |
| 57 | _mm_mfence(); | 57 | _mm_mfence(); |
| 58 | _mm_lfence(); | 58 | _mm_lfence(); |
| 59 | #else | 59 | #elif defined(ARCHITECTURE_x86_64) |
| 60 | asm volatile("mfence\n\tlfence\n\t" : : : "memory"); | 60 | asm volatile("mfence\n\tlfence\n\t" : : : "memory"); |
| 61 | #elif defined(ARCHITECTURE_arm64) | ||
| 62 | asm volatile("dsb sy\n\t" : : : "memory"); | ||
| 63 | #else | ||
| 64 | #error Unsupported architecture | ||
| 61 | #endif | 65 | #endif |
| 62 | return 0; | 66 | return 0; |
| 63 | }, | 67 | }, |
| @@ -66,11 +70,15 @@ CallbackOrAccessOneWord DynarmicCP15::CompileSendOneWord(bool two, unsigned opc1 | |||
| 66 | case 5: | 70 | case 5: |
| 67 | // CP15_DATA_MEMORY_BARRIER | 71 | // CP15_DATA_MEMORY_BARRIER |
| 68 | return Callback{ | 72 | return Callback{ |
| 69 | [](Dynarmic::A32::Jit*, void*, std::uint32_t, std::uint32_t) -> std::uint64_t { | 73 | [](void*, std::uint32_t, std::uint32_t) -> std::uint64_t { |
| 70 | #ifdef _MSC_VER | 74 | #if defined(_MSC_VER) && defined(ARCHITECTURE_x86_64) |
| 71 | _mm_mfence(); | 75 | _mm_mfence(); |
| 72 | #else | 76 | #elif defined(ARCHITECTURE_x86_64) |
| 73 | asm volatile("mfence\n\t" : : : "memory"); | 77 | asm volatile("mfence\n\t" : : : "memory"); |
| 78 | #elif defined(ARCHITECTURE_arm64) | ||
| 79 | asm volatile("dmb sy\n\t" : : : "memory"); | ||
| 80 | #else | ||
| 81 | #error Unsupported architecture | ||
| 74 | #endif | 82 | #endif |
| 75 | return 0; | 83 | return 0; |
| 76 | }, | 84 | }, |
| @@ -115,7 +123,7 @@ CallbackOrAccessOneWord DynarmicCP15::CompileGetOneWord(bool two, unsigned opc1, | |||
| 115 | CallbackOrAccessTwoWords DynarmicCP15::CompileGetTwoWords(bool two, unsigned opc, CoprocReg CRm) { | 123 | CallbackOrAccessTwoWords DynarmicCP15::CompileGetTwoWords(bool two, unsigned opc, CoprocReg CRm) { |
| 116 | if (!two && opc == 0 && CRm == CoprocReg::C14) { | 124 | if (!two && opc == 0 && CRm == CoprocReg::C14) { |
| 117 | // CNTPCT | 125 | // CNTPCT |
| 118 | const auto callback = [](Dynarmic::A32::Jit*, void* arg, u32, u32) -> u64 { | 126 | const auto callback = [](void* arg, u32, u32) -> u64 { |
| 119 | const auto& parent_arg = *static_cast<ARM_Dynarmic_32*>(arg); | 127 | const auto& parent_arg = *static_cast<ARM_Dynarmic_32*>(arg); |
| 120 | return parent_arg.system.CoreTiming().GetClockTicks(); | 128 | return parent_arg.system.CoreTiming().GetClockTicks(); |
| 121 | }; | 129 | }; |
diff --git a/src/core/arm/exclusive_monitor.cpp b/src/core/arm/exclusive_monitor.cpp index 2db0b035d..20550faeb 100644 --- a/src/core/arm/exclusive_monitor.cpp +++ b/src/core/arm/exclusive_monitor.cpp | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project | 1 | // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project |
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | 2 | // SPDX-License-Identifier: GPL-2.0-or-later |
| 3 | 3 | ||
| 4 | #ifdef ARCHITECTURE_x86_64 | 4 | #if defined(ARCHITECTURE_x86_64) || defined(ARCHITECTURE_arm64) |
| 5 | #include "core/arm/dynarmic/arm_exclusive_monitor.h" | 5 | #include "core/arm/dynarmic/arm_exclusive_monitor.h" |
| 6 | #endif | 6 | #endif |
| 7 | #include "core/arm/exclusive_monitor.h" | 7 | #include "core/arm/exclusive_monitor.h" |
| @@ -13,7 +13,7 @@ ExclusiveMonitor::~ExclusiveMonitor() = default; | |||
| 13 | 13 | ||
| 14 | std::unique_ptr<Core::ExclusiveMonitor> MakeExclusiveMonitor(Memory::Memory& memory, | 14 | std::unique_ptr<Core::ExclusiveMonitor> MakeExclusiveMonitor(Memory::Memory& memory, |
| 15 | std::size_t num_cores) { | 15 | std::size_t num_cores) { |
| 16 | #ifdef ARCHITECTURE_x86_64 | 16 | #if defined(ARCHITECTURE_x86_64) || defined(ARCHITECTURE_arm64) |
| 17 | return std::make_unique<Core::DynarmicExclusiveMonitor>(memory, num_cores); | 17 | return std::make_unique<Core::DynarmicExclusiveMonitor>(memory, num_cores); |
| 18 | #else | 18 | #else |
| 19 | // TODO(merry): Passthrough exclusive monitor | 19 | // TODO(merry): Passthrough exclusive monitor |