From d498db110661cce537deaa621ddb260b1ac5b505 Mon Sep 17 00:00:00 2001 From: lizzie Date: Thu, 30 Oct 2025 15:00:14 +0100 Subject: [PATCH] [dynarmic] nuke zydis/zycore out of orbit forever (#2893) LLVM does what Zydisn't Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2893 Reviewed-by: crueter Reviewed-by: MaranBr Co-authored-by: lizzie Co-committed-by: lizzie --- docs/Deps.md | 13 ++-- shell.nix | 2 +- src/dynarmic/CMakeLists.txt | 2 - .../CMakeModules/dynarmicConfig.cmake.in | 1 - src/dynarmic/README.md | 27 --------- src/dynarmic/externals/CMakeLists.txt | 14 ----- src/dynarmic/externals/cpmfile.json | 19 ------ src/dynarmic/src/dynarmic/CMakeLists.txt | 8 +-- .../dynarmic/backend/arm64/a32_interface.cpp | 8 --- .../dynarmic/backend/arm64/a64_interface.cpp | 14 +---- .../dynarmic/backend/arm64/address_space.cpp | 6 -- .../dynarmic/backend/arm64/address_space.h | 3 - .../backend/riscv64/a32_interface.cpp | 8 --- .../backend/x64/a32_emit_x64_memory.cpp | 4 +- .../dynarmic/backend/x64/a32_interface.cpp | 16 ++--- .../backend/x64/a64_emit_x64_memory.cpp | 4 +- .../dynarmic/backend/x64/a64_interface.cpp | 18 ++---- .../backend/x64/emit_x64_memory.cpp.inc | 8 +-- .../src/dynarmic/common/llvm_disassemble.cpp | 25 ++++---- .../src/dynarmic/common/x64_disassemble.cpp | 60 ------------------- .../src/dynarmic/common/x64_disassemble.h | 24 -------- src/dynarmic/src/dynarmic/interface/A32/a32.h | 14 ++--- src/dynarmic/src/dynarmic/interface/A64/a64.h | 14 ++--- src/dynarmic/tests/A32/fuzz_arm.cpp | 2 +- src/dynarmic/tests/A32/fuzz_thumb.cpp | 2 +- src/dynarmic/tests/A64/a64.cpp | 2 +- src/dynarmic/tests/A64/fuzz_with_unicorn.cpp | 2 +- src/dynarmic/tests/test_generator.cpp | 4 +- 28 files changed, 56 insertions(+), 268 deletions(-) delete mode 100644 src/dynarmic/src/dynarmic/common/x64_disassemble.cpp delete mode 100644 src/dynarmic/src/dynarmic/common/x64_disassemble.h diff --git a/docs/Deps.md b/docs/Deps.md index 162b83b5d6..2ff41cdb54 100644 --- a/docs/Deps.md +++ b/docs/Deps.md @@ -72,9 +72,6 @@ Certain other dependencies will be fetched by CPM regardless. System packages *c On amd64: * [xbyak](https://github.com/herumi/xbyak) - 7.22 or earlier is recommended -* [zycore](https://github.com/zyantific/zycore-c) -* [zydis](https://github.com/zyantific/zydis) 4+ -* Note: zydis and zycore-c MUST match. Using one as a system dependency and the other as a bundled dependency WILL break things On aarch64 OR if `DYNARMIC_TESTS` is on: * [oaknut](https://github.com/merryhime/oaknut) 2.0.1+ @@ -94,7 +91,7 @@ Click on the arrows to expand. Arch Linux ```sh -sudo pacman -Syu --needed base-devel boost catch2 cmake enet ffmpeg fmt git glslang libzip lz4 mbedtls ninja nlohmann-json openssl opus qt6-base qt6-multimedia sdl2 zlib zstd zip unzip zydis zycore vulkan-headers vulkan-utility-libraries libusb spirv-tools spirv-headers +sudo pacman -Syu --needed base-devel boost catch2 cmake enet ffmpeg fmt git glslang libzip lz4 mbedtls ninja nlohmann-json openssl opus qt6-base qt6-multimedia sdl2 zlib zstd zip unzip vulkan-headers vulkan-utility-libraries libusb spirv-tools spirv-headers ``` * Building with QT Web Engine requires `qt6-webengine` as well. @@ -106,7 +103,7 @@ sudo pacman -Syu --needed base-devel boost catch2 cmake enet ffmpeg fmt git glsl Ubuntu, Debian, Mint Linux ```sh -sudo apt-get install autoconf cmake g++ gcc git glslang-tools libglu1-mesa-dev libhidapi-dev libpulse-dev libtool libudev-dev libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-render-util0 libxcb-xinerama0 libxcb-xkb1 libxext-dev libxkbcommon-x11-0 mesa-common-dev nasm ninja-build qt6-base-private-dev libmbedtls-dev catch2 libfmt-dev liblz4-dev nlohmann-json3-dev libzstd-dev libssl-dev libavfilter-dev libavcodec-dev libswscale-dev pkg-config zlib1g-dev libva-dev libvdpau-dev qt6-tools-dev libzydis-dev zydis-tools libzycore-dev libvulkan-dev spirv-tools spirv-headers libusb-1.0-0-dev libxbyak-dev libboost-dev libboost-fiber-dev libboost-context-dev libsdl2-dev libopus-dev libasound2t64 vulkan-utility-libraries-dev +sudo apt-get install autoconf cmake g++ gcc git glslang-tools libglu1-mesa-dev libhidapi-dev libpulse-dev libtool libudev-dev libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-render-util0 libxcb-xinerama0 libxcb-xkb1 libxext-dev libxkbcommon-x11-0 mesa-common-dev nasm ninja-build qt6-base-private-dev libmbedtls-dev catch2 libfmt-dev liblz4-dev nlohmann-json3-dev libzstd-dev libssl-dev libavfilter-dev libavcodec-dev libswscale-dev pkg-config zlib1g-dev libva-dev libvdpau-dev qt6-tools-dev libvulkan-dev spirv-tools spirv-headers libusb-1.0-0-dev libxbyak-dev libboost-dev libboost-fiber-dev libboost-context-dev libsdl2-dev libopus-dev libasound2t64 vulkan-utility-libraries-dev ``` * Ubuntu 22.04, Linux Mint 20, or Debian 12 or later is required. @@ -189,7 +186,7 @@ brew install molten-vk vulkan-loader
FreeBSD -As root run: `pkg install devel/cmake devel/sdl20 devel/boost-libs devel/catch2 devel/libfmt devel/nlohmann-json devel/ninja devel/nasm devel/autoconf devel/pkgconf devel/qt6-base devel/simpleini net/enet multimedia/ffnvcodec-headers multimedia/ffmpeg audio/opus archivers/liblz4 lang/gcc12 graphics/glslang graphics/vulkan-utility-libraries graphics/spirv-tools www/cpp-httplib devel/jwt-cpp devel/unordered-dense devel/zydis` +As root run: `pkg install devel/cmake devel/sdl20 devel/boost-libs devel/catch2 devel/libfmt devel/nlohmann-json devel/ninja devel/nasm devel/autoconf devel/pkgconf devel/qt6-base devel/simpleini net/enet multimedia/ffnvcodec-headers multimedia/ffmpeg audio/opus archivers/liblz4 lang/gcc12 graphics/glslang graphics/vulkan-utility-libraries graphics/spirv-tools www/cpp-httplib devel/jwt-cpp devel/unordered-dense` If using FreeBSD 12 or prior, use `devel/pkg-config` instead. @@ -237,7 +234,7 @@ Then install the libraries: `sudo pkg install qt6 boost glslang libzip library/l * Download and install all dependencies: ``` BASE="git make autoconf libtool automake-wrapper jq patch" -MINGW="SDL2 cmake python-pip qt6-base toolchain ffmpeg boost catch fmt lz4 nlohmann-json openssl zlib zstd enet opus mbedtls vulkan-devel libusb vulkan-memory-allocator unordered_dense zydis clang ccache" +MINGW="SDL2 cmake python-pip qt6-base toolchain ffmpeg boost catch fmt lz4 nlohmann-json openssl zlib zstd enet opus mbedtls vulkan-devel libusb vulkan-memory-allocator unordered_dense clang ccache" packages="$BASE" for pkg in $MINGW; do @@ -260,7 +257,7 @@ pacman -Syu --needed --noconfirm $packages HaikuOS ```sh -pkgman install git cmake patch libfmt_devel nlohmann_json lz4_devel opus_devel boost1.89_devel vulkan_devel qt6_base_devel libsdl2_devel ffmpeg7_devel libx11_devel enet_devel catch2_devel quazip1_qt6_devel qt6_5compat_devel zydis_devel libusb1_devel libz_devel glslang mbedtls3 +pkgman install git cmake patch libfmt_devel nlohmann_json lz4_devel opus_devel boost1.89_devel vulkan_devel qt6_base_devel libsdl2_devel ffmpeg7_devel libx11_devel enet_devel catch2_devel quazip1_qt6_devel qt6_5compat_devel libusb1_devel libz_devel glslang mbedtls3 ``` [Caveats](./Caveats.md#haikuos). diff --git a/shell.nix b/shell.nix index d4a67d8f97..549c91959d 100644 --- a/shell.nix +++ b/shell.nix @@ -10,7 +10,7 @@ pkgs.mkShellNoCC { openssl boost fmt nlohmann_json lz4 zlib zstd enet libopus vulkan-headers vulkan-utility-libraries spirv-tools spirv-headers simpleini vulkan-memory-allocator - vulkan-loader unzip mbedtls zydis glslang python3 httplib + vulkan-loader unzip mbedtls glslang python3 httplib cpp-jwt ffmpeg-headless libusb1 cubeb qt6.full # eden SDL2 # eden-cli diff --git a/src/dynarmic/CMakeLists.txt b/src/dynarmic/CMakeLists.txt index 66f9b1f5cd..f0c2e7b188 100644 --- a/src/dynarmic/CMakeLists.txt +++ b/src/dynarmic/CMakeLists.txt @@ -137,8 +137,6 @@ endif() if ("x86_64" IN_LIST ARCHITECTURE) find_package(xbyak 7 CONFIG) - find_package(zycore REQUIRED) - find_package(zydis 4 REQUIRED) endif() if (DYNARMIC_USE_LLVM) diff --git a/src/dynarmic/CMakeModules/dynarmicConfig.cmake.in b/src/dynarmic/CMakeModules/dynarmicConfig.cmake.in index 51bb2dda16..ce14607c89 100644 --- a/src/dynarmic/CMakeModules/dynarmicConfig.cmake.in +++ b/src/dynarmic/CMakeModules/dynarmicConfig.cmake.in @@ -20,7 +20,6 @@ if (NOT @BUILD_SHARED_LIBS@) if ("x86_64" IN_LIST ARCHITECTURE) find_dependency(xbyak 7) - find_dependency(Zydis 4) endif() if (@DYNARMIC_USE_LLVM@) diff --git a/src/dynarmic/README.md b/src/dynarmic/README.md index 6976f29c34..38248a0dc2 100644 --- a/src/dynarmic/README.md +++ b/src/dynarmic/README.md @@ -389,30 +389,3 @@ THE POSSIBILITY OF SUCH DAMAGE. 損害、間接損害、偶発的な損害、特別損害、懲罰的損害、または結果損害について、 一切責任を負わないものとします。 ``` - -### zydis - -``` -The MIT License (MIT) - -Copyright (c) 2014-2020 Florian Bernd -Copyright (c) 2014-2020 Joel Höner - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` diff --git a/src/dynarmic/externals/CMakeLists.txt b/src/dynarmic/externals/CMakeLists.txt index ea666ddc52..1956499464 100644 --- a/src/dynarmic/externals/CMakeLists.txt +++ b/src/dynarmic/externals/CMakeLists.txt @@ -32,17 +32,3 @@ AddJsonPackage( NAME mcl BUNDLED_PACKAGE ${DYNARMIC_USE_BUNDLED_EXTERNALS} ) - -# TODO(crueter): maybe it's just Gentoo but zydis system package really sucks -if ("x86_64" IN_LIST ARCHITECTURE) - set(CMAKE_DISABLE_FIND_PACKAGE_Doxygen ON) - AddJsonPackage( - NAME zycore - BUNDLED_PACKAGE ${DYNARMIC_USE_BUNDLED_EXTERNALS} - ) - - AddJsonPackage( - NAME zydis - BUNDLED_PACKAGE ${DYNARMIC_USE_BUNDLED_EXTERNALS} - ) -endif() diff --git a/src/dynarmic/externals/cpmfile.json b/src/dynarmic/externals/cpmfile.json index f1fd47d556..584e1f9115 100644 --- a/src/dynarmic/externals/cpmfile.json +++ b/src/dynarmic/externals/cpmfile.json @@ -17,24 +17,5 @@ "patches": [ "0001-assert-macro.patch" ] - }, - "zycore": { - "package": "zycore", - "repo": "zyantific/zycore-c", - "sha": "75a36c45ae", - "hash": "e1cf9bdd3163b6429eba94d0f9f82e343de33b77a838748f598c719913c9f91c502b818e37b716e174b55a3a26cdf39d665c4b50a548255973ac287c0e554fb6" - }, - "zydis": { - "package": "zydis", - "version": "4", - "repo": "zyantific/zydis", - "sha": "c2d2bab025", - "hash": "3808773593536f78d3ddaf4cf712101d3fb6d981c6cc55555ad686a9adbe3397a727f62f561e8d8755bdcd88a763777da30281cc2924fc160b0386c3f99f5bd9", - "options": [ - "ZYDIS_BUILD_TOOLS OFF", - "ZYDIS_BUILD_EXAMPLES OFF", - "ZYDIS_BUILD_DOXYGEN OFF", - "ZYAN_SYSTEM_ZYCORE ON" - ] } } diff --git a/src/dynarmic/src/dynarmic/CMakeLists.txt b/src/dynarmic/src/dynarmic/CMakeLists.txt index 1c92e236c9..5d52637ec3 100644 --- a/src/dynarmic/src/dynarmic/CMakeLists.txt +++ b/src/dynarmic/src/dynarmic/CMakeLists.txt @@ -144,11 +144,7 @@ if ("x86_64" IN_LIST ARCHITECTURE) target_compile_definitions(dynarmic PRIVATE XBYAK_STRICT_CHECK_MEM_REG_SIZE=0) target_compile_definitions(dynarmic PRIVATE XBYAK_OLD_DISP_CHECK=1) - target_link_libraries(dynarmic - PRIVATE - xbyak::xbyak - Zydis::Zydis - ) + target_link_libraries(dynarmic PRIVATE xbyak::xbyak) target_architecture_specific_sources(dynarmic "x86_64" backend/x64/abi.cpp @@ -192,8 +188,6 @@ if ("x86_64" IN_LIST ARCHITECTURE) backend/x64/verbose_debugging_output.h common/spin_lock_x64.cpp common/spin_lock_x64.h - common/x64_disassemble.cpp - common/x64_disassemble.h # A32 backend/x64/a32_emit_x64.cpp backend/x64/a32_emit_x64.h diff --git a/src/dynarmic/src/dynarmic/backend/arm64/a32_interface.cpp b/src/dynarmic/src/dynarmic/backend/arm64/a32_interface.cpp index a22f296e94..a27740008b 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/a32_interface.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/a32_interface.cpp @@ -125,10 +125,6 @@ struct Jit::Impl final { current_state.exclusive_state = false; } - void DumpDisassembly() const { - ASSERT_FALSE("Unimplemented"); - } - private: void PerformRequestedCacheInvalidation(HaltReason hr) { if (Has(hr, HaltReason::CacheInvalidation)) { @@ -235,8 +231,4 @@ void Jit::ClearExclusiveState() { impl->ClearExclusiveState(); } -void Jit::DumpDisassembly() const { - impl->DumpDisassembly(); -} - } // namespace Dynarmic::A32 diff --git a/src/dynarmic/src/dynarmic/backend/arm64/a64_interface.cpp b/src/dynarmic/src/dynarmic/backend/arm64/a64_interface.cpp index 96170f08a8..c49312d458 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/a64_interface.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/a64_interface.cpp @@ -151,12 +151,8 @@ struct Jit::Impl final { return is_executing; } - void DumpDisassembly() const { - current_address_space.DumpDisassembly(); - } - - std::vector Disassemble() const { - ASSERT_FALSE("Unimplemented"); + std::string Disassemble() const { + UNREACHABLE(); } private: @@ -315,11 +311,7 @@ bool Jit::IsExecuting() const { return impl->IsExecuting(); } -void Jit::DumpDisassembly() const { - impl->DumpDisassembly(); -} - -std::vector Jit::Disassemble() const { +std::string Jit::Disassemble() const { return impl->Disassemble(); } diff --git a/src/dynarmic/src/dynarmic/backend/arm64/address_space.cpp b/src/dynarmic/src/dynarmic/backend/arm64/address_space.cpp index 5006e9e27a..8e8c8e5255 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/address_space.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/address_space.cpp @@ -100,12 +100,6 @@ void AddressSpace::ClearCache() { code.set_offset(prelude_info.end_of_prelude); } -void AddressSpace::DumpDisassembly() const { - for (u32* ptr = mem.ptr(); ptr < code.xptr(); ptr++) { - std::printf("%s", Common::DisassembleAArch64(*ptr, std::bit_cast(ptr)).c_str()); - } -} - size_t AddressSpace::GetRemainingSize() { return code_cache_size - static_cast(code.offset()); } diff --git a/src/dynarmic/src/dynarmic/backend/arm64/address_space.h b/src/dynarmic/src/dynarmic/backend/arm64/address_space.h index 25b1ab4b04..d7d8cf38b6 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/address_space.h +++ b/src/dynarmic/src/dynarmic/backend/arm64/address_space.h @@ -44,9 +44,6 @@ public: void InvalidateBasicBlocks(const ankerl::unordered_dense::set& descriptors); void ClearCache(); - - void DumpDisassembly() const; - protected: virtual EmitConfig GetEmitConfig() = 0; virtual void RegisterNewBasicBlock(const IR::Block& block, const EmittedBlockInfo& block_info) = 0; diff --git a/src/dynarmic/src/dynarmic/backend/riscv64/a32_interface.cpp b/src/dynarmic/src/dynarmic/backend/riscv64/a32_interface.cpp index 7ad0fd90b0..c567f4ae30 100644 --- a/src/dynarmic/src/dynarmic/backend/riscv64/a32_interface.cpp +++ b/src/dynarmic/src/dynarmic/backend/riscv64/a32_interface.cpp @@ -119,10 +119,6 @@ struct Jit::Impl final { current_state.exclusive_state = false; } - void DumpDisassembly() const { - UNIMPLEMENTED(); - } - private: void RequestCacheInvalidation() { // ASSERT_FALSE("Unimplemented"); @@ -213,8 +209,4 @@ void Jit::ClearExclusiveState() { impl->ClearExclusiveState(); } -void Jit::DumpDisassembly() const { - impl->DumpDisassembly(); -} - } // namespace Dynarmic::A32 diff --git a/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64_memory.cpp b/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64_memory.cpp index a1fca21f47..db7fef5334 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64_memory.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64_memory.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + /* This file is part of the dynarmic project. * Copyright (c) 2022 MerryMage * SPDX-License-Identifier: 0BSD @@ -19,7 +22,6 @@ #include "dynarmic/backend/x64/emit_x64_memory.h" #include "dynarmic/backend/x64/exclusive_monitor_friend.h" #include "dynarmic/backend/x64/perf_map.h" -#include "dynarmic/common/x64_disassemble.h" #include "dynarmic/interface/exclusive_monitor.h" namespace Dynarmic::Backend::X64 { diff --git a/src/dynarmic/src/dynarmic/backend/x64/a32_interface.cpp b/src/dynarmic/src/dynarmic/backend/x64/a32_interface.cpp index 0de8aedc12..645845c58d 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a32_interface.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/a32_interface.cpp @@ -16,6 +16,7 @@ #include #include #include "dynarmic/common/common_types.h" +#include "dynarmic/common/llvm_disassemble.h" #include "dynarmic/backend/x64/a32_emit_x64.h" #include "dynarmic/backend/x64/a32_jitstate.h" @@ -24,7 +25,6 @@ #include "dynarmic/backend/x64/devirtualize.h" #include "dynarmic/backend/x64/jitstate_info.h" #include "dynarmic/common/atomic.h" -#include "dynarmic/common/x64_disassemble.h" #include "dynarmic/frontend/A32/translate/a32_translate.h" #include "dynarmic/interface/A32/a32.h" #include "dynarmic/ir/basic_block.h" @@ -176,14 +176,10 @@ struct Jit::Impl { return jit_state.SetFpscr(value); } - void DumpDisassembly() const { + std::string Disassemble() const { const size_t size = reinterpret_cast(block_of_code.getCurr()) - reinterpret_cast(block_of_code.GetCodeBegin()); - Common::DumpDisassembledX64(block_of_code.GetCodeBegin(), size); - } - - std::vector Disassemble() const { - const size_t size = reinterpret_cast(block_of_code.getCurr()) - reinterpret_cast(block_of_code.GetCodeBegin()); - return Common::DisassembleX64(block_of_code.GetCodeBegin(), size); + auto const* p = reinterpret_cast(block_of_code.GetCodeBegin()); + return Common::DisassembleX64(p, p + size); } private: @@ -327,8 +323,4 @@ void Jit::ClearExclusiveState() { impl->ClearExclusiveState(); } -void Jit::DumpDisassembly() const { - impl->DumpDisassembly(); -} - } // namespace Dynarmic::A32 diff --git a/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64_memory.cpp b/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64_memory.cpp index 8fd6777542..8ae5b30172 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64_memory.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64_memory.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + /* This file is part of the dynarmic project. * Copyright (c) 2022 MerryMage * SPDX-License-Identifier: 0BSD @@ -20,7 +23,6 @@ #include "dynarmic/backend/x64/exclusive_monitor_friend.h" #include "dynarmic/backend/x64/perf_map.h" #include "dynarmic/common/spin_lock_x64.h" -#include "dynarmic/common/x64_disassemble.h" #include "dynarmic/interface/exclusive_monitor.h" namespace Dynarmic::Backend::X64 { diff --git a/src/dynarmic/src/dynarmic/backend/x64/a64_interface.cpp b/src/dynarmic/src/dynarmic/backend/x64/a64_interface.cpp index e23fc782ad..b895e42251 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a64_interface.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/a64_interface.cpp @@ -12,6 +12,7 @@ #include #include "dynarmic/common/assert.h" +#include "dynarmic/common/llvm_disassemble.h" #include #include @@ -21,7 +22,6 @@ #include "dynarmic/backend/x64/devirtualize.h" #include "dynarmic/backend/x64/jitstate_info.h" #include "dynarmic/common/atomic.h" -#include "dynarmic/common/x64_disassemble.h" #include "dynarmic/frontend/A64/translate/a64_translate.h" #include "dynarmic/interface/A64/a64.h" #include "dynarmic/ir/basic_block.h" @@ -231,14 +231,10 @@ public: return is_executing; } - void DumpDisassembly() const { + std::string Disassemble() const { const size_t size = reinterpret_cast(block_of_code.getCurr()) - reinterpret_cast(block_of_code.GetCodeBegin()); - Common::DumpDisassembledX64(block_of_code.GetCodeBegin(), size); - } - - std::vector Disassemble() const { - const size_t size = reinterpret_cast(block_of_code.getCurr()) - reinterpret_cast(block_of_code.GetCodeBegin()); - return Common::DisassembleX64(block_of_code.GetCodeBegin(), size); + auto const* p = reinterpret_cast(block_of_code.GetCodeBegin()); + return Common::DisassembleX64(p, p + size); } private: @@ -427,11 +423,7 @@ bool Jit::IsExecuting() const { return impl->IsExecuting(); } -void Jit::DumpDisassembly() const { - return impl->DumpDisassembly(); -} - -std::vector Jit::Disassemble() const { +std::string Jit::Disassemble() const { return impl->Disassemble(); } diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.cpp.inc b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.cpp.inc index 04eeadb4d6..e2ae38c203 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.cpp.inc +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.cpp.inc @@ -40,11 +40,9 @@ FakeCall AxxEmitX64::FastmemCallback(u64 rip_) { } return result; } else { - fmt::print("dynarmic: Segfault happened within JITted code at rip = {:016x}\n", rip_); - fmt::print("Segfault wasn't at a fastmem patch location!\n"); - fmt::print("Now dumping code.......\n\n"); - Common::DumpDisassembledX64((void*)(rip_ & ~u64(0xFFF)), 0x1000); - ASSERT_FALSE("iter != fastmem_patch_info.end()"); + fmt::print("dynarmic: Segfault happened within JITted code at rip = {:016x}\n" + "Segfault wasn't at a fastmem patch location!\n", rip_); + UNREACHABLE(); //("iter != fastmem_patch_info.end()"); } } diff --git a/src/dynarmic/src/dynarmic/common/llvm_disassemble.cpp b/src/dynarmic/src/dynarmic/common/llvm_disassemble.cpp index be8278dc27..068c531f70 100644 --- a/src/dynarmic/src/dynarmic/common/llvm_disassemble.cpp +++ b/src/dynarmic/src/dynarmic/common/llvm_disassemble.cpp @@ -24,9 +24,8 @@ namespace Dynarmic::Common { std::string DisassembleX64(const void* begin, const void* end) { - std::string result; - #ifdef DYNARMIC_USE_LLVM + std::string result; LLVMInitializeX86TargetInfo(); LLVMInitializeX86TargetMC(); LLVMInitializeX86Disassembler(); @@ -51,18 +50,17 @@ std::string DisassembleX64(const void* begin, const void* end) { } LLVMDisasmDispose(llvm_ctx); + return result; #else - result += fmt::format("(recompile with DYNARMIC_USE_LLVM=ON to disassemble the generated x86_64 code)\n"); - result += fmt::format("start: {:016x}, end: {:016x}\n", std::bit_cast(begin), std::bit_cast(end)); + return fmt::format( + "(recompile with DYNARMIC_USE_LLVM=ON to disassemble the generated x86_64 code)\n" + "start: {:016x}, end: {:016x}\n", std::bit_cast(begin), std::bit_cast(end)); #endif - - return result; } std::string DisassembleAArch32([[maybe_unused]] bool is_thumb, [[maybe_unused]] u32 pc, [[maybe_unused]] const u8* instructions, [[maybe_unused]] size_t length) { - std::string result; - #ifdef DYNARMIC_USE_LLVM + std::string result; LLVMInitializeARMTargetInfo(); LLVMInitializeARMTargetMC(); LLVMInitializeARMDisassembler(); @@ -97,16 +95,14 @@ std::string DisassembleAArch32([[maybe_unused]] bool is_thumb, [[maybe_unused]] } LLVMDisasmDispose(llvm_ctx); + return result; #else - result += fmt::format("(disassembly disabled)\n"); + return fmt::format("(disassembly disabled)\n"); #endif - - return result; } std::string DisassembleAArch64([[maybe_unused]] u32 instruction, [[maybe_unused]] u64 pc) { std::string result; - #ifdef DYNARMIC_USE_LLVM LLVMInitializeAArch64TargetInfo(); LLVMInitializeAArch64TargetMC(); @@ -121,11 +117,10 @@ std::string DisassembleAArch64([[maybe_unused]] u32 instruction, [[maybe_unused] result += '\n'; LLVMDisasmDispose(llvm_ctx); + return result; #else - result += fmt::format("(disassembly disabled)\n"); + return fmt::format("(disassembly disabled)\n"); #endif - - return result; } } // namespace Dynarmic::Common diff --git a/src/dynarmic/src/dynarmic/common/x64_disassemble.cpp b/src/dynarmic/src/dynarmic/common/x64_disassemble.cpp deleted file mode 100644 index af37c93c02..0000000000 --- a/src/dynarmic/src/dynarmic/common/x64_disassemble.cpp +++ /dev/null @@ -1,60 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -/* This file is part of the dynarmic project. - * Copyright (c) 2021 MerryMage - * SPDX-License-Identifier: 0BSD - */ - -#include "dynarmic/common/x64_disassemble.h" - -#include -#include -#include "dynarmic/common/common_types.h" - -namespace Dynarmic::Common { - -void DumpDisassembledX64(const void* ptr, size_t size) { - ZydisDecoder decoder; - ZydisDecoderInit(&decoder, ZYDIS_MACHINE_MODE_LONG_64, ZYDIS_STACK_WIDTH_64); - - ZydisFormatter formatter; - ZydisFormatterInit(&formatter, ZYDIS_FORMATTER_STYLE_INTEL); - - size_t offset = 0; - ZydisDecodedInstruction instruction; - ZydisDecodedOperand operands[ZYDIS_MAX_OPERAND_COUNT]; - while (ZYAN_SUCCESS(ZydisDecoderDecodeFull(&decoder, static_cast(ptr) + offset, size - offset, &instruction, operands))) { - fmt::print("{:016x} ", (u64)ptr + offset); - - char buffer[256]; - ZydisFormatterFormatInstruction(&formatter, &instruction, operands, instruction.operand_count_visible, buffer, sizeof(buffer), reinterpret_cast(ptr) + offset, ZYAN_NULL); - puts(buffer); - - offset += instruction.length; - } -} - -std::vector DisassembleX64(const void* ptr, size_t size) { - std::vector result; - ZydisDecoder decoder; - ZydisDecoderInit(&decoder, ZYDIS_MACHINE_MODE_LONG_64, ZYDIS_STACK_WIDTH_64); - - ZydisFormatter formatter; - ZydisFormatterInit(&formatter, ZYDIS_FORMATTER_STYLE_INTEL); - - size_t offset = 0; - ZydisDecodedInstruction instruction; - ZydisDecodedOperand operands[ZYDIS_MAX_OPERAND_COUNT]; - while (ZYAN_SUCCESS(ZydisDecoderDecodeFull(&decoder, static_cast(ptr) + offset, size - offset, &instruction, operands))) { - char buffer[256]; - ZydisFormatterFormatInstruction(&formatter, &instruction, operands, instruction.operand_count_visible, buffer, sizeof(buffer), reinterpret_cast(ptr) + offset, ZYAN_NULL); - - result.push_back(fmt::format("{:016x} {}", (u64)ptr + offset, buffer)); - - offset += instruction.length; - } - - return result; -} -} // namespace Dynarmic::Common diff --git a/src/dynarmic/src/dynarmic/common/x64_disassemble.h b/src/dynarmic/src/dynarmic/common/x64_disassemble.h deleted file mode 100644 index 0f56464175..0000000000 --- a/src/dynarmic/src/dynarmic/common/x64_disassemble.h +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -/* This file is part of the dynarmic project. - * Copyright (c) 2021 MerryMage - * SPDX-License-Identifier: 0BSD - */ - -#pragma once - -#include -#include - -#include "dynarmic/common/common_types.h" - -namespace Dynarmic::Common { - -void DumpDisassembledX64(const void* ptr, size_t size); -/** - * Disassemble `size' bytes from `ptr' and return the disassembled lines as a vector - * of strings. - */ -std::vector DisassembleX64(const void* ptr, size_t size); -} // namespace Dynarmic::Common diff --git a/src/dynarmic/src/dynarmic/interface/A32/a32.h b/src/dynarmic/src/dynarmic/interface/A32/a32.h index e1c5b40fd3..bc30b59c1e 100644 --- a/src/dynarmic/src/dynarmic/interface/A32/a32.h +++ b/src/dynarmic/src/dynarmic/interface/A32/a32.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + /* This file is part of the dynarmic project. * Copyright (c) 2016 MerryMage * SPDX-License-Identifier: 0BSD @@ -89,14 +92,9 @@ public: return is_executing; } - /// Debugging: Dump a disassembly all compiled code to the console. - void DumpDisassembly() const; - - /** - * Disassemble the instructions following the current pc and return - * the resulting instructions as a vector of their string representations. - */ - std::vector Disassemble() const; + /// @brief Disassemble the instructions following the current pc and return + /// the resulting instructions as a vector of their string representations. + std::string Disassemble() const; private: bool is_executing = false; diff --git a/src/dynarmic/src/dynarmic/interface/A64/a64.h b/src/dynarmic/src/dynarmic/interface/A64/a64.h index a150da8448..e8d2352702 100644 --- a/src/dynarmic/src/dynarmic/interface/A64/a64.h +++ b/src/dynarmic/src/dynarmic/interface/A64/a64.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + /* This file is part of the dynarmic project. * Copyright (c) 2018 MerryMage * SPDX-License-Identifier: 0BSD @@ -119,14 +122,9 @@ public: */ bool IsExecuting() const; - /// Debugging: Dump a disassembly all of compiled code to the console. - void DumpDisassembly() const; - - /* - * Disassemble the instructions following the current pc and return - * the resulting instructions as a vector of their string representations. - */ - std::vector Disassemble() const; + /// @brief Disassemble the instructions following the current pc and return + /// the resulting instructions as a vector of their string representations. + std::string Disassemble() const; private: struct Impl; diff --git a/src/dynarmic/tests/A32/fuzz_arm.cpp b/src/dynarmic/tests/A32/fuzz_arm.cpp index bef473a491..e405d63f3b 100644 --- a/src/dynarmic/tests/A32/fuzz_arm.cpp +++ b/src/dynarmic/tests/A32/fuzz_arm.cpp @@ -417,7 +417,7 @@ static void RunTestInstance(Dynarmic::A32::Jit& jit, fmt::print("\n"); fmt::print("x86_64:\n"); - jit.DumpDisassembly(); + fmt::print("{}", jit.Disassemble()); fmt::print("Interrupts:\n"); for (const auto& i : uni_env.interrupts) { diff --git a/src/dynarmic/tests/A32/fuzz_thumb.cpp b/src/dynarmic/tests/A32/fuzz_thumb.cpp index 7f64cb0ccb..af9181bcca 100644 --- a/src/dynarmic/tests/A32/fuzz_thumb.cpp +++ b/src/dynarmic/tests/A32/fuzz_thumb.cpp @@ -183,7 +183,7 @@ static void RunInstance(size_t run_number, ThumbTestEnv& test_env, A32Unicorn