diff options
| author | bunnei <bunneidev@gmail.com> | 2022-11-10 17:11:27 -0800 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-11-10 17:11:27 -0800 | 
| commit | d05b183f2118a5e2c919c35023549f30201bdd7c (patch) | |
| tree | 082cf6bb2e372c3233872b836fa96bdc0c25f279 | |
| parent | 83eb9cf7dabc7685215b423ffae9a650fa9a3f50 (diff) | |
| parent | cbaf642ffe4b05f8796798ebdc5c6892605928cc (diff) | |
Merge pull request #9198 from liamwhite/arm64
Initial ARM64 support
| -rw-r--r-- | CMakeLists.txt | 8 | ||||
| -rw-r--r-- | externals/CMakeLists.txt | 11 | ||||
| m--------- | externals/dynarmic | 0 | ||||
| m--------- | externals/xbyak | 0 | ||||
| -rw-r--r-- | src/audio_core/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/common/common_funcs.h | 4 | ||||
| -rw-r--r-- | src/common/host_memory.cpp | 6 | ||||
| -rw-r--r-- | src/core/CMakeLists.txt | 14 | ||||
| -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 | ||||
| -rw-r--r-- | src/core/hle/kernel/physical_core.cpp | 4 | ||||
| -rw-r--r-- | src/video_core/CMakeLists.txt | 15 | ||||
| -rw-r--r-- | src/video_core/macro/macro.cpp | 3 | ||||
| -rw-r--r-- | src/yuzu/CMakeLists.txt | 2 | 
15 files changed, 66 insertions, 34 deletions
| diff --git a/CMakeLists.txt b/CMakeLists.txt index c6fc5dd9e..1d13dc74e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -133,13 +133,13 @@ if (NOT ENABLE_GENERIC)      if (MSVC)          detect_architecture("_M_AMD64" x86_64)          detect_architecture("_M_IX86" x86) -        detect_architecture("_M_ARM" ARM) -        detect_architecture("_M_ARM64" ARM64) +        detect_architecture("_M_ARM" arm) +        detect_architecture("_M_ARM64" arm64)      else()          detect_architecture("__x86_64__" x86_64)          detect_architecture("__i386__" x86) -        detect_architecture("__arm__" ARM) -        detect_architecture("__aarch64__" ARM64) +        detect_architecture("__arm__" arm) +        detect_architecture("__aarch64__" arm64)      endif()  endif() diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index e80fd124e..7f0a6d069 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -7,15 +7,14 @@ include(DownloadExternals)  # xbyak  if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64) -    add_library(xbyak INTERFACE) -    file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/xbyak/include) -    file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/xbyak/xbyak DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/xbyak/include) -    target_include_directories(xbyak SYSTEM INTERFACE ${CMAKE_CURRENT_BINARY_DIR}/xbyak/include) -    target_compile_definitions(xbyak INTERFACE XBYAK_NO_OP_NAMES) +    add_subdirectory(xbyak)  endif()  # Dynarmic -if (ARCHITECTURE_x86_64) +if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64) +    if (ARCHITECTURE_arm64) +       set(DYNARMIC_FRONTENDS "A32") +    endif()      set(DYNARMIC_NO_BUNDLED_FMT ON)      set(DYNARMIC_IGNORE_ASSERTS ON CACHE BOOL "" FORCE)      add_subdirectory(dynarmic) diff --git a/externals/dynarmic b/externals/dynarmic -Subproject 2d4602a6516c67d547000d4c80bcc5f74976abd +Subproject 424fdb5c5026ec5bdd7553271190397f63fb503 diff --git a/externals/xbyak b/externals/xbyak -Subproject c306b8e5786eeeb87b8925a8af5c3bf057ff5a9 +Subproject 348e3e548ebac06d243e5881caec8440e249f65 diff --git a/src/audio_core/CMakeLists.txt b/src/audio_core/CMakeLists.txt index 0a1f3bf18..8e3a8f5a8 100644 --- a/src/audio_core/CMakeLists.txt +++ b/src/audio_core/CMakeLists.txt @@ -217,7 +217,7 @@ else()  endif()  target_link_libraries(audio_core PUBLIC common core) -if (ARCHITECTURE_x86_64) +if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64)      target_link_libraries(audio_core PRIVATE dynarmic)  endif() diff --git a/src/common/common_funcs.h b/src/common/common_funcs.h index e1e2a90fc..0dad9338a 100644 --- a/src/common/common_funcs.h +++ b/src/common/common_funcs.h @@ -31,8 +31,10 @@  #ifndef _MSC_VER -#ifdef ARCHITECTURE_x86_64 +#if defined(ARCHITECTURE_x86_64)  #define Crash() __asm__ __volatile__("int $3") +#elif defined(ARCHITECTURE_arm64) +#define Crash() __asm__ __volatile__("brk #0")  #else  #define Crash() exit(1)  #endif diff --git a/src/common/host_memory.cpp b/src/common/host_memory.cpp index 7f9659612..909f6cf3f 100644 --- a/src/common/host_memory.cpp +++ b/src/common/host_memory.cpp @@ -359,6 +359,12 @@ public:              }          }); +        long page_size = sysconf(_SC_PAGESIZE); +        if (page_size != 0x1000) { +            LOG_CRITICAL(HW_Memory, "page size {:#x} is incompatible with 4K paging", page_size); +            throw std::bad_alloc{}; +        } +          // Backing memory initialization  #if defined(__FreeBSD__) && __FreeBSD__ < 13          // XXX Drop after FreeBSD 12.* reaches EOL on 2024-06-30 diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index f6e082c36..f67f1ce92 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -497,10 +497,6 @@ add_library(core STATIC      hle/service/hid/irsensor/processor_base.h      hle/service/hid/irsensor/tera_plugin_processor.cpp      hle/service/hid/irsensor/tera_plugin_processor.h -    hle/service/jit/jit_context.cpp -    hle/service/jit/jit_context.h -    hle/service/jit/jit.cpp -    hle/service/jit/jit.h      hle/service/lbl/lbl.cpp      hle/service/lbl/lbl.h      hle/service/ldn/lan_discovery.cpp @@ -805,14 +801,18 @@ if (ENABLE_WEB_SERVICE)      target_link_libraries(core PRIVATE web_service)  endif() -if (ARCHITECTURE_x86_64) +if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64)      target_sources(core PRIVATE -        arm/dynarmic/arm_dynarmic_32.cpp -        arm/dynarmic/arm_dynarmic_32.h          arm/dynarmic/arm_dynarmic_64.cpp          arm/dynarmic/arm_dynarmic_64.h +        arm/dynarmic/arm_dynarmic_32.cpp +        arm/dynarmic/arm_dynarmic_32.h          arm/dynarmic/arm_dynarmic_cp15.cpp          arm/dynarmic/arm_dynarmic_cp15.h +        hle/service/jit/jit_context.cpp +        hle/service/jit/jit_context.h +        hle/service/jit/jit.cpp +        hle/service/jit/jit.h      )      target_link_libraries(core PRIVATE dynarmic)  endif() 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*          }      } +#ifdef ARCHITECTURE_arm64 +    // TODO: remove when fixed in dynarmic +    config.optimizations &= ~Dynarmic::OptimizationFlag::BlockLinking; +#endif +      return std::make_unique<Dynarmic::A32::Jit>(config);  } 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          case 4:              // CP15_DATA_SYNC_BARRIER              return Callback{ -                [](Dynarmic::A32::Jit*, void*, std::uint32_t, std::uint32_t) -> std::uint64_t { -#ifdef _MSC_VER +                [](void*, std::uint32_t, std::uint32_t) -> std::uint64_t { +#if defined(_MSC_VER) && defined(ARCHITECTURE_x86_64)                      _mm_mfence();                      _mm_lfence(); -#else +#elif defined(ARCHITECTURE_x86_64)                      asm volatile("mfence\n\tlfence\n\t" : : : "memory"); +#elif defined(ARCHITECTURE_arm64) +                    asm volatile("dsb sy\n\t" : : : "memory"); +#else +#error Unsupported architecture  #endif                      return 0;                  }, @@ -66,11 +70,15 @@ CallbackOrAccessOneWord DynarmicCP15::CompileSendOneWord(bool two, unsigned opc1          case 5:              // CP15_DATA_MEMORY_BARRIER              return Callback{ -                [](Dynarmic::A32::Jit*, void*, std::uint32_t, std::uint32_t) -> std::uint64_t { -#ifdef _MSC_VER +                [](void*, std::uint32_t, std::uint32_t) -> std::uint64_t { +#if defined(_MSC_VER) && defined(ARCHITECTURE_x86_64)                      _mm_mfence(); -#else +#elif defined(ARCHITECTURE_x86_64)                      asm volatile("mfence\n\t" : : : "memory"); +#elif defined(ARCHITECTURE_arm64) +                    asm volatile("dmb sy\n\t" : : : "memory"); +#else +#error Unsupported architecture  #endif                      return 0;                  }, @@ -115,7 +123,7 @@ CallbackOrAccessOneWord DynarmicCP15::CompileGetOneWord(bool two, unsigned opc1,  CallbackOrAccessTwoWords DynarmicCP15::CompileGetTwoWords(bool two, unsigned opc, CoprocReg CRm) {      if (!two && opc == 0 && CRm == CoprocReg::C14) {          // CNTPCT -        const auto callback = [](Dynarmic::A32::Jit*, void* arg, u32, u32) -> u64 { +        const auto callback = [](void* arg, u32, u32) -> u64 {              const auto& parent_arg = *static_cast<ARM_Dynarmic_32*>(arg);              return parent_arg.system.CoreTiming().GetClockTicks();          }; 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 @@  // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project  // SPDX-License-Identifier: GPL-2.0-or-later -#ifdef ARCHITECTURE_x86_64 +#if defined(ARCHITECTURE_x86_64) || defined(ARCHITECTURE_arm64)  #include "core/arm/dynarmic/arm_exclusive_monitor.h"  #endif  #include "core/arm/exclusive_monitor.h" @@ -13,7 +13,7 @@ ExclusiveMonitor::~ExclusiveMonitor() = default;  std::unique_ptr<Core::ExclusiveMonitor> MakeExclusiveMonitor(Memory::Memory& memory,                                                               std::size_t num_cores) { -#ifdef ARCHITECTURE_x86_64 +#if defined(ARCHITECTURE_x86_64) || defined(ARCHITECTURE_arm64)      return std::make_unique<Core::DynarmicExclusiveMonitor>(memory, num_cores);  #else      // TODO(merry): Passthrough exclusive monitor diff --git a/src/core/hle/kernel/physical_core.cpp b/src/core/hle/kernel/physical_core.cpp index d4375962f..3044922ac 100644 --- a/src/core/hle/kernel/physical_core.cpp +++ b/src/core/hle/kernel/physical_core.cpp @@ -12,7 +12,7 @@ namespace Kernel {  PhysicalCore::PhysicalCore(std::size_t core_index_, Core::System& system_, KScheduler& scheduler_)      : core_index{core_index_}, system{system_}, scheduler{scheduler_} { -#ifdef ARCHITECTURE_x86_64 +#if defined(ARCHITECTURE_x86_64) || defined(ARCHITECTURE_arm64)      // TODO(bunnei): Initialization relies on a core being available. We may later replace this with      // a 32-bit instance of Dynarmic. This should be abstracted out to a CPU manager.      auto& kernel = system.Kernel(); @@ -26,7 +26,7 @@ PhysicalCore::PhysicalCore(std::size_t core_index_, Core::System& system_, KSche  PhysicalCore::~PhysicalCore() = default;  void PhysicalCore::Initialize([[maybe_unused]] bool is_64_bit) { -#ifdef ARCHITECTURE_x86_64 +#if defined(ARCHITECTURE_x86_64) || defined(ARCHITECTURE_arm64)      auto& kernel = system.Kernel();      if (!is_64_bit) {          // We already initialized a 64-bit core, replace with a 32-bit one. diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt index 106991969..d7f7d336c 100644 --- a/src/video_core/CMakeLists.txt +++ b/src/video_core/CMakeLists.txt @@ -73,8 +73,6 @@ add_library(video_core STATIC      macro/macro_hle.h      macro/macro_interpreter.cpp      macro/macro_interpreter.h -    macro/macro_jit_x64.cpp -    macro/macro_jit_x64.h      fence_manager.h      gpu.cpp      gpu.h @@ -245,7 +243,7 @@ add_library(video_core STATIC  create_target_directory_groups(video_core)  target_link_libraries(video_core PUBLIC common core) -target_link_libraries(video_core PUBLIC glad shader_recompiler xbyak) +target_link_libraries(video_core PUBLIC glad shader_recompiler)  if (YUZU_USE_BUNDLED_FFMPEG AND NOT WIN32)      add_dependencies(video_core ffmpeg-build) @@ -282,8 +280,19 @@ else()          -Wno-sign-conversion      ) + +    # xbyak +    set_source_files_properties(macro/macro_jit_x64.cpp PROPERTIES COMPILE_OPTIONS "-Wno-conversion;-Wno-shadow")  endif()  if (ARCHITECTURE_x86_64) +    target_sources(video_core PRIVATE +        macro/macro_jit_x64.cpp +        macro/macro_jit_x64.h +    ) +    target_link_libraries(video_core PUBLIC xbyak) +endif() + +if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64)      target_link_libraries(video_core PRIVATE dynarmic)  endif() diff --git a/src/video_core/macro/macro.cpp b/src/video_core/macro/macro.cpp index f61d5998e..505d81c1e 100644 --- a/src/video_core/macro/macro.cpp +++ b/src/video_core/macro/macro.cpp @@ -16,7 +16,10 @@  #include "video_core/macro/macro.h"  #include "video_core/macro/macro_hle.h"  #include "video_core/macro/macro_interpreter.h" + +#ifdef ARCHITECTURE_x86_64  #include "video_core/macro/macro_jit_x64.h" +#endif  namespace Tegra { diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index 239f12382..5cc1fbf32 100644 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt @@ -385,6 +385,6 @@ if (NOT APPLE)      target_compile_definitions(yuzu PRIVATE HAS_OPENGL)  endif() -if (ARCHITECTURE_x86_64) +if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64)      target_link_libraries(yuzu PRIVATE dynarmic)  endif() | 
