From a4035ce2d862d08b2d511dc1d93a2d9f21187499 Mon Sep 17 00:00:00 2001 From: lizzie Date: Fri, 16 Jan 2026 03:09:03 +0000 Subject: [PATCH 01/78] no conversion fixs --- src/video_core/macro.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/video_core/macro.cpp b/src/video_core/macro.cpp index 0d1fe0a52b..8814da9d87 100644 --- a/src/video_core/macro.cpp +++ b/src/video_core/macro.cpp @@ -22,6 +22,14 @@ #pragma clang diagnostic ignored "-Wshadow" #endif #include + +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + #endif #include "common/assert.h" From 77feee7a7b08dd39ed04a9c3f1654d7a0a12a1ae Mon Sep 17 00:00:00 2001 From: lizzie Date: Fri, 16 Jan 2026 03:27:08 +0000 Subject: [PATCH 02/78] fuck you --- src/video_core/macro.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/video_core/macro.cpp b/src/video_core/macro.cpp index 8814da9d87..0d1fe0a52b 100644 --- a/src/video_core/macro.cpp +++ b/src/video_core/macro.cpp @@ -22,14 +22,6 @@ #pragma clang diagnostic ignored "-Wshadow" #endif #include - -#ifdef __GNUC__ -#pragma GCC diagnostic pop -#endif -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - #endif #include "common/assert.h" From 4e9764f42a74183b155778a1cabb455c1bf7b9fe Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 3 Jan 2026 21:13:42 +0000 Subject: [PATCH 03/78] toolchain-fix --- .ci/ps4/build.sh | 52 ++++++++++++++++++++++++++++++++++++++++++++++++ .gitignore | 3 +++ docs/Caveats.md | 8 ++++++++ 3 files changed, 63 insertions(+) create mode 100755 .ci/ps4/build.sh diff --git a/.ci/ps4/build.sh b/.ci/ps4/build.sh new file mode 100755 index 0000000000..f51056262e --- /dev/null +++ b/.ci/ps4/build.sh @@ -0,0 +1,52 @@ +#!/usr/local/bin/bash -ex + +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + +cat << EOF >"ps4-toolchain.cmake" +set(CMAKE_SYSROOT "$OO_PS4_TOOLCHAIN") + +set(CMAKE_C_FLAGS "--target=x86_64-pc-freebsd12-elf -funwind-tables -fuse-ld=ldd") +set(CMAKE_CXX_FLAGS "--target=x86_64-pc-freebsd12-elf -funwind-tables -fuse-ld=lld") + +set(CMAKE_EXE_LINKER_FLAGS "-m elf_x86_64 -pie --script $OO_PS4_TOOLCHAIN/link.x --eh-frame-hdr -L$OO_PS4_TOOLCHAIN/lib -lc -lkernel -lc++ -lSceUserService -lSceVideoOut -lSceAudioOut -lScePad -lSceSysmodule -lSceFreeType $OO_PS4_TOOLCHAIN/lib/crt1.o") +set(CMAKE_C_LINK_FLAGS "-m elf_x86_64 -pie --script $OO_PS4_TOOLCHAIN/link.x --eh-frame-hdr -L$OO_PS4_TOOLCHAIN/lib -lc -lkernel -lSceUserService -lSceVideoOut -lSceAudioOut -lScePad -lSceSysmodule -lSceFreeType $OO_PS4_TOOLCHAIN/lib/crt1.o") +set(CMAKE_CXX_LINK_FLAGS "-m elf_x86_64 -pie --script $OO_PS4_TOOLCHAIN/link.x --eh-frame-hdr -L$OO_PS4_TOOLCHAIN/lib -lc -lkernel -lc++ -lSceUserService -lSceVideoOut -lSceAudioOut -lScePad -lSceSysmodule -lSceFreeType $OO_PS4_TOOLCHAIN/lib/crt1.o") + +set(CMAKE_C_COMPILER clang) +set(CMAKE_CXX_COMPILER clang++) +set(CMAKE_LINKER ld.lld) +set(CMAKE_C_LINK_EXECUTABLE " -o ") +set(CMAKE_CXX_LINK_EXECUTABLE " -o ") + +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) +EOF + +export ARCH_FLAGS="$ARCH_FLAGS -O3" +if [ -z "$NPROC" ]; then + NPROC="$(nproc)" +fi + +# Normally a platform has a package manager +# PS4 does not, atleast not in the normal sense +export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" $@) +mkdir -p build +cd build && cmake .. -G Ninja \ + -DCMAKE_TOOLCHAIN_FILE="ps4-toolchain.cmake" \ + -DENABLE_QT_TRANSLATION=OFF \ + -DUSE_DISCORD_PRESENCE=OFF \ + -DENABLE_CUBEB=OFF \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_CXX_FLAGS="$ARCH_FLAGS" \ + -DCMAKE_C_FLAGS="$ARCH_FLAGS" \ + -DENABLE_SDL2=OFF \ + -DENABLE_QT=OFF \ + -DENABLE_OPENSSL=OFF \ + -DCPMUTIL_FORCE_BUNDLED=ON \ + -DYUZU_USE_CPM=ON \ + "${EXTRA_CMAKE_FLAGS[@]}" || exit + +cd build && ninja -j${NPROC} || exit diff --git a/.gitignore b/.gitignore index 67bdd8adf4..b304411646 100644 --- a/.gitignore +++ b/.gitignore @@ -64,3 +64,6 @@ artifacts /install* vulkansdk*.exe *.tar.zst + +# PS4 toolchain stuff +ps4-toolchain.cmake diff --git a/docs/Caveats.md b/docs/Caveats.md index d554f3ff77..a4b5a2a351 100644 --- a/docs/Caveats.md +++ b/docs/Caveats.md @@ -11,6 +11,7 @@ - [NetBSD](#netbsd) - [MSYS2](#msys2) - [RedoxOS](#redoxos) +- [PlayStation 4](#playstation-4) - [Windows](#windows) - [Windows 7, Windows 8 and Windows 8.1](#windows-7-windows-8-and-windows-81) - [Windows Vista and below](#windows-vista-and-below) @@ -220,6 +221,13 @@ The package install may randomly hang at times, in which case it has to be resta When CMake invokes certain file syscalls - it may sometimes cause crashes or corruptions on the (kernel?) address space - so reboot the system if there is a "hang" in CMake. +## PlayStation 4 + +```sh +export OO_PS4_TOOLCHAIN="$HOME/OpenOrbis/PS4Toolchain" +export DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1 +``` + ## Windows ### Windows 7, Windows 8 and Windows 8.1 From d97c3b25a0b0fa853f57590e2f5adff98cb1233c Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 29 Nov 2025 22:53:31 +0000 Subject: [PATCH 04/78] fix --- .ci/ps4/build.sh | 17 ++-- CMakeModules/GenerateSCMRev.cmake | 5 +- externals/ffmpeg/CMakeLists.txt | 146 +++++++++++++++++------------- 3 files changed, 97 insertions(+), 71 deletions(-) diff --git a/.ci/ps4/build.sh b/.ci/ps4/build.sh index f51056262e..87fd00a470 100755 --- a/.ci/ps4/build.sh +++ b/.ci/ps4/build.sh @@ -6,8 +6,8 @@ cat << EOF >"ps4-toolchain.cmake" set(CMAKE_SYSROOT "$OO_PS4_TOOLCHAIN") -set(CMAKE_C_FLAGS "--target=x86_64-pc-freebsd12-elf -funwind-tables -fuse-ld=ldd") -set(CMAKE_CXX_FLAGS "--target=x86_64-pc-freebsd12-elf -funwind-tables -fuse-ld=lld") +set(CMAKE_C_FLAGS "-D_LIBCPP_HAS_MUSL_LIBC=1 -D_GNU_SOURCE=1 --target=x86_64-pc-freebsd12-elf -funwind-tables -isystem $OO_PS4_TOOLCHAIN/include -isystem $OO_PS4_TOOLCHAIN/include/c++/v1") +set(CMAKE_CXX_FLAGS "-D_LIBCPP_HAS_MUSL_LIBC=1 -D_GNU_SOURCE=1 --target=x86_64-pc-freebsd12-elf -funwind-tables -isystem $OO_PS4_TOOLCHAIN/include -isystem $OO_PS4_TOOLCHAIN/include/c++/v1") set(CMAKE_EXE_LINKER_FLAGS "-m elf_x86_64 -pie --script $OO_PS4_TOOLCHAIN/link.x --eh-frame-hdr -L$OO_PS4_TOOLCHAIN/lib -lc -lkernel -lc++ -lSceUserService -lSceVideoOut -lSceAudioOut -lScePad -lSceSysmodule -lSceFreeType $OO_PS4_TOOLCHAIN/lib/crt1.o") set(CMAKE_C_LINK_FLAGS "-m elf_x86_64 -pie --script $OO_PS4_TOOLCHAIN/link.x --eh-frame-hdr -L$OO_PS4_TOOLCHAIN/lib -lc -lkernel -lSceUserService -lSceVideoOut -lSceAudioOut -lScePad -lSceSysmodule -lSceFreeType $OO_PS4_TOOLCHAIN/lib/crt1.o") @@ -23,6 +23,9 @@ set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + +# TODO: Why does cmake not set this? +set(CMAKE_SIZEOF_VOID_P 8) EOF export ARCH_FLAGS="$ARCH_FLAGS -O3" @@ -34,10 +37,10 @@ fi # PS4 does not, atleast not in the normal sense export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" $@) mkdir -p build -cd build && cmake .. -G Ninja \ +cd build +cmake .. -G Ninja \ -DCMAKE_TOOLCHAIN_FILE="ps4-toolchain.cmake" \ -DENABLE_QT_TRANSLATION=OFF \ - -DUSE_DISCORD_PRESENCE=OFF \ -DENABLE_CUBEB=OFF \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_CXX_FLAGS="$ARCH_FLAGS" \ @@ -45,8 +48,10 @@ cd build && cmake .. -G Ninja \ -DENABLE_SDL2=OFF \ -DENABLE_QT=OFF \ -DENABLE_OPENSSL=OFF \ + -DENABLE_WEB_SERVICE=OFF \ + -DUSE_DISCORD_PRESENCE=OFF \ -DCPMUTIL_FORCE_BUNDLED=ON \ + -DYUZU_USE_EXTERNAL_FFMPEG=ON \ -DYUZU_USE_CPM=ON \ "${EXTRA_CMAKE_FLAGS[@]}" || exit - -cd build && ninja -j${NPROC} || exit +ninja -j${NPROC} || exit diff --git a/CMakeModules/GenerateSCMRev.cmake b/CMakeModules/GenerateSCMRev.cmake index 5b0adad8dd..0c8c9cedec 100644 --- a/CMakeModules/GenerateSCMRev.cmake +++ b/CMakeModules/GenerateSCMRev.cmake @@ -18,10 +18,13 @@ if (DEFINED GIT_RELEASE) set(BUILD_VERSION "${GIT_TAG}") set(GIT_REFSPEC "${GIT_RELEASE}") set(IS_DEV_BUILD false) -else() +elseif(DEFINED GIT_COMMIT) string(SUBSTRING ${GIT_COMMIT} 0 10 BUILD_VERSION) set(BUILD_VERSION "${BUILD_VERSION}-${GIT_REFSPEC}") set(IS_DEV_BUILD true) +else() + set(BUILD_VERSION "NoGitInfo") + set(IS_DEV_BUILD true) endif() if (NIGHTLY_BUILD) diff --git a/externals/ffmpeg/CMakeLists.txt b/externals/ffmpeg/CMakeLists.txt index 3140f8e545..dd3c6f36c6 100644 --- a/externals/ffmpeg/CMakeLists.txt +++ b/externals/ffmpeg/CMakeLists.txt @@ -11,63 +11,98 @@ set(FFmpeg_HWACCEL_FLAGS) set(FFmpeg_HWACCEL_INCLUDE_DIRS) set(FFmpeg_HWACCEL_LDFLAGS) -if (UNIX AND NOT ANDROID) - find_package(PkgConfig REQUIRED) - if (NOT ANDROID) - pkg_check_modules(LIBVA libva) - pkg_check_modules(CUDA cuda) - pkg_check_modules(FFNVCODEC ffnvcodec) - pkg_check_modules(VDPAU vdpau) +if (NOT YUZU_USE_BUNDLED_FFMPEG) + set(FFmpeg_CROSS_COMPILE_FLAGS "") + if (ANDROID) + # TODO: Maybe use CMAKE_SYSROOT? and probably provide a toolchain file for android + # I mean isn't that the "proper" way anyways? + string(TOLOWER "${CMAKE_HOST_SYSTEM_NAME}" FFmpeg_HOST_SYSTEM_NAME) + set(TOOLCHAIN "${ANDROID_NDK}/toolchains/llvm/prebuilt/${FFmpeg_HOST_SYSTEM_NAME}-${CMAKE_HOST_SYSTEM_PROCESSOR}") + set(SYSROOT "${TOOLCHAIN}/sysroot") + set(FFmpeg_CPU "armv8-a") + list(APPEND FFmpeg_CROSS_COMPILE_FLAGS + --enable-cross-compile + --arch=arm64 + #--cpu=${FFmpeg_CPU} + --cross-prefix="${TOOLCHAIN}/bin/aarch64-linux-android-" + --sysroot="${SYSROOT}" + --target-os=android + --extra-ldflags="--ld-path=${TOOLCHAIN}/bin/ld.lld" + --extra-ldflags="-nostdlib" + ) + set(FFmpeg_IS_CROSS_COMPILING TRUE) + # User attempts to do a FFmpeg cross compilation because... + # Here we just quickly test against host/system processors not matching + # TODO: Test for versions not matching as well? + elseif (NOT (CMAKE_HOST_SYSTEM_PROCESSOR MATCHES CMAKE_SYSTEM_PROCESSOR + AND CMAKE_HOST_SYSTEM_NAME MATCHES CMAKE_SYSTEM_NAME)) + string(TOLOWER "${CMAKE_SYSTEM_NAME}" FFmpeg_SYSTEM_NAME) + # TODO: Can we really do better? Auto-detection? Something clever? + if (NOT DEFINED FFmpeg_CROSS_PREFIX) + message(ERROR "Please set FFmpeg_CROSS_PREFIX to your cross toolchain prefix, for example: \${CMAKE_STAGING_PREFIX}/bin/${CMAKE_SYSTEM_PROCESSOR}-${CMAKE_SYSTEM_NAME}-") + endif() + list(APPEND FFmpeg_CROSS_COMPILE_FLAGS + --enable-cross-compile + --arch="${CMAKE_SYSTEM_PROCESSOR}" + --target-os="${FFmpeg_SYSTEM_NAME}" + --sysroot="${CMAKE_SYSROOT}" + --cross-prefix="${FFmpeg_CROSS_PREFIX}" + ) + set(FFmpeg_IS_CROSS_COMPILING TRUE) endif() +endif() - if (NOT APPLE) - # In Solaris needs explicit linking for ffmpeg which links to /lib/amd64/libX11.so - if(PLATFORM_SUN) - find_library(LIBDRM_LIB libdrm PATHS /usr/lib/64 /usr/lib/amd64 /usr/lib) - if(LIBDRM_LIB) +if (UNIX AND NOT DEFINED FFmpeg_IS_CROSS_COMPILING) + find_package(PkgConfig REQUIRED) + pkg_check_modules(LIBVA libva) + pkg_check_modules(CUDA cuda) + pkg_check_modules(FFNVCODEC ffnvcodec) + pkg_check_modules(VDPAU vdpau) + + find_package(X11) + if(X11_FOUND) + if (NOT APPLE) + # In Solaris needs explicit linking for ffmpeg which links to /lib/amd64/libX11.so + if(PLATFORM_SUN) list(APPEND FFmpeg_HWACCEL_LIBRARIES X11 - "${LIBDRM_LIB}") - message(STATUS "Found libdrm at: ${LIBDRM_LIB}") + "${CMAKE_SYSROOT}/usr/lib/xorg/amd64/libdrm.so") else() - message(WARNING "libdrm not found, disabling libdrm support") - list(APPEND FFmpeg_HWACCEL_FLAGS - --disable-libdrm) + pkg_check_modules(LIBDRM libdrm REQUIRED) + list(APPEND FFmpeg_HWACCEL_LIBRARIES + ${LIBDRM_LIBRARIES}) + list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS + ${LIBDRM_INCLUDE_DIRS}) endif() - else() - pkg_check_modules(LIBDRM libdrm REQUIRED) - list(APPEND FFmpeg_HWACCEL_LIBRARIES - ${LIBDRM_LIBRARIES}) - list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS - ${LIBDRM_INCLUDE_DIRS}) list(APPEND FFmpeg_HWACCEL_FLAGS --enable-libdrm) endif() - endif() - - if(LIBVA_FOUND) - find_package(X11 REQUIRED) - pkg_check_modules(LIBVA-DRM libva-drm REQUIRED) - pkg_check_modules(LIBVA-X11 libva-x11 REQUIRED) - list(APPEND FFmpeg_HWACCEL_LIBRARIES - ${X11_LIBRARIES} - ${LIBVA-DRM_LIBRARIES} - ${LIBVA-X11_LIBRARIES} - ${LIBVA_LIBRARIES}) - list(APPEND FFmpeg_HWACCEL_FLAGS - --enable-hwaccel=h264_vaapi - --enable-hwaccel=vp8_vaapi - --enable-hwaccel=vp9_vaapi) - list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS - ${X11_INCLUDE_DIRS} - ${LIBVA-DRM_INCLUDE_DIRS} - ${LIBVA-X11_INCLUDE_DIRS} - ${LIBVA_INCLUDE_DIRS} - ) - message(STATUS "ffmpeg: va-api libraries version ${LIBVA_VERSION} found") + if(LIBVA_FOUND) + pkg_check_modules(LIBVA-DRM libva-drm REQUIRED) + pkg_check_modules(LIBVA-X11 libva-x11 REQUIRED) + list(APPEND FFmpeg_HWACCEL_LIBRARIES + ${X11_LIBRARIES} + ${LIBVA-DRM_LIBRARIES} + ${LIBVA-X11_LIBRARIES} + ${LIBVA_LIBRARIES}) + list(APPEND FFmpeg_HWACCEL_FLAGS + --enable-hwaccel=h264_vaapi + --enable-hwaccel=vp8_vaapi + --enable-hwaccel=vp9_vaapi) + list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS + ${X11_INCLUDE_DIRS} + ${LIBVA-DRM_INCLUDE_DIRS} + ${LIBVA-X11_INCLUDE_DIRS} + ${LIBVA_INCLUDE_DIRS} + ) + message(STATUS "ffmpeg: va-api libraries version ${LIBVA_VERSION} found") + else() + list(APPEND FFmpeg_HWACCEL_FLAGS --disable-vaapi) + message(WARNING "ffmpeg: libva-dev not found, disabling Video Acceleration API (VA-API)...") + endif() else() list(APPEND FFmpeg_HWACCEL_FLAGS --disable-vaapi) - message(WARNING "ffmpeg: libva-dev not found, disabling Video Acceleration API (VA-API)...") + message(WARNING "ffmpeg: X11 libraries not found, disabling VA-API...") endif() if (FFNVCODEC_FOUND) @@ -181,24 +216,6 @@ else() find_program(BASH_PROGRAM bash REQUIRED) - set(FFmpeg_CROSS_COMPILE_FLAGS "") - if (ANDROID) - string(TOLOWER "${CMAKE_HOST_SYSTEM_NAME}" FFmpeg_HOST_SYSTEM_NAME) - set(TOOLCHAIN "${ANDROID_NDK}/toolchains/llvm/prebuilt/${FFmpeg_HOST_SYSTEM_NAME}-${CMAKE_HOST_SYSTEM_PROCESSOR}") - set(SYSROOT "${TOOLCHAIN}/sysroot") - set(FFmpeg_CPU "armv8-a") - list(APPEND FFmpeg_CROSS_COMPILE_FLAGS - --arch=arm64 - #--cpu=${FFmpeg_CPU} - --enable-cross-compile - --cross-prefix=${TOOLCHAIN}/bin/aarch64-linux-android- - --sysroot=${SYSROOT} - --target-os=android - --extra-ldflags="--ld-path=${TOOLCHAIN}/bin/ld.lld" - --extra-ldflags="-nostdlib" - ) - endif() - # `configure` parameters builds only exactly what yuzu needs from FFmpeg # `--disable-vdpau` is needed to avoid linking issues set(FFmpeg_CC ${CMAKE_C_COMPILER_LAUNCHER} ${CMAKE_C_COMPILER}) @@ -223,6 +240,7 @@ else() --enable-pic --cc="${FFmpeg_CC}" --cxx="${FFmpeg_CXX}" + ${FFmpeg_CROSS_COMPILE_FLAG} ${FFmpeg_HWACCEL_FLAGS} ${FFmpeg_CROSS_COMPILE_FLAGS} WORKING_DIRECTORY From 75ae6de81ec53e517e0f6f5c1e9c996a7ca5c639 Mon Sep 17 00:00:00 2001 From: lizzie Date: Fri, 5 Dec 2025 03:49:26 +0000 Subject: [PATCH 05/78] merge --- .ci/ps4/build.sh | 20 ++++++++++---------- .patch/boost/0004-openorbis.patch | 17 +++++++++++++++++ .patch/enet/0001-openorbis.patch | 13 +++++++++++++ .patch/mbedtls/0002-aesni-fix.patch | 13 +++++++++++++ .patch/spirv-tools/0003-openorbis.patch | 25 +++++++++++++++++++++++++ cpmfile.json | 3 ++- externals/cpmfile.json | 6 +++++- externals/ffmpeg/CMakeLists.txt | 5 ++++- src/common/memory_detect.cpp | 4 ++-- 9 files changed, 91 insertions(+), 15 deletions(-) create mode 100644 .patch/boost/0004-openorbis.patch create mode 100644 .patch/enet/0001-openorbis.patch create mode 100644 .patch/mbedtls/0002-aesni-fix.patch create mode 100644 .patch/spirv-tools/0003-openorbis.patch diff --git a/.ci/ps4/build.sh b/.ci/ps4/build.sh index 87fd00a470..b80e2a2e6f 100755 --- a/.ci/ps4/build.sh +++ b/.ci/ps4/build.sh @@ -3,15 +3,17 @@ # SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later -cat << EOF >"ps4-toolchain.cmake" +OO_PS4_TOOLCHAIN="/home/xerix/src/ps4-sdk/prefix" + +[ -f "ps4-toolchain.cmake" ] || cat << EOF >"ps4-toolchain.cmake" set(CMAKE_SYSROOT "$OO_PS4_TOOLCHAIN") -set(CMAKE_C_FLAGS "-D_LIBCPP_HAS_MUSL_LIBC=1 -D_GNU_SOURCE=1 --target=x86_64-pc-freebsd12-elf -funwind-tables -isystem $OO_PS4_TOOLCHAIN/include -isystem $OO_PS4_TOOLCHAIN/include/c++/v1") -set(CMAKE_CXX_FLAGS "-D_LIBCPP_HAS_MUSL_LIBC=1 -D_GNU_SOURCE=1 --target=x86_64-pc-freebsd12-elf -funwind-tables -isystem $OO_PS4_TOOLCHAIN/include -isystem $OO_PS4_TOOLCHAIN/include/c++/v1") +set(CMAKE_C_FLAGS "-D_LIBCPP_HAS_MUSL_LIBC=1 -D_GNU_SOURCE=1 --target=x86_64-pc-freebsd12-elf -mtune=x86-64 -march=x86-64 -funwind-tables -nostdinc -isystem $OO_PS4_TOOLCHAIN/include/c++/v1 -isystem $OO_PS4_TOOLCHAIN/include") +set(CMAKE_CXX_FLAGS "-D_LIBCPP_HAS_MUSL_LIBC=1 -D_GNU_SOURCE=1 --target=x86_64-pc-freebsd12-elf -mtune=x86-64 -march=x86-64 -funwind-tables -nostdinc -isystem $OO_PS4_TOOLCHAIN/include/c++/v1 -isystem $OO_PS4_TOOLCHAIN/include") -set(CMAKE_EXE_LINKER_FLAGS "-m elf_x86_64 -pie --script $OO_PS4_TOOLCHAIN/link.x --eh-frame-hdr -L$OO_PS4_TOOLCHAIN/lib -lc -lkernel -lc++ -lSceUserService -lSceVideoOut -lSceAudioOut -lScePad -lSceSysmodule -lSceFreeType $OO_PS4_TOOLCHAIN/lib/crt1.o") -set(CMAKE_C_LINK_FLAGS "-m elf_x86_64 -pie --script $OO_PS4_TOOLCHAIN/link.x --eh-frame-hdr -L$OO_PS4_TOOLCHAIN/lib -lc -lkernel -lSceUserService -lSceVideoOut -lSceAudioOut -lScePad -lSceSysmodule -lSceFreeType $OO_PS4_TOOLCHAIN/lib/crt1.o") -set(CMAKE_CXX_LINK_FLAGS "-m elf_x86_64 -pie --script $OO_PS4_TOOLCHAIN/link.x --eh-frame-hdr -L$OO_PS4_TOOLCHAIN/lib -lc -lkernel -lc++ -lSceUserService -lSceVideoOut -lSceAudioOut -lScePad -lSceSysmodule -lSceFreeType $OO_PS4_TOOLCHAIN/lib/crt1.o") +set(CMAKE_EXE_LINKER_FLAGS "-m elf_x86_64 -pie --script $OO_PS4_TOOLCHAIN/link.x --eh-frame-hdr -L$OO_PS4_TOOLCHAIN/lib") +set(CMAKE_C_LINK_FLAGS "-lc -lkernel -lSceUserService -lSceVideoOut -lSceAudioOut -lScePad -lSceSysmodule -lSceFreeType $OO_PS4_TOOLCHAIN/lib/crt1.o") +set(CMAKE_CXX_LINK_FLAGS " -lc++") set(CMAKE_C_COMPILER clang) set(CMAKE_CXX_COMPILER clang++) @@ -36,9 +38,7 @@ fi # Normally a platform has a package manager # PS4 does not, atleast not in the normal sense export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" $@) -mkdir -p build -cd build -cmake .. -G Ninja \ +cmake -S . -B build -G Ninja \ -DCMAKE_TOOLCHAIN_FILE="ps4-toolchain.cmake" \ -DENABLE_QT_TRANSLATION=OFF \ -DENABLE_CUBEB=OFF \ @@ -54,4 +54,4 @@ cmake .. -G Ninja \ -DYUZU_USE_EXTERNAL_FFMPEG=ON \ -DYUZU_USE_CPM=ON \ "${EXTRA_CMAKE_FLAGS[@]}" || exit -ninja -j${NPROC} || exit +cmake --build build --parallel diff --git a/.patch/boost/0004-openorbis.patch b/.patch/boost/0004-openorbis.patch new file mode 100644 index 0000000000..c027956500 --- /dev/null +++ b/.patch/boost/0004-openorbis.patch @@ -0,0 +1,17 @@ +diff --git a/libs/asio/include/boost/asio/detail/impl/socket_ops.ipp b/libs/asio/include/boost/asio/detail/impl/socket_ops.ipp +index 0129511c..10fc9b04 100644 +--- a/libs/asio/include/boost/asio/detail/impl/socket_ops.ipp ++++ b/libs/asio/include/boost/asio/detail/impl/socket_ops.ipp +@@ -15,6 +15,12 @@ + # pragma once + #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + ++// hacky fix for ps4 ++#if defined(_LIBCPP_HAS_MUSL_LIBC) ++# define FIONBIO 0 ++# define FIONREAD 1 ++#endif ++ + #include + + #include diff --git a/.patch/enet/0001-openorbis.patch b/.patch/enet/0001-openorbis.patch new file mode 100644 index 0000000000..4e6dab279e --- /dev/null +++ b/.patch/enet/0001-openorbis.patch @@ -0,0 +1,13 @@ +diff --git a/unix.c b/unix.c +index 6669216..86a2faa 100644 +--- a/unix.c ++++ b/unix.c +@@ -53,7 +53,7 @@ + #include + #endif + +-#if !defined(HAS_SOCKLEN_T) && !defined(__socklen_t_defined) ++#if !defined(_LIBCPP_HAS_MUSL_LIBC) && !defined(HAS_SOCKLEN_T) && !defined(__socklen_t_defined) + typedef int socklen_t; + #endif + diff --git a/.patch/mbedtls/0002-aesni-fix.patch b/.patch/mbedtls/0002-aesni-fix.patch new file mode 100644 index 0000000000..5112ded892 --- /dev/null +++ b/.patch/mbedtls/0002-aesni-fix.patch @@ -0,0 +1,13 @@ +diff --git a/library/aesni.h b/library/aesni.h +index 754c984c79..59e27afd3e 100644 +--- a/library/aesni.h ++++ b/library/aesni.h +@@ -35,7 +35,7 @@ + /* GCC-like compilers: currently, we only support intrinsics if the requisite + * target flag is enabled when building the library (e.g. `gcc -mpclmul -msse2` + * or `clang -maes -mpclmul`). */ +-#if (defined(__GNUC__) || defined(__clang__)) && defined(__AES__) && defined(__PCLMUL__) ++#if (defined(__GNUC__) || defined(__clang__)) && !defined(_LIBCPP_HAS_MUSL_LIBC) + #define MBEDTLS_AESNI_HAVE_INTRINSICS + #endif + /* For 32-bit, we only support intrinsics */ diff --git a/.patch/spirv-tools/0003-openorbis.patch b/.patch/spirv-tools/0003-openorbis.patch new file mode 100644 index 0000000000..f2c19d893f --- /dev/null +++ b/.patch/spirv-tools/0003-openorbis.patch @@ -0,0 +1,25 @@ +diff --git a/source/opt/loop_dependence.cpp b/source/opt/loop_dependence.cpp +index e41c044..a51b53b 100644 +--- a/source/opt/loop_dependence.cpp ++++ b/source/opt/loop_dependence.cpp +@@ -12,6 +12,12 @@ + // See the License for the specific language governing permissions and + // limitations under the License. + ++// PS4: issue? ++#ifdef __PS4__ ++#pragma clang diagnostic ignored "-Wabsolute-value" ++#pragma clang diagnostic ignored "-Wshorten-64-to-32" ++#endif ++ + #include "source/opt/loop_dependence.h" + + #include +@@ -19,6 +25,7 @@ + #include + #include + #include ++#include + + #include "source/opt/instruction.h" + #include "source/opt/scalar_analysis_nodes.h" diff --git a/cpmfile.json b/cpmfile.json index c938e67e88..e9884910a5 100644 --- a/cpmfile.json +++ b/cpmfile.json @@ -17,7 +17,8 @@ "version": "1.57", "find_args": "CONFIG OPTIONAL_COMPONENTS headers context system fiber filesystem", "patches": [ - "0001-clang-cl.patch" + "0001-clang-cl.patch", + "0004-openorbis.patch" ] }, "fmt": { diff --git a/externals/cpmfile.json b/externals/cpmfile.json index de024fd40e..7e2a9c58a5 100644 --- a/externals/cpmfile.json +++ b/externals/cpmfile.json @@ -98,7 +98,10 @@ "hash": "a0d2fa8c957704dd49e00a726284ac5ca034b50b00d2b20a94fa1bbfbb80841467834bfdc84aa0ed0d6aab894608fd6c86c3b94eee46343f0e6d9c22e391dbf9", "version": "1.3", "git_version": "1.3.18", - "find_args": "MODULE" + "find_args": "MODULE", + "patches": [ + "0001-openorbis.patch" + ] }, "spirv-tools": { "package": "SPIRV-Tools", @@ -112,6 +115,7 @@ "patches": [ "0001-netbsd-fix.patch", "0002-allow-static-only.patch" + "0003-openorbis.patch" ] }, "spirv-headers": { diff --git a/externals/ffmpeg/CMakeLists.txt b/externals/ffmpeg/CMakeLists.txt index dd3c6f36c6..336427450c 100644 --- a/externals/ffmpeg/CMakeLists.txt +++ b/externals/ffmpeg/CMakeLists.txt @@ -240,7 +240,10 @@ else() --enable-pic --cc="${FFmpeg_CC}" --cxx="${FFmpeg_CXX}" - ${FFmpeg_CROSS_COMPILE_FLAG} + --ld="${CMAKE_LINKER}" + --ldflags="${CMAKE_C_LINK_FLAGS}" + --cflags="${CMAKE_C_FLAGS}" + --cxxflags="${CMAKE_CXX_FLAGS}" ${FFmpeg_HWACCEL_FLAGS} ${FFmpeg_CROSS_COMPILE_FLAGS} WORKING_DIRECTORY diff --git a/src/common/memory_detect.cpp b/src/common/memory_detect.cpp index 86a3abcc6d..a8e43a1e4b 100644 --- a/src/common/memory_detect.cpp +++ b/src/common/memory_detect.cpp @@ -8,7 +8,7 @@ // clang-format on #else #include -#if defined(__APPLE__) || defined(__FreeBSD__) +#if defined(__APPLE__) || (defined(__FreeBSD__) && !defined(_LIBCPP_HAS_MUSL_LIBC)) #include #elif defined(__linux__) #include @@ -43,7 +43,7 @@ static MemoryInfo Detect() { sysctlbyname("vm.swapusage", &vmusage, &sizeof_vmusage, nullptr, 0); mem_info.TotalPhysicalMemory = ramsize; mem_info.TotalSwapMemory = vmusage.xsu_total; -#elif defined(__FreeBSD__) +#elif defined(__FreeBSD__) && !defined(_LIBCPP_HAS_MUSL_LIBC) u_long physmem, swap_total; std::size_t sizeof_u_long = sizeof(u_long); // sysctlbyname(const char *, void *, size_t *, const void *, size_t); From 8f810a2f1ba62b06ef11e42a185ff5fa89472771 Mon Sep 17 00:00:00 2001 From: lizzie Date: Fri, 5 Dec 2025 03:49:45 +0000 Subject: [PATCH 06/78] merge --- .ci/ps4/build.sh | 18 +++++++++--------- .patch/boost/0004-openorbis.patch | 2 +- .patch/enet/0001-openorbis.patch | 2 +- .patch/mbedtls/0002-aesni-fix.patch | 2 +- externals/ffmpeg/CMakeLists.txt | 13 ++++++++++--- src/common/memory_detect.cpp | 4 ++-- .../backend/exception_handler_posix.cpp | 17 +++++++++++++---- src/dynarmic/src/dynarmic/common/context.h | 10 +++++----- 8 files changed, 42 insertions(+), 26 deletions(-) diff --git a/.ci/ps4/build.sh b/.ci/ps4/build.sh index b80e2a2e6f..3b2f6e5481 100755 --- a/.ci/ps4/build.sh +++ b/.ci/ps4/build.sh @@ -3,23 +3,23 @@ # SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later -OO_PS4_TOOLCHAIN="/home/xerix/src/ps4-sdk/prefix" - [ -f "ps4-toolchain.cmake" ] || cat << EOF >"ps4-toolchain.cmake" set(CMAKE_SYSROOT "$OO_PS4_TOOLCHAIN") +set(CMAKE_STAGING_PREFIX "$OO_PS4_TOOLCHAIN") +set(CMAKE_SYSTEM_NAME "OpenOrbis") -set(CMAKE_C_FLAGS "-D_LIBCPP_HAS_MUSL_LIBC=1 -D_GNU_SOURCE=1 --target=x86_64-pc-freebsd12-elf -mtune=x86-64 -march=x86-64 -funwind-tables -nostdinc -isystem $OO_PS4_TOOLCHAIN/include/c++/v1 -isystem $OO_PS4_TOOLCHAIN/include") -set(CMAKE_CXX_FLAGS "-D_LIBCPP_HAS_MUSL_LIBC=1 -D_GNU_SOURCE=1 --target=x86_64-pc-freebsd12-elf -mtune=x86-64 -march=x86-64 -funwind-tables -nostdinc -isystem $OO_PS4_TOOLCHAIN/include/c++/v1 -isystem $OO_PS4_TOOLCHAIN/include") +set(CMAKE_C_FLAGS " -D__OPENORBIS__ -D_LIBCPP_HAS_MUSL_LIBC=1 -D_GNU_SOURCE=1 --target=x86_64-pc-freebsd12-elf -mtune=x86-64 -march=x86-64 -funwind-tables") +set(CMAKE_CXX_FLAGS " -D__OPENORBIS__ -D_LIBCPP_HAS_MUSL_LIBC=1 -D_GNU_SOURCE=1 --target=x86_64-pc-freebsd12-elf -mtune=x86-64 -march=x86-64 -funwind-tables") -set(CMAKE_EXE_LINKER_FLAGS "-m elf_x86_64 -pie --script $OO_PS4_TOOLCHAIN/link.x --eh-frame-hdr -L$OO_PS4_TOOLCHAIN/lib") -set(CMAKE_C_LINK_FLAGS "-lc -lkernel -lSceUserService -lSceVideoOut -lSceAudioOut -lScePad -lSceSysmodule -lSceFreeType $OO_PS4_TOOLCHAIN/lib/crt1.o") -set(CMAKE_CXX_LINK_FLAGS " -lc++") +set(CMAKE_EXE_LINKER_FLAGS "-T $OO_PS4_TOOLCHAIN/link.x -L$OO_PS4_TOOLCHAIN/lib") +set(CMAKE_C_LINK_FLAGS "-T $OO_PS4_TOOLCHAIN/link.x -L$OO_PS4_TOOLCHAIN/lib") +set(CMAKE_CXX_LINK_FLAGS "-T $OO_PS4_TOOLCHAIN/link.x -L$OO_PS4_TOOLCHAIN/lib") set(CMAKE_C_COMPILER clang) set(CMAKE_CXX_COMPILER clang++) set(CMAKE_LINKER ld.lld) -set(CMAKE_C_LINK_EXECUTABLE " -o ") -set(CMAKE_CXX_LINK_EXECUTABLE " -o ") +set(CMAKE_C_LINK_EXECUTABLE " -o -lc -lkernel -lSceUserService -lSceSysmodule -lSceNet $OO_PS4_TOOLCHAIN/lib/crt1.o") +set(CMAKE_CXX_LINK_EXECUTABLE " -o -lc -lkernel -lunwind -lc++ -lc++abi -lc++experimental -lrt -lSceUserService -lSceSysmodule -lSceNet $OO_PS4_TOOLCHAIN/lib/crt1.o") set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) diff --git a/.patch/boost/0004-openorbis.patch b/.patch/boost/0004-openorbis.patch index c027956500..09071b599c 100644 --- a/.patch/boost/0004-openorbis.patch +++ b/.patch/boost/0004-openorbis.patch @@ -7,7 +7,7 @@ index 0129511c..10fc9b04 100644 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) +// hacky fix for ps4 -+#if defined(_LIBCPP_HAS_MUSL_LIBC) ++#if defined(__OPENORBIS__) +# define FIONBIO 0 +# define FIONREAD 1 +#endif diff --git a/.patch/enet/0001-openorbis.patch b/.patch/enet/0001-openorbis.patch index 4e6dab279e..744e2f879d 100644 --- a/.patch/enet/0001-openorbis.patch +++ b/.patch/enet/0001-openorbis.patch @@ -7,7 +7,7 @@ index 6669216..86a2faa 100644 #endif -#if !defined(HAS_SOCKLEN_T) && !defined(__socklen_t_defined) -+#if !defined(_LIBCPP_HAS_MUSL_LIBC) && !defined(HAS_SOCKLEN_T) && !defined(__socklen_t_defined) ++#if !defined(__OPENORBIS__) && !defined(HAS_SOCKLEN_T) && !defined(__socklen_t_defined) typedef int socklen_t; #endif diff --git a/.patch/mbedtls/0002-aesni-fix.patch b/.patch/mbedtls/0002-aesni-fix.patch index 5112ded892..e9a1bce5e6 100644 --- a/.patch/mbedtls/0002-aesni-fix.patch +++ b/.patch/mbedtls/0002-aesni-fix.patch @@ -7,7 +7,7 @@ index 754c984c79..59e27afd3e 100644 * target flag is enabled when building the library (e.g. `gcc -mpclmul -msse2` * or `clang -maes -mpclmul`). */ -#if (defined(__GNUC__) || defined(__clang__)) && defined(__AES__) && defined(__PCLMUL__) -+#if (defined(__GNUC__) || defined(__clang__)) && !defined(_LIBCPP_HAS_MUSL_LIBC) ++#if (defined(__GNUC__) || defined(__clang__)) && !defined(__OPENORBIS__) #define MBEDTLS_AESNI_HAVE_INTRINSICS #endif /* For 32-bit, we only support intrinsics */ diff --git a/externals/ffmpeg/CMakeLists.txt b/externals/ffmpeg/CMakeLists.txt index 336427450c..d97b9b30ed 100644 --- a/externals/ffmpeg/CMakeLists.txt +++ b/externals/ffmpeg/CMakeLists.txt @@ -146,6 +146,13 @@ if (UNIX AND NOT DEFINED FFmpeg_IS_CROSS_COMPILING) endif() endif() +if (PLATFORM_PS4) + list(APPEND FFmpeg_HWACCEL_FLAGS + --enable-stdatomic + --disable-threads + ) +endif() + if (YUZU_USE_BUNDLED_FFMPEG) AddJsonPackage(ffmpeg-ci) @@ -241,9 +248,9 @@ else() --cc="${FFmpeg_CC}" --cxx="${FFmpeg_CXX}" --ld="${CMAKE_LINKER}" - --ldflags="${CMAKE_C_LINK_FLAGS}" - --cflags="${CMAKE_C_FLAGS}" - --cxxflags="${CMAKE_CXX_FLAGS}" + --extra-ldflags="$CMAKE_C_LINK_FLAGS" + --extra-cflags="$CMAKE_C_FLAGS" + --extra-cxxflags="$CMAKE_CXX_FLAGS" ${FFmpeg_HWACCEL_FLAGS} ${FFmpeg_CROSS_COMPILE_FLAGS} WORKING_DIRECTORY diff --git a/src/common/memory_detect.cpp b/src/common/memory_detect.cpp index a8e43a1e4b..074c02a9c3 100644 --- a/src/common/memory_detect.cpp +++ b/src/common/memory_detect.cpp @@ -8,7 +8,7 @@ // clang-format on #else #include -#if defined(__APPLE__) || (defined(__FreeBSD__) && !defined(_LIBCPP_HAS_MUSL_LIBC)) +#if defined(__APPLE__) || (defined(__FreeBSD__) && !defined(__OPENORBIS__)) #include #elif defined(__linux__) #include @@ -43,7 +43,7 @@ static MemoryInfo Detect() { sysctlbyname("vm.swapusage", &vmusage, &sizeof_vmusage, nullptr, 0); mem_info.TotalPhysicalMemory = ramsize; mem_info.TotalSwapMemory = vmusage.xsu_total; -#elif defined(__FreeBSD__) && !defined(_LIBCPP_HAS_MUSL_LIBC) +#elif defined(__FreeBSD__) && !defined(__OPENORBIS__) u_long physmem, swap_total; std::size_t sizeof_u_long = sizeof(u_long); // sysctlbyname(const char *, void *, size_t *, const void *, size_t); diff --git a/src/dynarmic/src/dynarmic/backend/exception_handler_posix.cpp b/src/dynarmic/src/dynarmic/backend/exception_handler_posix.cpp index 9f508f72e5..8470d77b2d 100644 --- a/src/dynarmic/src/dynarmic/backend/exception_handler_posix.cpp +++ b/src/dynarmic/src/dynarmic/backend/exception_handler_posix.cpp @@ -59,12 +59,16 @@ public: signal_stack_size = std::max(SIGSTKSZ, 2 * 1024 * 1024); signal_stack_memory = mmap(nullptr, signal_stack_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); +#ifdef __OPENORBIS__ + fmt::print(stderr, "no fastmem on ps4\n"); + supports_fast_mem = false; +#else stack_t signal_stack{}; signal_stack.ss_sp = signal_stack_memory; signal_stack.ss_size = signal_stack_size; signal_stack.ss_flags = 0; if (sigaltstack(&signal_stack, nullptr) != 0) { - fmt::print(stderr, "dynarmic: POSIX SigHandler: init failure at sigaltstack\n"); + fmt::print(stderr, "POSIX SigHandler: init failure at sigaltstack\n"); supports_fast_mem = false; return; } @@ -75,16 +79,17 @@ public: sa.sa_flags = SA_SIGINFO | SA_ONSTACK | SA_RESTART; sigemptyset(&sa.sa_mask); if (sigaction(SIGSEGV, &sa, &old_sa_segv) != 0) { - fmt::print(stderr, "dynarmic: POSIX SigHandler: could not set SIGSEGV handler\n"); + fmt::print(stderr, "POSIX SigHandler: could not set SIGSEGV handler\n"); supports_fast_mem = false; return; } -#ifdef __APPLE__ +# ifdef __APPLE__ if (sigaction(SIGBUS, &sa, &old_sa_bus) != 0) { - fmt::print(stderr, "dynarmic: POSIX SigHandler: could not set SIGBUS handler\n"); + fmt::print(stderr, "POSIX SigHandler: could not set SIGBUS handler\n"); supports_fast_mem = false; return; } +# endif #endif } @@ -145,6 +150,9 @@ void SigHandler::SigAction(int sig, siginfo_t* info, void* raw_context) { # error "Invalid architecture" #endif +#ifdef __OPENORBIS__ + // No fastmem +#else struct sigaction* retry_sa = sig == SIGSEGV ? &sig_handler->old_sa_segv : &sig_handler->old_sa_bus; if (retry_sa->sa_flags & SA_SIGINFO) { retry_sa->sa_sigaction(sig, info, raw_context); @@ -158,6 +166,7 @@ void SigHandler::SigAction(int sig, siginfo_t* info, void* raw_context) { return; } retry_sa->sa_handler(sig); +#endif } } // anonymous namespace diff --git a/src/dynarmic/src/dynarmic/common/context.h b/src/dynarmic/src/dynarmic/common/context.h index 941289cb94..48c72cb5c9 100644 --- a/src/dynarmic/src/dynarmic/common/context.h +++ b/src/dynarmic/src/dynarmic/common/context.h @@ -60,7 +60,7 @@ # elif defined(__linux__) # define CTX_RIP (mctx.gregs[REG_RIP]) # define CTX_RSP (mctx.gregs[REG_RSP]) -# elif defined(__FreeBSD__) +# elif defined(__FreeBSD__) || defined(__DragonFly__) # define CTX_RIP (mctx.mc_rip) # define CTX_RSP (mctx.mc_rsp) # elif defined(__NetBSD__) @@ -72,9 +72,9 @@ # elif defined(__sun__) # define CTX_RIP (mctx.gregs[REG_RIP]) # define CTX_RSP (mctx.gregs[REG_RSP]) -# elif defined(__DragonFly__) -# define CTX_RIP (mctx.mc_rip) -# define CTX_RSP (mctx.mc_rsp) +# elif defined(__OPENORBIS__) +# define CTX_RIP (mctx.gregs[REG_RIP]) +# define CTX_RSP (mctx.gregs[REG_RSP]) # else # error "Unknown platform" # endif @@ -97,7 +97,7 @@ # define CTX_Q(i) (fpctx->vregs[i]) # define CTX_FPSR (fpctx->fpsr) # define CTX_FPCR (fpctx->fpcr) -# elif defined(__FreeBSD__) +# elif defined(__FreeBSD__) || defined(__DragonFly__) # define CTX_PC (mctx.mc_gpregs.gp_elr) # define CTX_SP (mctx.mc_gpregs.gp_sp) # define CTX_LR (mctx.mc_gpregs.gp_lr) From 1ebc3ba89d58b2b1d1f68a1420f9d184f8c38219 Mon Sep 17 00:00:00 2001 From: lizzie Date: Fri, 5 Dec 2025 03:50:05 +0000 Subject: [PATCH 07/78] buildable toolchain script + fixes for ffmpeg --- .ci/ps4/build.sh | 21 ++-- .ci/ps4/make-toolchain.sh | 168 ++++++++++++++++++++++++++++++++ externals/ffmpeg/CMakeLists.txt | 48 ++++++--- 3 files changed, 210 insertions(+), 27 deletions(-) create mode 100644 .ci/ps4/make-toolchain.sh diff --git a/.ci/ps4/build.sh b/.ci/ps4/build.sh index 3b2f6e5481..0dda2e9c9a 100755 --- a/.ci/ps4/build.sh +++ b/.ci/ps4/build.sh @@ -3,23 +3,25 @@ # SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later +OO_PS4_TOOLCHAIN="/home/xerix/src/ps4-sdk/prefix" + [ -f "ps4-toolchain.cmake" ] || cat << EOF >"ps4-toolchain.cmake" set(CMAKE_SYSROOT "$OO_PS4_TOOLCHAIN") set(CMAKE_STAGING_PREFIX "$OO_PS4_TOOLCHAIN") set(CMAKE_SYSTEM_NAME "OpenOrbis") -set(CMAKE_C_FLAGS " -D__OPENORBIS__ -D_LIBCPP_HAS_MUSL_LIBC=1 -D_GNU_SOURCE=1 --target=x86_64-pc-freebsd12-elf -mtune=x86-64 -march=x86-64 -funwind-tables") -set(CMAKE_CXX_FLAGS " -D__OPENORBIS__ -D_LIBCPP_HAS_MUSL_LIBC=1 -D_GNU_SOURCE=1 --target=x86_64-pc-freebsd12-elf -mtune=x86-64 -march=x86-64 -funwind-tables") +set(CMAKE_C_FLAGS " -D__OPENORBIS__ -D_LIBCPP_HAS_MUSL_LIBC=1 -D_GNU_SOURCE=1 --target=x86_64-pc-freebsd12-elf -mtune=x86-64 -march=x86-64 -fPIC -funwind-tables") +set(CMAKE_CXX_FLAGS " -D__OPENORBIS__ -D_LIBCPP_HAS_MUSL_LIBC=1 -D_GNU_SOURCE=1 --target=x86_64-pc-freebsd12-elf -mtune=x86-64 -march=x86-64 -fPIC -funwind-tables") -set(CMAKE_EXE_LINKER_FLAGS "-T $OO_PS4_TOOLCHAIN/link.x -L$OO_PS4_TOOLCHAIN/lib") -set(CMAKE_C_LINK_FLAGS "-T $OO_PS4_TOOLCHAIN/link.x -L$OO_PS4_TOOLCHAIN/lib") -set(CMAKE_CXX_LINK_FLAGS "-T $OO_PS4_TOOLCHAIN/link.x -L$OO_PS4_TOOLCHAIN/lib") +set(CMAKE_EXE_LINKER_FLAGS "-m elf_x86_64 -pie -T $OO_PS4_TOOLCHAIN/link.x --eh-frame-hdr -L$OO_PS4_TOOLCHAIN/lib") +set(CMAKE_C_LINK_FLAGS "-m elf_x86_64 -pie -T $OO_PS4_TOOLCHAIN/link.x --eh-frame-hdr -L$OO_PS4_TOOLCHAIN/lib") +set(CMAKE_CXX_LINK_FLAGS "-m elf_x86_64 -pie -T $OO_PS4_TOOLCHAIN/link.x --eh-frame-hdr -L$OO_PS4_TOOLCHAIN/lib") set(CMAKE_C_COMPILER clang) set(CMAKE_CXX_COMPILER clang++) set(CMAKE_LINKER ld.lld) -set(CMAKE_C_LINK_EXECUTABLE " -o -lc -lkernel -lSceUserService -lSceSysmodule -lSceNet $OO_PS4_TOOLCHAIN/lib/crt1.o") -set(CMAKE_CXX_LINK_EXECUTABLE " -o -lc -lkernel -lunwind -lc++ -lc++abi -lc++experimental -lrt -lSceUserService -lSceSysmodule -lSceNet $OO_PS4_TOOLCHAIN/lib/crt1.o") +set(CMAKE_C_LINK_EXECUTABLE " -o -lc -lkernel -lSceUserService -lSceSysmodule -lSceNet -lSceLibcInternal $OO_PS4_TOOLCHAIN/lib/crt1.o ") +set(CMAKE_CXX_LINK_EXECUTABLE " -o -lc -lkernel -lc++ -lSceUserService -lSceSysmodule -lSceNet -lSceLibcInternal $OO_PS4_TOOLCHAIN/lib/crt1.o ") set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) @@ -30,11 +32,6 @@ set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) set(CMAKE_SIZEOF_VOID_P 8) EOF -export ARCH_FLAGS="$ARCH_FLAGS -O3" -if [ -z "$NPROC" ]; then - NPROC="$(nproc)" -fi - # Normally a platform has a package manager # PS4 does not, atleast not in the normal sense export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" $@) diff --git a/.ci/ps4/make-toolchain.sh b/.ci/ps4/make-toolchain.sh new file mode 100644 index 0000000000..b7848f5ddb --- /dev/null +++ b/.ci/ps4/make-toolchain.sh @@ -0,0 +1,168 @@ +#!/usr/local/bin/bash -ex + +# Define global vars +# These flags are used everywhere, so let's reuse them. +export OO_PS4_TOOLCHAIN="$PWD/prefix" +export PREFIX="$OO_PS4_TOOLCHAIN" +export CC="clang" +export CXX="clang++" +export AR="llvm-ar" +export CFLAGS="-fPIC -DPS4 -D_LIBUNWIND_IS_BAREMETAL=1" +export CXXFLAGS="$CFLAGS -D__STDC_VERSION__=0" +export TARGET="x86_64-scei-ps4" +export LLVM_ROOT="$PWD/llvm-project" +export LLVM_PATH="$PWD/llvm-project/llvm" +export WORK_PATH="$PWD" + +prepare_prefix() { + [ -d OpenOrbis-PS4-Toolchain ] || git clone --depth=1 https://github.com/OpenOrbis/OpenOrbis-PS4-Toolchain + [ -d musl ] || git clone --depth=1 https://github.com/OpenOrbis/musl + [ -d llvm-project ] || git clone --depth=1 --branch openorbis/20.x https://github.com/seuros/llvm-project + [ -d create-fself ] || git clone --depth=1 https://github.com/OpenOrbis/create-fself + [ -d create-gp4 ] || git clone --depth=1 https://github.com/OpenOrbis/create-gp4 + [ -d readoelf ] || git clone --depth=1 https://github.com/OpenOrbis/readoelf + + mkdir -p $PREFIX "$PREFIX/bin" "$PREFIX/include" + [ -f "$PREFIX/include/orbis/libkernel.h" ] || cp -r OpenOrbis-PS4-Toolchain/include/* "$PREFIX/include/" + mkdir -p $PREFIX/usr + [ -L "$PREFIX/usr/include" ] || ln -s $PREFIX/include $PREFIX/usr/include || echo 1 + [ -L "$PREFIX/usr/share" ] || ln -s $PREFIX/share $PREFIX/usr/share || echo 1 + [ -L "$PREFIX/usr/lib" ] || ln -s $PREFIX/lib $PREFIX/usr/lib || echo 1 + [ -L "$PREFIX/usr/bin" ] || ln -s $PREFIX/bin $PREFIX/usr/bin || echo 1 +} + +build_musl() { + mkdir -p musl-build + cd musl-build + ../musl/configure --target=$TARGET --disable-shared CC="$CC" CFLAGS="$CFLAGS" --prefix=$PREFIX + gmake -j8 && gmake install + cd .. +} + +build_llvm() { + # Build compiler-rt + cmake "$LLVM_ROOT/compiler-rt" -B "$WORK_PATH/llvm-build/compiler-rt" \ + -DCMAKE_INSTALL_PREFIX="$PREFIX" \ + -DCMAKE_C_COMPILER="$CC" -DCMAKE_CXX_COMPILER="$CXX" \ + -DCMAKE_C_FLAGS="$CFLAGS" -DCMAKE_CXX_FLAGS="$CXXFLAGS" \ + -DCMAKE_ASM_COMPILER="$CC" -DCMAKE_ASM_FLAGS="$CFLAGS -x assembler-with-cpp" \ + -DLLVM_PATH="$LLVM_PATH" -DCOMPILER_RT_DEFAULT_TARGET_TRIPLE="$TARGET" \ + -DCOMPILER_RT_BAREMETAL_BUILD=YES -DCOMPILER_RT_BUILD_BUILTINS=ON \ + -DCOMPILER_RT_BUILD_CRT=OFF -DCOMPILER_RT_BUILD_SANITIZERS=OFF \ + -DCOMPILER_RT_BUILD_XRAY=OFF -DCOMPILER_RT_BUILD_LIBFUZZER=OFF \ + -DCOMPILER_RT_BUILD_PROFILE=OFF -DCOMPILER_RT_STANDALONE_BUILD=ON + # Build libunwind + cmake "$LLVM_ROOT/libunwind" -B "$WORK_PATH/llvm-build/libunwind" \ + -DCMAKE_INSTALL_PREFIX="$PREFIX" \ + -DCMAKE_C_COMPILER="$CC" -DCMAKE_CXX_COMPILER="$CXX" \ + -DCMAKE_C_FLAGS="$CFLAGS -fcxx-exceptions" -DCMAKE_CXX_FLAGS="$CXXFLAGS -fcxx-exceptions" \ + -DCMAKE_ASM_COMPILER="$CC" -DCMAKE_ASM_FLAGS="$CFLAGS -x assembler-with-cpp" \ + -DLLVM_PATH="$LLVM_PATH" -DLIBUNWIND_USE_COMPILER_RT=YES \ + -DLIBUNWIND_BUILD_32_BITS=NO -DLIBUNWIND_ENABLE_STATIC=ON \ + -DLIBUNWIND_ENABLE_SHARED=OFF -DLIBUNWIND_IS_BAREMETAL=ON + # Build libcxxabi + cmake "$LLVM_ROOT/libcxxabi" -B "$WORK_PATH/llvm-build/libcxxabi" \ + -DCMAKE_INSTALL_PREFIX="$PREFIX" \ + -DCMAKE_C_COMPILER="$CC" -DCMAKE_CXX_COMPILER="$CXX" \ + -DCMAKE_C_FLAGS="$CFLAGS -D_GNU_SOURCE=1 -isysroot $PREFIX -isystem $LLVM_ROOT/libcxx/include -isystem $PREFIX/include -isystem $WORK_PATH/llvm-build/libcxx/include/c++/v1" \ + -DCMAKE_CXX_FLAGS="$CXXFLAGS -D_GNU_SOURCE=1 -isysroot $PREFIX -isystem $LLVM_ROOT/libcxx/include -isystem $PREFIX/include -isystem $WORK_PATH/llvm-build/libcxx/include/c++/v1" \ + -DCMAKE_ASM_COMPILER="$CC" -DCMAKE_ASM_FLAGS="$CFLAGS -x assembler-with-cpp" \ + -DLLVM_PATH="$LLVM_PATH" -DLIBCXXABI_ENABLE_SHARED=NO \ + -DLLVM_ENABLE_RUNTIMES="rt;libunwind" \ + -DLIBCXXABI_ENABLE_STATIC=YES -DLIBCXXABI_ENABLE_EXCEPTIONS=YES \ + -DLIBCXXABI_USE_COMPILER_RT=YES -DLIBCXXABI_USE_LLVM_UNWINDER=YES \ + -DLIBCXXABI_LIBUNWIND_PATH="$LLVM_ROOT/libunwind" \ + -DLIBCXXABI_LIBCXX_INCLUDES="$LLVM_ROOT/libcxx/include" \ + -DLIBCXXABI_ENABLE_PIC=YES + # Build libcxx + cmake "$LLVM_ROOT/libcxx" -B "$WORK_PATH/llvm-build/libcxx" \ + -DCMAKE_INSTALL_PREFIX="$PREFIX" \ + -DCMAKE_C_COMPILER="$CC" -DCMAKE_CXX_COMPILER="$CXX" \ + -DCMAKE_C_FLAGS="$CFLAGS -D_LIBCPP_HAS_MUSL_LIBC=1 -D_GNU_SOURCE=1 -isysroot $PREFIX -isystem $PREFIX/include/c++/v1 -isystem $PREFIX/include" \ + -DCMAKE_CXX_FLAGS="$CXXFLAGS -D_LIBCPP_HAS_MUSL_LIBC=1 -D_GNU_SOURCE=1 -isysroot $PREFIX -isystem $PREFIX/include/c++/v1 -isystem $PREFIX/include" \ + -DCMAKE_ASM_COMPILER="$CC" -DCMAKE_ASM_FLAGS="$CFLAGS -x assembler-with-cpp" \ + -DLLVM_PATH="$LLVM_PATH" -DLIBCXX_ENABLE_RTTI=YES \ + -DLIBCXX_HAS_MUSL_LIBC=YES -DLIBCXX_ENABLE_SHARED=NO \ + -DLIBCXX_CXX_ABI=libcxxabi -DLIBCXX_CXX_ABI_INCLUDE_PATHS="$LLVM_ROOT/libcxxabi/include" \ + -DLIBCXX_CXX_ABI_LIBRARY_PATH="$LLVM_ROOT/libcxxabi/build/lib" + + cmake --build "$WORK_PATH/llvm-build/compiler-rt" --parallel + cmake --install "$WORK_PATH/llvm-build/compiler-rt" + + cmake --build "$WORK_PATH/llvm-build/libunwind" --parallel + cmake --install "$WORK_PATH/llvm-build/libunwind" + + cmake --build "$WORK_PATH/llvm-build/libcxxabi" --parallel + cmake --install "$WORK_PATH/llvm-build/libcxxabi" + + touch "$WORK_PATH/llvm-build/libcxx/include/c++/v1/libcxx.imp" + cmake --build "$WORK_PATH/llvm-build/libcxx" --parallel + cmake --install "$WORK_PATH/llvm-build/libcxx" +} + +build_tools() { + # Build create-fself + cd create-fself/cmd/create-fself + cp go-linux.mod go.mod + go build -o create-fself + mv ./create-fself $PREFIX/bin/create-fself + cd ../../../ + + # Build create-gp4 + cd create-gp4/cmd/create-gp4 + go build -o create-gp4 + mv ./create-gp4 $PREFIX/bin/create-gp4 + cd ../../../ + + # Build readoelf + cd readoelf/cmd/readoelf + go build -o readoelf + mv ./readoelf $PREFIX/bin/readoelf + cd ../../../ + + # Pull maxton's publishing tools (<3) + # Sadly maxton has passed on, we have forked the repository and will continue to update it in the future. RIP <3 + cd $PREFIX/bin + [ -f PkgTool.Core-linux-x64-0.2.231.zip ] || wget https://github.com/maxton/LibOrbisPkg/releases/download/v0.2/PkgTool.Core-linux-x64-0.2.231.zip + [ -f PkgTool.Core ] || unzip PkgTool.Core-linux-x64-0.2.231.zip + chmod +x PkgTool.Core +} + +finish_prefix() { + as $WORK_PATH/OpenOrbis-PS4-Toolchain/src/crt/crtlib.S -o $PREFIX/lib/crtlib.o + cp -a $WORK_PATH/OpenOrbis-PS4-Toolchain/link.x $PREFIX/ + + cp -a ~/OpenOrbis/PS4Toolchain/lib/libkernel* $PREFIX/lib/ + cp -a ~/OpenOrbis/PS4Toolchain/lib/libSce* $PREFIX/lib/ + + cp $WORK_PATH/llvm-build/compiler-rt/lib/freebsd/libclang_rt.builtins-x86_64.a $PREFIX/lib/ + + # Combine libc++, libc++abi and libunwind into a single archive + cat << EOF >"mri.txt" +CREATE $PREFIX/lib/libc++M.a +ADDLIB $PREFIX/lib/libunwind.a +ADDLIB $PREFIX/lib/libc++abi.a +ADDLIB $PREFIX/lib/libc++.a +SAVE +END +EOF + $AR -M < mri.txt + cp $PREFIX/lib/libc++M.a $PREFIX/lib/libc++.a + # Merge compiler-rt into libc + cat << EOF >"mri.txt" +CREATE $PREFIX/lib/libcM.a +ADDLIB $PREFIX/lib/libc.a +ADDLIB $PREFIX/lib/libclang_rt.builtins-x86_64.a +SAVE +END +EOF + $AR -M < mri.txt + cp $PREFIX/lib/libcM.a $PREFIX/lib/libc.a + rm mri.txt +} + +prepare_prefix +build_musl +build_llvm +build_tools +finish_prefix diff --git a/externals/ffmpeg/CMakeLists.txt b/externals/ffmpeg/CMakeLists.txt index d97b9b30ed..ab9d2d04cf 100644 --- a/externals/ffmpeg/CMakeLists.txt +++ b/externals/ffmpeg/CMakeLists.txt @@ -37,22 +37,30 @@ if (NOT YUZU_USE_BUNDLED_FFMPEG) elseif (NOT (CMAKE_HOST_SYSTEM_PROCESSOR MATCHES CMAKE_SYSTEM_PROCESSOR AND CMAKE_HOST_SYSTEM_NAME MATCHES CMAKE_SYSTEM_NAME)) string(TOLOWER "${CMAKE_SYSTEM_NAME}" FFmpeg_SYSTEM_NAME) - # TODO: Can we really do better? Auto-detection? Something clever? - if (NOT DEFINED FFmpeg_CROSS_PREFIX) - message(ERROR "Please set FFmpeg_CROSS_PREFIX to your cross toolchain prefix, for example: \${CMAKE_STAGING_PREFIX}/bin/${CMAKE_SYSTEM_PROCESSOR}-${CMAKE_SYSTEM_NAME}-") + if (FFmpeg_SYSTEM_NAME STREQUAL "openorbis") + set(FFmpeg_SYSTEM_NAME "freebsd") # Emulates FBSD :) endif() + # TODO: Can we really do better? Auto-detection? Something clever? list(APPEND FFmpeg_CROSS_COMPILE_FLAGS --enable-cross-compile --arch="${CMAKE_SYSTEM_PROCESSOR}" --target-os="${FFmpeg_SYSTEM_NAME}" --sysroot="${CMAKE_SYSROOT}" - --cross-prefix="${FFmpeg_CROSS_PREFIX}" ) + if (DEFINED FFmpeg_CROSS_PREFIX) + list(APPEND FFmpeg_CROSS_COMPILE_FLAGS --cross-prefix="${FFmpeg_CROSS_PREFIX}") + else() + message(WARNING "Please set FFmpeg_CROSS_PREFIX to your cross toolchain prefix, for example: \${CMAKE_STAGING_PREFIX}/bin/${CMAKE_SYSTEM_PROCESSOR}-${CMAKE_SYSTEM_NAME}-") + endif() set(FFmpeg_IS_CROSS_COMPILING TRUE) endif() endif() -if (UNIX AND NOT DEFINED FFmpeg_IS_CROSS_COMPILING) +if (PLATFORM_PS4) + list(APPEND FFmpeg_HWACCEL_FLAGS + --disable-vaapi + ) +elseif (UNIX AND NOT DEFINED FFmpeg_IS_CROSS_COMPILING) find_package(PkgConfig REQUIRED) pkg_check_modules(LIBVA libva) pkg_check_modules(CUDA cuda) @@ -147,9 +155,19 @@ if (UNIX AND NOT DEFINED FFmpeg_IS_CROSS_COMPILING) endif() if (PLATFORM_PS4) - list(APPEND FFmpeg_HWACCEL_FLAGS - --enable-stdatomic - --disable-threads + list(APPEND FFmpeg_CROSS_COMPILE_LIBS + -lc + -lkernel + -lSceUserService + -lSceSysmodule + -lSceNet + -lSceLibcInternal + ) + list(APPEND FFmpeg_CROSS_COMPILE_FLAGS + --disable-pthreads + --extra-cflags=${CMAKE_SYSROOT}/usr/include + --extra-cxxflags=${CMAKE_SYSROOT}/usr/include + --extra-libs="${FFmpeg_CROSS_COMPILE_LIBS}" ) endif() @@ -245,12 +263,12 @@ else() --enable-decoder=vp9 --enable-filter=yadif,scale --enable-pic - --cc="${FFmpeg_CC}" - --cxx="${FFmpeg_CXX}" - --ld="${CMAKE_LINKER}" - --extra-ldflags="$CMAKE_C_LINK_FLAGS" - --extra-cflags="$CMAKE_C_FLAGS" - --extra-cxxflags="$CMAKE_CXX_FLAGS" + --cc=${FFmpeg_CC} + --cxx=${FFmpeg_CXX} + --ld=${CMAKE_LINKER} + --extra-cflags=${CMAKE_C_FLAGS} + --extra-cxxflags=${CMAKE_CXX_FLAGS} + --extra-ldflags=${CMAKE_C_LINK_FLAGS} ${FFmpeg_HWACCEL_FLAGS} ${FFmpeg_CROSS_COMPILE_FLAGS} WORKING_DIRECTORY @@ -282,7 +300,7 @@ else() OUTPUT ${FFmpeg_BUILD_LIBRARIES} COMMAND - make ${FFmpeg_MAKE_ARGS} + gmake ${FFmpeg_MAKE_ARGS} WORKING_DIRECTORY ${FFmpeg_BUILD_DIR} ) From 86ffa7932e79d07f272e3fe33c62d70faac9bf3d Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 1 Dec 2025 02:32:31 +0000 Subject: [PATCH 08/78] exclude from vulkan surface selection --- .ci/ps4/make-toolchain.sh | 3 +++ src/video_core/vulkan_common/vulkan.h | 2 ++ 2 files changed, 5 insertions(+) diff --git a/.ci/ps4/make-toolchain.sh b/.ci/ps4/make-toolchain.sh index b7848f5ddb..ca0f079d96 100644 --- a/.ci/ps4/make-toolchain.sh +++ b/.ci/ps4/make-toolchain.sh @@ -135,6 +135,9 @@ finish_prefix() { cp -a ~/OpenOrbis/PS4Toolchain/lib/libkernel* $PREFIX/lib/ cp -a ~/OpenOrbis/PS4Toolchain/lib/libSce* $PREFIX/lib/ + cp -a ~/OpenOrbis/PS4Toolchain/lib/libSDL* $PREFIX/lib/ + cp -r ~/OpenOrbis/PS4Toolchain/include/SDL2 $PREFIX/include/SDL2 + cp $WORK_PATH/llvm-build/compiler-rt/lib/freebsd/libclang_rt.builtins-x86_64.a $PREFIX/lib/ # Combine libc++, libc++abi and libunwind into a single archive diff --git a/src/video_core/vulkan_common/vulkan.h b/src/video_core/vulkan_common/vulkan.h index 2cc0f0d7f0..dbd575bcee 100644 --- a/src/video_core/vulkan_common/vulkan.h +++ b/src/video_core/vulkan_common/vulkan.h @@ -15,6 +15,8 @@ #define VK_USE_PLATFORM_ANDROID_KHR #elif defined(__HAIKU__) #define VK_USE_PLATFORM_XCB_KHR +#elif defined(__OPENORBIS__) +// No fucking vulkan on the PlayStation 4 #else #define VK_USE_PLATFORM_XLIB_KHR #define VK_USE_PLATFORM_WAYLAND_KHR From 564aac846a89a04f32e33a410fe5c587e593fcce Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 1 Dec 2025 02:51:57 +0000 Subject: [PATCH 09/78] exclude more stuff from vulkan --- externals/CMakeLists.txt | 6 +++++- src/video_core/vulkan_common/vulkan_instance.cpp | 2 ++ src/video_core/vulkan_common/vulkan_surface.cpp | 2 ++ src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp | 6 ++++++ 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index 7b4c481ba5..f79f776be4 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -170,7 +170,11 @@ if (NOT ANDROID) AddJsonPackage(sdl2) endif() - find_package(SDL2 2.26.4 REQUIRED) + if (PLATFORM_PS4) + set(SDL2_LIBRARY ${CMAKE_SYSROOT}/lib/libSDL2.a) + set(SDL2_INCLUDE_DIR ${CMAKE_SYSROOT}/include/SDL2) + endif() + find_package(SDL2 REQUIRED) endif() set(BUILD_SHARED_LIBS OFF) diff --git a/src/video_core/vulkan_common/vulkan_instance.cpp b/src/video_core/vulkan_common/vulkan_instance.cpp index 47e18dd6a5..2cbc06d80a 100644 --- a/src/video_core/vulkan_common/vulkan_instance.cpp +++ b/src/video_core/vulkan_common/vulkan_instance.cpp @@ -59,6 +59,8 @@ namespace { case Core::Frontend::WindowSystemType::Xcb: extensions.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME); break; +#elif defined(__OPENORBIS__) + // No vulkan #else case Core::Frontend::WindowSystemType::X11: extensions.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME); diff --git a/src/video_core/vulkan_common/vulkan_surface.cpp b/src/video_core/vulkan_common/vulkan_surface.cpp index 761b7759c8..4c14c0099d 100644 --- a/src/video_core/vulkan_common/vulkan_surface.cpp +++ b/src/video_core/vulkan_common/vulkan_surface.cpp @@ -76,6 +76,8 @@ vk::SurfaceKHR CreateSurface( throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED); } } +#elif defined(__OPENORBIS__) + // No native #else if (window_info.type == Core::Frontend::WindowSystemType::X11) { const VkXlibSurfaceCreateInfoKHR xlib_ci{ diff --git a/src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp b/src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp index f509652bf6..a21eea1219 100644 --- a/src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp +++ b/src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp @@ -74,6 +74,12 @@ EmuWindow_SDL2_VK::EmuWindow_SDL2_VK(InputCommon::InputSubsystem* input_subsyste window_info.type = Core::Frontend::WindowSystemType::Android; window_info.render_surface = reinterpret_cast(wm.info.android.window); break; +#endif +#ifdef SDL_VIDEO_DRIVER_DIRECTFB + case SDL_SYSWM_TYPE::SDL_SYSWM_DIRECTFB: + window_info.type = Core::Frontend::WindowSystemType::Headless; + window_info.render_surface = reinterpret_cast(wm.info.dfb.window); + break; #endif default: LOG_CRITICAL(Frontend, "Window manager subsystem {} not implemented", wm.subsystem); From f1d1e09c4c6cc1d0c954e682a464d0afcfe2d2c5 Mon Sep 17 00:00:00 2001 From: lizzie Date: Fri, 5 Dec 2025 03:50:45 +0000 Subject: [PATCH 10/78] make .pkg and .self --- CMakeLists.txt | 1 + CMakeModules/OpenOrbis.cmake | 42 ++++++++++++++++++++++++++++++++++++ src/yuzu_cmd/CMakeLists.txt | 7 ++++++ src/yuzu_cmd/yuzu.cpp | 10 +++++++++ 4 files changed, 60 insertions(+) create mode 100644 CMakeModules/OpenOrbis.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 4490df21cb..fa5a85c724 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,6 +20,7 @@ include(UseCcache) include(CMakeDependentOption) include(CTest) include(CPMUtil) +include(OpenOrbis) if (NOT DEFINED ARCHITECTURE) message(FATAL_ERROR "Architecture didn't make it out of scope, did you delete DetectArchitecture.cmake?") diff --git a/CMakeModules/OpenOrbis.cmake b/CMakeModules/OpenOrbis.cmake new file mode 100644 index 0000000000..7b7b0c005c --- /dev/null +++ b/CMakeModules/OpenOrbis.cmake @@ -0,0 +1,42 @@ +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + +function(add_fself project target) + add_custom_command( + OUTPUT "${target}.self" + COMMAND ${CMAKE_SYSROOT}/bin/create-fself + -in=${CMAKE_BINARY_DIR}/bin/${target} + -out=${CMAKE_BINARY_DIR}/bin/${target}.oelf + --eboot ${CMAKE_BINARY_DIR}/bin/eboot.bin + VERBATIM + DEPENDS "${project}" + ) + add_custom_target("${project}_self" ALL DEPENDS "${target}.self") +endfunction() + +function(add_pkg project target) + set(sce_sys_dir ${CMAKE_BINARY_DIR}/sce_sys) + set(sce_sys_param ${sce_sys_dir}/param.sfo) + add_custom_command( + OUTPUT "${target}.pkg" + COMMAND mkdir -p ${sce_sys_dir} + COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_new ${sce_sys_param} + COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} APP_TYPE --type Integer --maxsize 4 --value 1 + COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} APP_VER --type Utf8 --maxsize 8 --value '1.03' + COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} ATTRIBUTE --type Integer --maxsize 4 --value 0 + COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} CATEGORY --type Utf8 --maxsize 4 --value 'gd' + COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} CONTENT_ID --type Utf8 --maxsize 48 --value 'IV0000-BREW00090_00-EDENEMULAT000000' + COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} DOWNLOAD_DATA_SIZE --type Integer --maxsize 4 --value 0 + COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} SYSTEM_VER --type Integer --maxsize 4 --value 0 + COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} TITLE --type Utf8 --maxsize 128 --value 'Eden Emulator' + COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} TITLE_ID --type Utf8 --maxsize 12 --value 'BREW00090' + COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} VERSION --type Utf8 --maxsize 8 --value '1.03' + VERBATIM + DEPENDS "${target}.self" + ) + add_custom_target("${project}_pkg" ALL DEPENDS "${target}.pkg") +endfunction() + +if (NOT DEFINED ENV{OO_PS4_TOOLCHAIN}) + set(ENV{OO_PS4_TOOLCHAIN} ${CMAKE_SYSROOT}) +endif () diff --git a/src/yuzu_cmd/CMakeLists.txt b/src/yuzu_cmd/CMakeLists.txt index a1f16be75c..ba24de8b62 100644 --- a/src/yuzu_cmd/CMakeLists.txt +++ b/src/yuzu_cmd/CMakeLists.txt @@ -34,6 +34,8 @@ target_link_libraries(yuzu-cmd PRIVATE common core input_common frontend_common target_link_libraries(yuzu-cmd PRIVATE glad) if (MSVC) target_link_libraries(yuzu-cmd PRIVATE getopt) +elseif(PLATFORM_PS4) + target_link_libraries(yuzu-cmd PRIVATE SceVideoOut SceAudioOut ScePad) endif() target_link_libraries(yuzu-cmd PRIVATE ${PLATFORM_LIBRARIES} Threads::Threads) @@ -65,3 +67,8 @@ if (NOT MSVC) -Wno-unused-parameter -Wno-missing-field-initializers) endif() + +if (PLATFORM_PS4) + add_fself(yuzu-cmd eden-cli) + add_pkg(yuzu-cmd eden-cli) +endif() diff --git a/src/yuzu_cmd/yuzu.cpp b/src/yuzu_cmd/yuzu.cpp index b292b4886b..869904b60f 100644 --- a/src/yuzu_cmd/yuzu.cpp +++ b/src/yuzu_cmd/yuzu.cpp @@ -51,6 +51,16 @@ #include #endif +#ifdef __OPENORBIS__ +# define STUB_WEAK(name) extern "C" void name() { printf("called " #name); asm volatile("ud2"); } +STUB_WEAK(__cxa_thread_atexit) +STUB_WEAK(__assert) +STUB_WEAK(ZSTD_trace_compress_begin) +STUB_WEAK(ZSTD_trace_compress_end) +STUB_WEAK(ZSTD_trace_decompress_begin) +STUB_WEAK(ZSTD_trace_decompress_end) +# undef STUB_WEAK +#endif #ifdef _WIN32 extern "C" { // tells Nvidia and AMD drivers to use the dedicated GPU by default on laptops with switchable From c840015ba2df5aa5adf6d71d66d9177e3fbda297 Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 1 Dec 2025 05:08:23 +0000 Subject: [PATCH 11/78] fself + pkg stuffs --- CMakeModules/OpenOrbis.cmake | 25 ++++++++++++++----------- src/yuzu_cmd/CMakeLists.txt | 4 ++-- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/CMakeModules/OpenOrbis.cmake b/CMakeModules/OpenOrbis.cmake index 7b7b0c005c..2ee8cb4942 100644 --- a/CMakeModules/OpenOrbis.cmake +++ b/CMakeModules/OpenOrbis.cmake @@ -1,9 +1,9 @@ # SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later -function(add_fself project target) +function(create_ps4_fself project target) add_custom_command( - OUTPUT "${target}.self" + OUTPUT "${CMAKE_BINARY_DIR}/${target}.self" COMMAND ${CMAKE_SYSROOT}/bin/create-fself -in=${CMAKE_BINARY_DIR}/bin/${target} -out=${CMAKE_BINARY_DIR}/bin/${target}.oelf @@ -11,30 +11,33 @@ function(add_fself project target) VERBATIM DEPENDS "${project}" ) - add_custom_target("${project}_self" ALL DEPENDS "${target}.self") + add_custom_target("${project}_self" ALL DEPENDS ${project}) endfunction() -function(add_pkg project target) - set(sce_sys_dir ${CMAKE_BINARY_DIR}/sce_sys) +function(create_ps4_pkg project target content_id) + set(sce_sys_dir ./sce_sys) set(sce_sys_param ${sce_sys_dir}/param.sfo) add_custom_command( - OUTPUT "${target}.pkg" + OUTPUT "${CMAKE_BINARY_DIR}/${target}.pkg" COMMAND mkdir -p ${sce_sys_dir} COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_new ${sce_sys_param} COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} APP_TYPE --type Integer --maxsize 4 --value 1 COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} APP_VER --type Utf8 --maxsize 8 --value '1.03' COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} ATTRIBUTE --type Integer --maxsize 4 --value 0 - COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} CATEGORY --type Utf8 --maxsize 4 --value 'gd' - COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} CONTENT_ID --type Utf8 --maxsize 48 --value 'IV0000-BREW00090_00-EDENEMULAT000000' + COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} CATEGORY --type Utf8 --maxsize 4 --value 'E' + COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} CONTENT_ID --type Utf8 --maxsize 48 --value '${content_id}' COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} DOWNLOAD_DATA_SIZE --type Integer --maxsize 4 --value 0 COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} SYSTEM_VER --type Integer --maxsize 4 --value 0 - COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} TITLE --type Utf8 --maxsize 128 --value 'Eden Emulator' + COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} TITLE --type Utf8 --maxsize 128 --value ${target} COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} TITLE_ID --type Utf8 --maxsize 12 --value 'BREW00090' COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} VERSION --type Utf8 --maxsize 8 --value '1.03' + COMMAND ${CMAKE_SYSROOT}/bin/create-gp4 -out ${target}.gp4 --content-id='${content_id}' --files "bin/eboot.bin ${sce_sys_param}" + COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core pkg_build ${CMAKE_BINARY_DIR}/${target}.gp4 . VERBATIM - DEPENDS "${target}.self" + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + DEPENDS ${project}_self ) - add_custom_target("${project}_pkg" ALL DEPENDS "${target}.pkg") + add_custom_target(${project}_pkg ALL DEPENDS "${CMAKE_BINARY_DIR}/${target}.pkg") endfunction() if (NOT DEFINED ENV{OO_PS4_TOOLCHAIN}) diff --git a/src/yuzu_cmd/CMakeLists.txt b/src/yuzu_cmd/CMakeLists.txt index ba24de8b62..0f53566e94 100644 --- a/src/yuzu_cmd/CMakeLists.txt +++ b/src/yuzu_cmd/CMakeLists.txt @@ -69,6 +69,6 @@ if (NOT MSVC) endif() if (PLATFORM_PS4) - add_fself(yuzu-cmd eden-cli) - add_pkg(yuzu-cmd eden-cli) + create_ps4_fself(yuzu-cmd eden-cli) + create_ps4_pkg(yuzu-cmd eden-cli "IV0000-BREW00090_00-EDENEMULAT000000") endif() From b02e0ccc76fc3f31baf30833429ad8cb15e8db12 Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 1 Dec 2025 05:32:35 +0000 Subject: [PATCH 12/78] the orb --- .ci/ps4/make-toolchain.sh | 20 +++++++++++--------- CMakeModules/OpenOrbis.cmake | 36 ++++++++++++------------------------ src/yuzu_cmd/CMakeLists.txt | 3 +-- 3 files changed, 24 insertions(+), 35 deletions(-) diff --git a/.ci/ps4/make-toolchain.sh b/.ci/ps4/make-toolchain.sh index ca0f079d96..727596ae36 100644 --- a/.ci/ps4/make-toolchain.sh +++ b/.ci/ps4/make-toolchain.sh @@ -21,6 +21,7 @@ prepare_prefix() { [ -d create-fself ] || git clone --depth=1 https://github.com/OpenOrbis/create-fself [ -d create-gp4 ] || git clone --depth=1 https://github.com/OpenOrbis/create-gp4 [ -d readoelf ] || git clone --depth=1 https://github.com/OpenOrbis/readoelf + [ -d LibOrbisPkg ] || git clone --depth=1 https://github.com/maxton/LibOrbisPkg mkdir -p $PREFIX "$PREFIX/bin" "$PREFIX/include" [ -f "$PREFIX/include/orbis/libkernel.h" ] || cp -r OpenOrbis-PS4-Toolchain/include/* "$PREFIX/include/" @@ -101,31 +102,32 @@ build_llvm() { } build_tools() { + # Build create-fself cd create-fself/cmd/create-fself cp go-linux.mod go.mod - go build -o create-fself + go build -ldflags "-linkmode external -extldflags -static" -o create-fself mv ./create-fself $PREFIX/bin/create-fself cd ../../../ # Build create-gp4 cd create-gp4/cmd/create-gp4 - go build -o create-gp4 + go build -ldflags "-linkmode external -extldflags -static" -o create-gp4 mv ./create-gp4 $PREFIX/bin/create-gp4 cd ../../../ # Build readoelf cd readoelf/cmd/readoelf - go build -o readoelf + go build -ldflags "-linkmode external -extldflags -static" -o readoelf mv ./readoelf $PREFIX/bin/readoelf cd ../../../ - # Pull maxton's publishing tools (<3) - # Sadly maxton has passed on, we have forked the repository and will continue to update it in the future. RIP <3 - cd $PREFIX/bin - [ -f PkgTool.Core-linux-x64-0.2.231.zip ] || wget https://github.com/maxton/LibOrbisPkg/releases/download/v0.2/PkgTool.Core-linux-x64-0.2.231.zip - [ -f PkgTool.Core ] || unzip PkgTool.Core-linux-x64-0.2.231.zip - chmod +x PkgTool.Core + # # Pull maxton's publishing tools (<3) + # # Sadly maxton has passed on, we have forked the repository and will continue to update it in the future. RIP <3 + # cd $PREFIX/bin + # [ -f PkgTool.Core-linux-x64-0.2.231.zip ] || wget https://github.com/maxton/LibOrbisPkg/releases/download/v0.2/PkgTool.Core-linux-x64-0.2.231.zip + # [ -f PkgTool.Core ] || unzip PkgTool.Core-linux-x64-0.2.231.zip + # chmod +x PkgTool.Core } finish_prefix() { diff --git a/CMakeModules/OpenOrbis.cmake b/CMakeModules/OpenOrbis.cmake index 2ee8cb4942..4e76731f6a 100644 --- a/CMakeModules/OpenOrbis.cmake +++ b/CMakeModules/OpenOrbis.cmake @@ -1,43 +1,31 @@ # SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later -function(create_ps4_fself project target) - add_custom_command( - OUTPUT "${CMAKE_BINARY_DIR}/${target}.self" - COMMAND ${CMAKE_SYSROOT}/bin/create-fself - -in=${CMAKE_BINARY_DIR}/bin/${target} - -out=${CMAKE_BINARY_DIR}/bin/${target}.oelf - --eboot ${CMAKE_BINARY_DIR}/bin/eboot.bin - VERBATIM - DEPENDS "${project}" - ) - add_custom_target("${project}_self" ALL DEPENDS ${project}) -endfunction() - function(create_ps4_pkg project target content_id) - set(sce_sys_dir ./sce_sys) + set(sce_sys_dir sce_sys) set(sce_sys_param ${sce_sys_dir}/param.sfo) add_custom_command( - OUTPUT "${CMAKE_BINARY_DIR}/${target}.pkg" + OUTPUT "${target}.pkg" + COMMAND ${CMAKE_SYSROOT}/bin/create-fself -in=bin/${target} -out=${target}.oelf --eboot eboot.bin COMMAND mkdir -p ${sce_sys_dir} COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_new ${sce_sys_param} COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} APP_TYPE --type Integer --maxsize 4 --value 1 - COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} APP_VER --type Utf8 --maxsize 8 --value '1.03' + COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} APP_VER --type Utf8 --maxsize 8 --value 1.03 COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} ATTRIBUTE --type Integer --maxsize 4 --value 0 - COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} CATEGORY --type Utf8 --maxsize 4 --value 'E' - COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} CONTENT_ID --type Utf8 --maxsize 48 --value '${content_id}' + COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} CATEGORY --type Utf8 --maxsize 4 --value gd + COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} CONTENT_ID --type Utf8 --maxsize 48 --value ${content_id} COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} DOWNLOAD_DATA_SIZE --type Integer --maxsize 4 --value 0 COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} SYSTEM_VER --type Integer --maxsize 4 --value 0 COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} TITLE --type Utf8 --maxsize 128 --value ${target} - COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} TITLE_ID --type Utf8 --maxsize 12 --value 'BREW00090' - COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} VERSION --type Utf8 --maxsize 8 --value '1.03' - COMMAND ${CMAKE_SYSROOT}/bin/create-gp4 -out ${target}.gp4 --content-id='${content_id}' --files "bin/eboot.bin ${sce_sys_param}" - COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core pkg_build ${CMAKE_BINARY_DIR}/${target}.gp4 . + COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} TITLE_ID --type Utf8 --maxsize 12 --value BREW00090 + COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} VERSION --type Utf8 --maxsize 8 --value 1.03 + COMMAND ${CMAKE_SYSROOT}/bin/create-gp4 -out ${target}.gp4 --content-id=${content_id} --files "eboot.bin ${sce_sys_param}" + COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core pkg_build ${target}.gp4 . VERBATIM WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - DEPENDS ${project}_self + DEPENDS ${project} ) - add_custom_target(${project}_pkg ALL DEPENDS "${CMAKE_BINARY_DIR}/${target}.pkg") + add_custom_target(${project}_pkg ALL DEPENDS "${target}.pkg") endfunction() if (NOT DEFINED ENV{OO_PS4_TOOLCHAIN}) diff --git a/src/yuzu_cmd/CMakeLists.txt b/src/yuzu_cmd/CMakeLists.txt index 0f53566e94..10b55fd865 100644 --- a/src/yuzu_cmd/CMakeLists.txt +++ b/src/yuzu_cmd/CMakeLists.txt @@ -69,6 +69,5 @@ if (NOT MSVC) endif() if (PLATFORM_PS4) - create_ps4_fself(yuzu-cmd eden-cli) - create_ps4_pkg(yuzu-cmd eden-cli "IV0000-BREW00090_00-EDENEMULAT000000") + create_ps4_pkg(yuzu-cmd eden-cli IV0000-BREW00090_00-EDENEMULAT000000) endif() From a58b1e975e2ec9f9bc296c103deb9d9946774401 Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 1 Dec 2025 09:33:59 +0000 Subject: [PATCH 13/78] sysconf stub cuz crash(?) + some stderrp stuff --- .ci/ps4/build.sh | 14 +- CMakeModules/FindSDL2.cmake | 388 ++++++++++++++++++ docs/user/Basics.md | 1 + src/common/fs/path_util.cpp | 4 + src/common/host_memory.cpp | 7 +- src/common/memory_detect.cpp | 4 +- src/input_common/drivers/joycon.cpp | 13 +- src/input_common/drivers/joycon.h | 9 +- src/input_common/drivers/sdl_driver.cpp | 39 +- src/input_common/helpers/joycon_driver.cpp | 35 +- .../joycon_protocol/common_protocol.cpp | 52 ++- .../helpers/joycon_protocol/joycon_types.h | 9 +- src/yuzu_cmd/CMakeLists.txt | 3 +- src/yuzu_cmd/yuzu.cpp | 1 + 14 files changed, 506 insertions(+), 73 deletions(-) create mode 100644 CMakeModules/FindSDL2.cmake diff --git a/.ci/ps4/build.sh b/.ci/ps4/build.sh index 0dda2e9c9a..0bffdca680 100755 --- a/.ci/ps4/build.sh +++ b/.ci/ps4/build.sh @@ -3,8 +3,6 @@ # SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later -OO_PS4_TOOLCHAIN="/home/xerix/src/ps4-sdk/prefix" - [ -f "ps4-toolchain.cmake" ] || cat << EOF >"ps4-toolchain.cmake" set(CMAKE_SYSROOT "$OO_PS4_TOOLCHAIN") set(CMAKE_STAGING_PREFIX "$OO_PS4_TOOLCHAIN") @@ -20,8 +18,8 @@ set(CMAKE_CXX_LINK_FLAGS "-m elf_x86_64 -pie -T $OO_PS4_TOOLCHAIN/link.x --eh-fr set(CMAKE_C_COMPILER clang) set(CMAKE_CXX_COMPILER clang++) set(CMAKE_LINKER ld.lld) -set(CMAKE_C_LINK_EXECUTABLE " -o -lc -lkernel -lSceUserService -lSceSysmodule -lSceNet -lSceLibcInternal $OO_PS4_TOOLCHAIN/lib/crt1.o ") -set(CMAKE_CXX_LINK_EXECUTABLE " -o -lc -lkernel -lc++ -lSceUserService -lSceSysmodule -lSceNet -lSceLibcInternal $OO_PS4_TOOLCHAIN/lib/crt1.o ") +set(CMAKE_C_LINK_EXECUTABLE " -o -lc -lkernel -lSceUserService -lSceSysmodule -lSceNet $OO_PS4_TOOLCHAIN/lib/crt1.o ") +set(CMAKE_CXX_LINK_EXECUTABLE " -o -lc -lkernel -lc++ -lSceUserService -lSceSysmodule -lSceNet $OO_PS4_TOOLCHAIN/lib/crt1.o ") set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) @@ -35,14 +33,16 @@ EOF # Normally a platform has a package manager # PS4 does not, atleast not in the normal sense export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" $@) -cmake -S . -B build -G Ninja \ +cmake -S . -B build -G "Unix Makefiles" \ -DCMAKE_TOOLCHAIN_FILE="ps4-toolchain.cmake" \ -DENABLE_QT_TRANSLATION=OFF \ -DENABLE_CUBEB=OFF \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_CXX_FLAGS="$ARCH_FLAGS" \ -DCMAKE_C_FLAGS="$ARCH_FLAGS" \ - -DENABLE_SDL2=OFF \ + -DENABLE_SDL2=ON \ + -DENABLE_LIBUSB=OFF \ + -DENABLE_UPDATE_CHECKER=OFF \ -DENABLE_QT=OFF \ -DENABLE_OPENSSL=OFF \ -DENABLE_WEB_SERVICE=OFF \ @@ -51,4 +51,4 @@ cmake -S . -B build -G Ninja \ -DYUZU_USE_EXTERNAL_FFMPEG=ON \ -DYUZU_USE_CPM=ON \ "${EXTRA_CMAKE_FLAGS[@]}" || exit -cmake --build build --parallel +cmake --build build -t yuzu-cmd_pkg -- -j8 diff --git a/CMakeModules/FindSDL2.cmake b/CMakeModules/FindSDL2.cmake new file mode 100644 index 0000000000..2445d36ec5 --- /dev/null +++ b/CMakeModules/FindSDL2.cmake @@ -0,0 +1,388 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +# Copyright 2019 Amine Ben Hassouna +# Copyright 2000-2019 Kitware, Inc. and Contributors +# All rights reserved. + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: + +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. + +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. + +# * Neither the name of Kitware, Inc. nor the names of Contributors +# may be used to endorse or promote products derived from this +# software without specific prior written permission. + +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#[=======================================================================[.rst: +FindSDL2 +-------- + +Locate SDL2 library + +This module defines the following 'IMPORTED' targets: + +:: + + SDL2::Core + The SDL2 library, if found. + Libraries should link to SDL2::Core + + SDL2::Main + The SDL2main library, if found. + Applications should link to SDL2::Main instead of SDL2::Core + + + +This module will set the following variables in your project: + +:: + + SDL2_LIBRARIES, the name of the library to link against + SDL2_INCLUDE_DIRS, where to find SDL.h + SDL2_FOUND, if false, do not try to link to SDL2 + SDL2MAIN_FOUND, if false, do not try to link to SDL2main + SDL2_VERSION_STRING, human-readable string containing the version of SDL2 + + + +This module responds to the following cache variables: + +:: + + SDL2_PATH + Set a custom SDL2 Library path (default: empty) + + SDL2_NO_DEFAULT_PATH + Disable search SDL2 Library in default path. + If SDL2_PATH (default: ON) + Else (default: OFF) + + SDL2_INCLUDE_DIR + SDL2 headers path. + + SDL2_LIBRARY + SDL2 Library (.dll, .so, .a, etc) path. + + SDL2MAIN_LIBRAY + SDL2main Library (.a) path. + + SDL2_BUILDING_LIBRARY + This flag is useful only when linking to SDL2_LIBRARIES insead of + SDL2::Main. It is required only when building a library that links to + SDL2_LIBRARIES, because only applications need main() (No need to also + link to SDL2main). + If this flag is defined, then no SDL2main will be added to SDL2_LIBRARIES + and no SDL2::Main target will be created. + + +Don't forget to include SDLmain.h and SDLmain.m in your project for the +OS X framework based version. (Other versions link to -lSDL2main which +this module will try to find on your behalf.) Also for OS X, this +module will automatically add the -framework Cocoa on your behalf. + + +Additional Note: If you see an empty SDL2_LIBRARY in your project +configuration, it means CMake did not find your SDL2 library +(SDL2.dll, libsdl2.so, SDL2.framework, etc). Set SDL2_LIBRARY to point +to your SDL2 library, and configure again. Similarly, if you see an +empty SDL2MAIN_LIBRARY, you should set this value as appropriate. These +values are used to generate the final SDL2_LIBRARIES variable and the +SDL2::Core and SDL2::Main targets, but when these values are unset, +SDL2_LIBRARIES, SDL2::Core and SDL2::Main does not get created. + + +$SDL2DIR is an environment variable that would correspond to the +./configure --prefix=$SDL2DIR used in building SDL2. l.e.galup 9-20-02 + + + +Created by Amine Ben Hassouna: + Adapt FindSDL.cmake to SDL2 (FindSDL2.cmake). + Add cache variables for more flexibility: + SDL2_PATH, SDL2_NO_DEFAULT_PATH (for details, see doc above). + Mark 'Threads' as a required dependency for non-OSX systems. + Modernize the FindSDL2.cmake module by creating specific targets: + SDL2::Core and SDL2::Main (for details, see doc above). + + +Original FindSDL.cmake module: + Modified by Eric Wing. Added code to assist with automated building + by using environmental variables and providing a more + controlled/consistent search behavior. Added new modifications to + recognize OS X frameworks and additional Unix paths (FreeBSD, etc). + Also corrected the header search path to follow "proper" SDL + guidelines. Added a search for SDLmain which is needed by some + platforms. Added a search for threads which is needed by some + platforms. Added needed compile switches for MinGW. + +On OSX, this will prefer the Framework version (if found) over others. +People will have to manually change the cache value of SDL2_LIBRARY to +override this selection or set the SDL2_PATH variable or the CMake +environment CMAKE_INCLUDE_PATH to modify the search paths. + +Note that the header path has changed from SDL/SDL.h to just SDL.h +This needed to change because "proper" SDL convention is #include +"SDL.h", not . This is done for portability reasons +because not all systems place things in SDL/ (see FreeBSD). +#]=======================================================================] + +# Define options for searching SDL2 Library in a custom path + +set(SDL2_PATH "" CACHE STRING "Custom SDL2 Library path") + +set(_SDL2_NO_DEFAULT_PATH OFF) +if(SDL2_PATH) + set(_SDL2_NO_DEFAULT_PATH ON) +endif() + +set(SDL2_NO_DEFAULT_PATH ${_SDL2_NO_DEFAULT_PATH} + CACHE BOOL "Disable search SDL2 Library in default path") +unset(_SDL2_NO_DEFAULT_PATH) + +set(SDL2_NO_DEFAULT_PATH_CMD) +if(SDL2_NO_DEFAULT_PATH) + set(SDL2_NO_DEFAULT_PATH_CMD NO_DEFAULT_PATH) +endif() + +# Search for the SDL2 include directory +find_path(SDL2_INCLUDE_DIR SDL.h + HINTS + ENV SDL2DIR + ${SDL2_NO_DEFAULT_PATH_CMD} + PATH_SUFFIXES SDL2 + # path suffixes to search inside ENV{SDL2DIR} + include/SDL2 include + PATHS ${SDL2_PATH} + DOC "Where the SDL2 headers can be found" +) + +set(SDL2_INCLUDE_DIRS "${SDL2_INCLUDE_DIR}") + +if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(VC_LIB_PATH_SUFFIX lib/x64) +else() + set(VC_LIB_PATH_SUFFIX lib/x86) +endif() + +# SDL-2.0 is the name used by FreeBSD ports... +# don't confuse it for the version number. +find_library(SDL2_LIBRARY + NAMES SDL2 SDL-2.0 + HINTS + ENV SDL2DIR + ${SDL2_NO_DEFAULT_PATH_CMD} + PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX} + PATHS ${SDL2_PATH} + DOC "Where the SDL2 Library can be found" +) + +set(SDL2_LIBRARIES "${SDL2_LIBRARY}") + +if(NOT SDL2_BUILDING_LIBRARY) + if(NOT SDL2_INCLUDE_DIR MATCHES ".framework") + # Non-OS X framework versions expect you to also dynamically link to + # SDL2main. This is mainly for Windows and OS X. Other (Unix) platforms + # seem to provide SDL2main for compatibility even though they don't + # necessarily need it. + + if(SDL2_PATH) + set(SDL2MAIN_LIBRARY_PATHS "${SDL2_PATH}") + endif() + + if(NOT SDL2_NO_DEFAULT_PATH) + set(SDL2MAIN_LIBRARY_PATHS + /sw + /opt/local + /opt/csw + /opt + "${SDL2MAIN_LIBRARY_PATHS}" + ) + endif() + + find_library(SDL2MAIN_LIBRARY + NAMES SDL2main + HINTS + ENV SDL2DIR + ${SDL2_NO_DEFAULT_PATH_CMD} + PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX} + PATHS ${SDL2MAIN_LIBRARY_PATHS} + DOC "Where the SDL2main library can be found" + ) + unset(SDL2MAIN_LIBRARY_PATHS) + endif() +endif() + +# SDL2 may require threads on your system. +# The Apple build may not need an explicit flag because one of the +# frameworks may already provide it. +# But for non-OSX systems, I will use the CMake Threads package. +if(NOT APPLE) + find_package(Threads QUIET) + if(NOT Threads_FOUND) + set(SDL2_THREADS_NOT_FOUND "Could NOT find Threads (Threads is required by SDL2).") + if(SDL2_FIND_REQUIRED) + message(FATAL_ERROR ${SDL2_THREADS_NOT_FOUND}) + else() + if(NOT SDL2_FIND_QUIETLY) + message(STATUS ${SDL2_THREADS_NOT_FOUND}) + endif() + return() + endif() + unset(SDL2_THREADS_NOT_FOUND) + endif() +endif() + +# MinGW needs an additional link flag, -mwindows +# It's total link flags should look like -lmingw32 -lSDL2main -lSDL2 -mwindows +if(MINGW) + set(MINGW32_LIBRARY mingw32 "-mwindows" CACHE STRING "link flags for MinGW") +endif() + +if(SDL2_LIBRARY) + # For SDL2main + if(SDL2MAIN_LIBRARY AND NOT SDL2_BUILDING_LIBRARY) + list(FIND SDL2_LIBRARIES "${SDL2MAIN_LIBRARY}" _SDL2_MAIN_INDEX) + if(_SDL2_MAIN_INDEX EQUAL -1) + set(SDL2_LIBRARIES "${SDL2MAIN_LIBRARY}" ${SDL2_LIBRARIES}) + endif() + unset(_SDL2_MAIN_INDEX) + endif() + + # For OS X, SDL2 uses Cocoa as a backend so it must link to Cocoa. + # CMake doesn't display the -framework Cocoa string in the UI even + # though it actually is there if I modify a pre-used variable. + # I think it has something to do with the CACHE STRING. + # So I use a temporary variable until the end so I can set the + # "real" variable in one-shot. + if(APPLE) + set(SDL2_LIBRARIES ${SDL2_LIBRARIES} -framework Cocoa) + endif() + + # For threads, as mentioned Apple doesn't need this. + # In fact, there seems to be a problem if I used the Threads package + # and try using this line, so I'm just skipping it entirely for OS X. + if(NOT APPLE) + set(SDL2_LIBRARIES ${SDL2_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) + endif() + + # For MinGW library + if(MINGW) + set(SDL2_LIBRARIES ${MINGW32_LIBRARY} ${SDL2_LIBRARIES}) + endif() + +endif() + +# Read SDL2 version +if(SDL2_INCLUDE_DIR AND EXISTS "${SDL2_INCLUDE_DIR}/SDL_version.h") + file(STRINGS "${SDL2_INCLUDE_DIR}/SDL_version.h" SDL2_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL_MAJOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_INCLUDE_DIR}/SDL_version.h" SDL2_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL_MINOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_INCLUDE_DIR}/SDL_version.h" SDL2_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL_PATCHLEVEL[ \t]+[0-9]+$") + string(REGEX REPLACE "^#define[ \t]+SDL_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_MAJOR "${SDL2_VERSION_MAJOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_MINOR "${SDL2_VERSION_MINOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_PATCH "${SDL2_VERSION_PATCH_LINE}") + set(SDL2_VERSION_STRING ${SDL2_VERSION_MAJOR}.${SDL2_VERSION_MINOR}.${SDL2_VERSION_PATCH}) + unset(SDL2_VERSION_MAJOR_LINE) + unset(SDL2_VERSION_MINOR_LINE) + unset(SDL2_VERSION_PATCH_LINE) + unset(SDL2_VERSION_MAJOR) + unset(SDL2_VERSION_MINOR) + unset(SDL2_VERSION_PATCH) +endif() + +include(FindPackageHandleStandardArgs) + +FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2 + REQUIRED_VARS SDL2_LIBRARY SDL2_INCLUDE_DIR + VERSION_VAR SDL2_VERSION_STRING) + +if(SDL2MAIN_LIBRARY) + FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2main + REQUIRED_VARS SDL2MAIN_LIBRARY SDL2_INCLUDE_DIR + VERSION_VAR SDL2_VERSION_STRING) +endif() + + +mark_as_advanced(SDL2_PATH + SDL2_NO_DEFAULT_PATH + SDL2_LIBRARY + SDL2MAIN_LIBRARY + SDL2_INCLUDE_DIR + SDL2_BUILDING_LIBRARY) + + +# SDL2:: targets (SDL2::Core and SDL2::Main) +if(SDL2_FOUND) + + # SDL2::Core target + if(SDL2_LIBRARY AND NOT TARGET SDL2::Core) + add_library(SDL2::Core UNKNOWN IMPORTED) + set_target_properties(SDL2::Core PROPERTIES + IMPORTED_LOCATION "${SDL2_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${SDL2_INCLUDE_DIR}") + + if(APPLE) + # For OS X, SDL2 uses Cocoa as a backend so it must link to Cocoa. + # For more details, please see above. + set_property(TARGET SDL2::Core APPEND PROPERTY + INTERFACE_LINK_OPTIONS -framework Cocoa) + else() + # For threads, as mentioned Apple doesn't need this. + # For more details, please see above. + set_property(TARGET SDL2::Core APPEND PROPERTY + INTERFACE_LINK_LIBRARIES Threads::Threads) + endif() + endif() + + # SDL2::Main target + # Applications should link to SDL2::Main instead of SDL2::Core + # For more details, please see above. + if(NOT SDL2_BUILDING_LIBRARY AND NOT TARGET SDL2::Main) + + if(SDL2_INCLUDE_DIR MATCHES ".framework" OR NOT SDL2MAIN_LIBRARY) + add_library(SDL2::Main INTERFACE IMPORTED) + set_property(TARGET SDL2::Main PROPERTY + INTERFACE_LINK_LIBRARIES SDL2::Core) + elseif(SDL2MAIN_LIBRARY) + # MinGW requires that the mingw32 library is specified before the + # libSDL2main.a static library when linking. + # The SDL2::MainInternal target is used internally to make sure that + # CMake respects this condition. + add_library(SDL2::MainInternal UNKNOWN IMPORTED) + set_property(TARGET SDL2::MainInternal PROPERTY + IMPORTED_LOCATION "${SDL2MAIN_LIBRARY}") + set_property(TARGET SDL2::MainInternal PROPERTY + INTERFACE_LINK_LIBRARIES SDL2::Core) + + add_library(SDL2::Main INTERFACE IMPORTED) + + if(MINGW) + # MinGW needs an additional link flag '-mwindows' and link to mingw32 + set_property(TARGET SDL2::Main PROPERTY + INTERFACE_LINK_LIBRARIES "mingw32" "-mwindows") + endif() + + set_property(TARGET SDL2::Main APPEND PROPERTY + INTERFACE_LINK_LIBRARIES SDL2::MainInternal) + endif() + + endif() +endif() diff --git a/docs/user/Basics.md b/docs/user/Basics.md index 5101f4d9c3..b8719a9310 100644 --- a/docs/user/Basics.md +++ b/docs/user/Basics.md @@ -26,6 +26,7 @@ Eden will store configuration files in the following directories: - **Android**: Data is stored internally. - **Linux, macOS, FreeBSD, Solaris, OpenBSD**: `$XDG_DATA_HOME`, `$XDG_CACHE_HOME`, `$XDG_CONFIG_HOME`. - **HaikuOS**: `/boot/home/config/settings/eden` +- **PlayStation 4**: `/data/eden` If a `user` directory is present in the current working directory, that will override all global configuration directories and the emulator will use that instead. diff --git a/src/common/fs/path_util.cpp b/src/common/fs/path_util.cpp index 3f928ac327..0cacb50596 100644 --- a/src/common/fs/path_util.cpp +++ b/src/common/fs/path_util.cpp @@ -130,6 +130,10 @@ public: ASSERT(!eden_path.empty()); eden_path_cache = eden_path / CACHE_DIR; eden_path_config = eden_path / CONFIG_DIR; +#elif defined(__OPENORBIS__) + eden_path = "/data/eden"; + eden_path_cache = eden_path / CACHE_DIR; + eden_path_config = eden_path / CONFIG_DIR; #else eden_path = GetCurrentDir() / PORTABLE_DIR; if (!Exists(eden_path) || !IsDir(eden_path)) { diff --git a/src/common/host_memory.cpp b/src/common/host_memory.cpp index a75152eec0..55c4a914e0 100644 --- a/src/common/host_memory.cpp +++ b/src/common/host_memory.cpp @@ -495,9 +495,12 @@ class HostMemory::Impl { public: explicit Impl(size_t backing_size_, size_t virtual_size_) : backing_size{backing_size_}, virtual_size{virtual_size_} { +#ifdef __OPENORBIS__ + +#else long page_size = sysconf(_SC_PAGESIZE); - ASSERT_MSG(page_size == 0x1000, "page size {:#x} is incompatible with 4K paging", - page_size); + ASSERT_MSG(page_size == 0x1000, "page size {:#x} is incompatible with 4K paging", page_size); +#endif // Backing memory initialization #if defined(__sun__) || defined(__HAIKU__) || defined(__NetBSD__) || defined(__DragonFly__) fd = shm_open_anon(O_RDWR | O_CREAT | O_EXCL | O_NOFOLLOW, 0600); diff --git a/src/common/memory_detect.cpp b/src/common/memory_detect.cpp index 074c02a9c3..8bd544e3e2 100644 --- a/src/common/memory_detect.cpp +++ b/src/common/memory_detect.cpp @@ -43,7 +43,9 @@ static MemoryInfo Detect() { sysctlbyname("vm.swapusage", &vmusage, &sizeof_vmusage, nullptr, 0); mem_info.TotalPhysicalMemory = ramsize; mem_info.TotalSwapMemory = vmusage.xsu_total; -#elif defined(__FreeBSD__) && !defined(__OPENORBIS__) +#elif defined(__OPENORBIS__) + mem_info.TotalPhysicalMemory = mem_info.TotalSwapMemory = 0; +#elif defined(__FreeBSD__) u_long physmem, swap_total; std::size_t sizeof_u_long = sizeof(u_long); // sysctlbyname(const char *, void *, size_t *, const void *, size_t); diff --git a/src/input_common/drivers/joycon.cpp b/src/input_common/drivers/joycon.cpp index fb2d75e384..83a57f96a7 100644 --- a/src/input_common/drivers/joycon.cpp +++ b/src/input_common/drivers/joycon.cpp @@ -23,12 +23,14 @@ Joycons::Joycons(const std::string& input_engine_) : InputEngine(input_engine_) return; } LOG_INFO(Input, "Joycon driver Initialization started"); - const int init_res = SDL_hid_init(); - if (init_res == 0) { +#if SDL_VERSION_ATLEAST(2, 26, 4) + int const res = SDL_hid_init(); + if (res == 0) { Setup(); } else { - LOG_ERROR(Input, "Hidapi could not be initialized. failed with error = {}", init_res); + LOG_ERROR(Input, "Hidapi could not be initialized. failed with error = {}", res); } +#endif } Joycons::~Joycons() { @@ -55,7 +57,9 @@ void Joycons::Reset() { } device->Stop(); } +#if SDL_VERSION_ATLEAST(2, 26, 4) SDL_hid_exit(); +#endif } void Joycons::Setup() { @@ -80,9 +84,9 @@ void Joycons::Setup() { } void Joycons::ScanThread(std::stop_token stop_token) { +#if SDL_VERSION_ATLEAST(2, 26, 4) constexpr u16 nintendo_vendor_id = 0x057e; Common::SetCurrentThreadName("JoyconScanThread"); - do { SDL_hid_device_info* devs = SDL_hid_enumerate(nintendo_vendor_id, 0x0); SDL_hid_device_info* cur_dev = devs; @@ -98,6 +102,7 @@ void Joycons::ScanThread(std::stop_token stop_token) { SDL_hid_free_enumeration(devs); } while (Common::StoppableTimedWait(stop_token, std::chrono::seconds{5})); +#endif } bool Joycons::IsDeviceNew(SDL_hid_device_info* device_info) const { diff --git a/src/input_common/drivers/joycon.h b/src/input_common/drivers/joycon.h index 112e970e15..cc07958a0f 100644 --- a/src/input_common/drivers/joycon.h +++ b/src/input_common/drivers/joycon.h @@ -6,7 +6,14 @@ #include #include #include -#include + +#include +#if SDL_VERSION_ATLEAST(2, 26, 4) +# include +#else +struct SDL_hid_device; +struct SDL_hid_device_info; +#endif #include "input_common/input_engine.h" diff --git a/src/input_common/drivers/sdl_driver.cpp b/src/input_common/drivers/sdl_driver.cpp index 81b0a2313a..93f7d5c1ea 100644 --- a/src/input_common/drivers/sdl_driver.cpp +++ b/src/input_common/drivers/sdl_driver.cpp @@ -42,6 +42,7 @@ public: } void EnableMotion() { +#if SDL_VERSION_ATLEAST(2, 26, 4) if (!sdl_controller) { return; } @@ -58,12 +59,14 @@ public: if (has_gyro) { SDL_GameControllerSetSensorEnabled(controller, SDL_SENSOR_GYRO, SDL_TRUE); } +#endif } bool HasMotion() const { return has_gyro || has_accel; } +#if SDL_VERSION_ATLEAST(2, 26, 4) bool UpdateMotion(SDL_ControllerSensorEvent event) { constexpr float gravity_constant = 9.80665f; std::scoped_lock lock{mutex}; @@ -105,6 +108,7 @@ public: motion.delta_timestamp = time_difference * 1000; return true; } +#endif const BasicMotion& GetMotion() const { return motion; @@ -149,13 +153,15 @@ public: } bool HasHDRumble() const { +#if SDL_VERSION_ATLEAST(2, 26, 4) if (sdl_controller) { - const auto type = SDL_GameControllerGetType(sdl_controller.get()); + auto const type = SDL_GameControllerGetType(sdl_controller.get()); return (type == SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO) || (type == SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_LEFT) || (type == SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT) || (type == SDL_CONTROLLER_TYPE_PS5); } +#endif return false; } @@ -252,26 +258,21 @@ public: } std::string GetControllerName() const { +#if SDL_VERSION_ATLEAST(2, 26, 4) if (sdl_controller) { switch (SDL_GameControllerGetType(sdl_controller.get())) { - case SDL_CONTROLLER_TYPE_XBOX360: - return "Xbox 360 Controller"; - case SDL_CONTROLLER_TYPE_XBOXONE: - return "Xbox One Controller"; - case SDL_CONTROLLER_TYPE_PS3: - return "DualShock 3 Controller"; - case SDL_CONTROLLER_TYPE_PS4: - return "DualShock 4 Controller"; - case SDL_CONTROLLER_TYPE_PS5: - return "DualSense Controller"; + case SDL_CONTROLLER_TYPE_XBOX360: return "Xbox 360 Controller"; + case SDL_CONTROLLER_TYPE_XBOXONE: return "Xbox One Controller"; + case SDL_CONTROLLER_TYPE_PS3: return "DualShock 3 Controller"; + case SDL_CONTROLLER_TYPE_PS4: return "DualShock 4 Controller"; + case SDL_CONTROLLER_TYPE_PS5: return "DualSense Controller"; default: + if (auto const name = SDL_GameControllerName(sdl_controller.get()); name) + return name; break; } - const auto name = SDL_GameControllerName(sdl_controller.get()); - if (name) { - return name; - } } +#endif if (sdl_joystick) { const auto name = SDL_JoystickName(sdl_joystick.get()); @@ -456,6 +457,7 @@ void SDLDriver::HandleGameControllerEvent(const SDL_Event& event) { } break; } +#if SDL_VERSION_ATLEAST(2, 26, 4) case SDL_CONTROLLERSENSORUPDATE: { if (auto joystick = GetSDLJoystickBySDLID(event.csensor.which)) { if (joystick->UpdateMotion(event.csensor)) { @@ -472,6 +474,7 @@ void SDLDriver::HandleGameControllerEvent(const SDL_Event& event) { } break; } +#endif case SDL_JOYDEVICEREMOVED: LOG_DEBUG(Input, "Controller removed with Instance_ID {}", event.jdevice.which); CloseJoystick(SDL_JoystickFromInstanceID(event.jdevice.which)); @@ -489,6 +492,7 @@ void SDLDriver::CloseJoysticks() { } SDLDriver::SDLDriver(std::string input_engine_) : InputEngine(std::move(input_engine_)) { +#if SDL_VERSION_ATLEAST(2, 26, 4) // Set our application name. Currently passed to DBus by SDL and visible to the user through // their desktop environment. SDL_SetHint(SDL_HINT_APP_NAME, "Eden"); @@ -529,6 +533,7 @@ SDLDriver::SDLDriver(std::string input_engine_) : InputEngine(std::move(input_en // Disable hidapi driver for xbox. Already default on Windows, this causes conflict with native // driver on Linux. SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_XBOX, "0"); +#endif // If the frontend is going to manage the event loop, then we don't start one here start_thread = SDL_WasInit(SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER) == 0; @@ -833,6 +838,7 @@ ButtonBindings SDLDriver::GetDefaultButtonBinding( auto slr_button = SDL_CONTROLLER_BUTTON_LEFTSHOULDER; auto srr_button = SDL_CONTROLLER_BUTTON_RIGHTSHOULDER; +#if SDL_VERSION_ATLEAST(2, 26, 4) if (joystick->IsJoyconLeft()) { sll_button = SDL_CONTROLLER_BUTTON_PADDLE2; srl_button = SDL_CONTROLLER_BUTTON_PADDLE4; @@ -841,6 +847,7 @@ ButtonBindings SDLDriver::GetDefaultButtonBinding( slr_button = SDL_CONTROLLER_BUTTON_PADDLE3; srr_button = SDL_CONTROLLER_BUTTON_PADDLE1; } +#endif return { std::pair{Settings::NativeButton::A, SDL_CONTROLLER_BUTTON_B}, @@ -862,7 +869,9 @@ ButtonBindings SDLDriver::GetDefaultButtonBinding( {Settings::NativeButton::SLRight, slr_button}, {Settings::NativeButton::SRRight, srr_button}, {Settings::NativeButton::Home, SDL_CONTROLLER_BUTTON_GUIDE}, +#if SDL_VERSION_ATLEAST(2, 26, 4) {Settings::NativeButton::Screenshot, SDL_CONTROLLER_BUTTON_MISC1}, +#endif }; } diff --git a/src/input_common/helpers/joycon_driver.cpp b/src/input_common/helpers/joycon_driver.cpp index 0dd1c958a2..10c2878cea 100644 --- a/src/input_common/helpers/joycon_driver.cpp +++ b/src/input_common/helpers/joycon_driver.cpp @@ -38,8 +38,8 @@ Common::Input::DriverResult JoyconDriver::RequestDeviceAccess(SDL_hid_device_inf return Common::Input::DriverResult::UnsupportedControllerType; } - hidapi_handle->handle = - SDL_hid_open(device_info->vendor_id, device_info->product_id, device_info->serial_number); +#if SDL_VERSION_ATLEAST(2, 26, 4) + hidapi_handle->handle = SDL_hid_open(device_info->vendor_id, device_info->product_id, device_info->serial_number); std::memcpy(&handle_serial_number, device_info->serial_number, 15); if (!hidapi_handle->handle) { LOG_ERROR(Input, "Yuzu can't gain access to this device: ID {:04X}:{:04X}.", @@ -48,6 +48,9 @@ Common::Input::DriverResult JoyconDriver::RequestDeviceAccess(SDL_hid_device_inf } SDL_hid_set_nonblocking(hidapi_handle->handle, 1); return Common::Input::DriverResult::Success; +#else + return Common::Input::DriverResult::UnsupportedControllerType; +#endif } Common::Input::DriverResult JoyconDriver::InitializeDevice() { @@ -138,8 +141,6 @@ void JoyconDriver::InputThread(std::stop_token stop_token) { Common::SetCurrentThreadName("JoyconInput"); input_thread_running = true; - // Max update rate is 5ms, ensure we are always able to read a bit faster - constexpr int ThreadDelay = 3; std::vector buffer(MaxBufferSize); while (!stop_token.stop_requested()) { @@ -150,14 +151,17 @@ void JoyconDriver::InputThread(std::stop_token stop_token) { continue; } +#if SDL_VERSION_ATLEAST(2, 26, 4) + // Max update rate is 5ms, ensure we are always able to read a bit faster + int constexpr thread_delay = 3; // By disabling the input thread we can ensure custom commands will succeed as no package is // skipped if (!disable_input_thread) { - status = SDL_hid_read_timeout(hidapi_handle->handle, buffer.data(), buffer.size(), - ThreadDelay); + status = SDL_hid_read_timeout(hidapi_handle->handle, buffer.data(), buffer.size(), thread_delay); } else { - std::this_thread::sleep_for(std::chrono::milliseconds(ThreadDelay)); + std::this_thread::sleep_for(std::chrono::milliseconds(thread_delay)); } +#endif if (IsPayloadCorrect(status, buffer)) { OnNewData(buffer); @@ -690,19 +694,18 @@ void JoyconDriver::SetCallbacks(const JoyconCallbacks& callbacks) { joycon_poller->SetCallbacks(callbacks); } -Common::Input::DriverResult JoyconDriver::GetDeviceType(SDL_hid_device_info* device_info, - ControllerType& controller_type) { +Common::Input::DriverResult JoyconDriver::GetDeviceType(SDL_hid_device_info* device_info, ControllerType& controller_type) { +#if SDL_VERSION_ATLEAST(2, 26, 4) static constexpr std::array, 6> supported_devices{ std::pair{0x2006, ControllerType::Left}, {0x2007, ControllerType::Right}, {0x2009, ControllerType::Pro}, }; - constexpr u16 nintendo_vendor_id = 0x057e; + constexpr u16 nintendo_vendor_id = 0x057e; controller_type = ControllerType::None; - if (device_info->vendor_id != nintendo_vendor_id) { + if (device_info->vendor_id != nintendo_vendor_id) return Common::Input::DriverResult::UnsupportedControllerType; - } for (const auto& [product_id, type] : supported_devices) { if (device_info->product_id == static_cast(product_id)) { @@ -710,16 +713,20 @@ Common::Input::DriverResult JoyconDriver::GetDeviceType(SDL_hid_device_info* dev return Common::Input::DriverResult::Success; } } +#endif return Common::Input::DriverResult::UnsupportedControllerType; } -Common::Input::DriverResult JoyconDriver::GetSerialNumber(SDL_hid_device_info* device_info, - SerialNumber& serial_number) { +Common::Input::DriverResult JoyconDriver::GetSerialNumber(SDL_hid_device_info* device_info, SerialNumber& serial_number) { +#if SDL_VERSION_ATLEAST(2, 26, 4) if (device_info->serial_number == nullptr) { return Common::Input::DriverResult::Unknown; } std::memcpy(&serial_number, device_info->serial_number, 15); return Common::Input::DriverResult::Success; +#else + return Common::Input::DriverResult::Unknown; +#endif } } // namespace InputCommon::Joycon diff --git a/src/input_common/helpers/joycon_protocol/common_protocol.cpp b/src/input_common/helpers/joycon_protocol/common_protocol.cpp index a6eecf9802..669e89f064 100644 --- a/src/input_common/helpers/joycon_protocol/common_protocol.cpp +++ b/src/input_common/helpers/joycon_protocol/common_protocol.cpp @@ -15,11 +15,15 @@ u8 JoyconCommonProtocol::GetCounter() { } void JoyconCommonProtocol::SetBlocking() { +#if SDL_VERSION_ATLEAST(2, 26, 4) SDL_hid_set_nonblocking(hidapi_handle->handle, 0); +#endif } void JoyconCommonProtocol::SetNonBlocking() { +#if SDL_VERSION_ATLEAST(2, 26, 4) SDL_hid_set_nonblocking(hidapi_handle->handle, 1); +#endif } Common::Input::DriverResult JoyconCommonProtocol::GetDeviceType(ControllerType& controller_type) { @@ -35,26 +39,23 @@ Common::Input::DriverResult JoyconCommonProtocol::GetDeviceType(ControllerType& return result; } -Common::Input::DriverResult JoyconCommonProtocol::CheckDeviceAccess( - SDL_hid_device_info* device_info) { +Common::Input::DriverResult JoyconCommonProtocol::CheckDeviceAccess(SDL_hid_device_info* device_info) { ControllerType controller_type{ControllerType::None}; const auto result = GetDeviceType(controller_type); - if (result != Common::Input::DriverResult::Success || controller_type == ControllerType::None) { return Common::Input::DriverResult::UnsupportedControllerType; } - - hidapi_handle->handle = - SDL_hid_open(device_info->vendor_id, device_info->product_id, device_info->serial_number); - +#if SDL_VERSION_ATLEAST(2, 26, 4) + hidapi_handle->handle = SDL_hid_open(device_info->vendor_id, device_info->product_id, device_info->serial_number); if (!hidapi_handle->handle) { - LOG_ERROR(Input, "Yuzu can't gain access to this device: ID {:04X}:{:04X}.", - device_info->vendor_id, device_info->product_id); + LOG_ERROR(Input, "Yuzu can't gain access to this device: ID {:04X}:{:04X}.", device_info->vendor_id, device_info->product_id); return Common::Input::DriverResult::HandleInUse; } - SetNonBlocking(); return Common::Input::DriverResult::Success; +#else + return Common::Input::DriverResult::UnsupportedControllerType; +#endif } Common::Input::DriverResult JoyconCommonProtocol::SetReportMode(ReportMode report_mode) { @@ -63,21 +64,21 @@ Common::Input::DriverResult JoyconCommonProtocol::SetReportMode(ReportMode repor } Common::Input::DriverResult JoyconCommonProtocol::SendRawData(std::span buffer) { - const auto result = SDL_hid_write(hidapi_handle->handle, buffer.data(), buffer.size()); - - if (result == -1) { +#if SDL_VERSION_ATLEAST(2, 26, 4) + auto const result = SDL_hid_write(hidapi_handle->handle, buffer.data(), buffer.size()); + if (result == -1) return Common::Input::DriverResult::ErrorWritingData; - } - return Common::Input::DriverResult::Success; +#else + return Common::Input::DriverResult::ErrorWritingData; +#endif } -Common::Input::DriverResult JoyconCommonProtocol::GetSubCommandResponse( - SubCommand sc, SubCommandResponse& output) { +Common::Input::DriverResult JoyconCommonProtocol::GetSubCommandResponse(SubCommand sc, SubCommandResponse& output) { +#if SDL_VERSION_ATLEAST(2, 26, 4) constexpr int timeout_mili = 66; constexpr int MaxTries = 10; int tries = 0; - do { int result = SDL_hid_read_timeout(hidapi_handle->handle, reinterpret_cast(&output), sizeof(SubCommandResponse), timeout_mili); @@ -88,9 +89,8 @@ Common::Input::DriverResult JoyconCommonProtocol::GetSubCommandResponse( if (tries++ > MaxTries) { return Common::Input::DriverResult::Timeout; } - } while (output.input_report.report_mode != ReportMode::SUBCMD_REPLY && - output.sub_command != sc); - + } while (output.input_report.report_mode != ReportMode::SUBCMD_REPLY && output.sub_command != sc); +#endif return Common::Input::DriverResult::Success; } @@ -218,12 +218,11 @@ Common::Input::DriverResult JoyconCommonProtocol::ConfigureMCU(const MCUConfig& return result; } -Common::Input::DriverResult JoyconCommonProtocol::GetMCUDataResponse(ReportMode report_mode, - MCUCommandResponse& output) { +Common::Input::DriverResult JoyconCommonProtocol::GetMCUDataResponse(ReportMode report_mode, MCUCommandResponse& output) { +#if SDL_VERSION_ATLEAST(2, 26, 4) constexpr int TimeoutMili = 200; constexpr int MaxTries = 9; int tries = 0; - do { int result = SDL_hid_read_timeout(hidapi_handle->handle, reinterpret_cast(&output), sizeof(MCUCommandResponse), TimeoutMili); @@ -234,9 +233,8 @@ Common::Input::DriverResult JoyconCommonProtocol::GetMCUDataResponse(ReportMode if (tries++ > MaxTries) { return Common::Input::DriverResult::Timeout; } - } while (output.input_report.report_mode != report_mode || - output.mcu_report == MCUReport::EmptyAwaitingCmd); - + } while (output.input_report.report_mode != report_mode || output.mcu_report == MCUReport::EmptyAwaitingCmd); +#endif return Common::Input::DriverResult::Success; } diff --git a/src/input_common/helpers/joycon_protocol/joycon_types.h b/src/input_common/helpers/joycon_protocol/joycon_types.h index 792f124e14..9be84b36a2 100644 --- a/src/input_common/helpers/joycon_protocol/joycon_types.h +++ b/src/input_common/helpers/joycon_protocol/joycon_types.h @@ -10,7 +10,14 @@ #include #include -#include + +#include +#if SDL_VERSION_ATLEAST(2, 26, 4) +# include +#else +struct SDL_hid_device; +struct SDL_hid_device_info; +#endif #include "common/bit_field.h" #include "common/common_funcs.h" diff --git a/src/yuzu_cmd/CMakeLists.txt b/src/yuzu_cmd/CMakeLists.txt index 10b55fd865..605ef410a8 100644 --- a/src/yuzu_cmd/CMakeLists.txt +++ b/src/yuzu_cmd/CMakeLists.txt @@ -42,7 +42,8 @@ target_link_libraries(yuzu-cmd PRIVATE ${PLATFORM_LIBRARIES} Threads::Threads) create_resource("../../dist/eden.bmp" "yuzu_cmd/yuzu_icon.h" "yuzu_icon") target_include_directories(yuzu-cmd PRIVATE ${RESOURCES_DIR}) -target_link_libraries(yuzu-cmd PRIVATE SDL2::SDL2) +target_include_directories(yuzu-cmd PRIVATE ${CMAKE_SYSROOT}/include/SDL2) +target_link_libraries(yuzu-cmd PRIVATE SDL2) if(UNIX AND NOT APPLE) install(TARGETS yuzu-cmd) diff --git a/src/yuzu_cmd/yuzu.cpp b/src/yuzu_cmd/yuzu.cpp index 869904b60f..02f2aee856 100644 --- a/src/yuzu_cmd/yuzu.cpp +++ b/src/yuzu_cmd/yuzu.cpp @@ -59,6 +59,7 @@ STUB_WEAK(ZSTD_trace_compress_begin) STUB_WEAK(ZSTD_trace_compress_end) STUB_WEAK(ZSTD_trace_decompress_begin) STUB_WEAK(ZSTD_trace_decompress_end) +FILE* __stderrp = stdout; # undef STUB_WEAK #endif #ifdef _WIN32 From 692dd09dda4e75dd1fbf7581932dd8a6ccf15001 Mon Sep 17 00:00:00 2001 From: lizzie Date: Fri, 5 Dec 2025 03:51:05 +0000 Subject: [PATCH 14/78] try to fix the paths --- src/common/fs/fs.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/common/fs/fs.cpp b/src/common/fs/fs.cpp index 174aed49b8..c86a8e565d 100644 --- a/src/common/fs/fs.cpp +++ b/src/common/fs/fs.cpp @@ -171,11 +171,14 @@ bool CreateDir(const fs::path& path) { return false; } + // TODO: Maybe this is what causes death? +#ifndef __OPENORBIS__ if (!Exists(path.parent_path())) { LOG_ERROR(Common_Filesystem, "Parent directory of path={} does not exist", PathToUTF8String(path)); return false; } +#endif if (IsDir(path)) { LOG_DEBUG(Common_Filesystem, "Filesystem object at path={} exists and is a directory", From c5ac1f9cc24fd651942259e094d9db266adea076 Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 1 Dec 2025 10:31:03 +0000 Subject: [PATCH 15/78] disable fastmem --- src/core/arm/dynarmic/arm_dynarmic_32.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index 912a15475b..6fafbd9042 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp @@ -286,7 +286,7 @@ void ArmDynarmic32::MakeJit(Common::PageTable* page_table) { // Curated optimizations case Settings::CpuAccuracy::Auto: config.unsafe_optimizations = true; -#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__sun__) || defined(__HAIKU__) || defined(__DragonFly__) || defined(__NetBSD__) +#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__sun__) || defined(__HAIKU__) || defined(__DragonFly__) || defined(__NetBSD__) || defined(__OPENORBIS__) config.fastmem_pointer = std::nullopt; config.fastmem_exclusive_access = false; #endif From 98a7a81396a35e691bc5401feb2b86dd96f7fb6c Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 1 Dec 2025 10:58:26 +0000 Subject: [PATCH 16/78] (likely) fixes for virtual dmem? --- src/common/host_memory.cpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/common/host_memory.cpp b/src/common/host_memory.cpp index 55c4a914e0..0ff5807d9a 100644 --- a/src/common/host_memory.cpp +++ b/src/common/host_memory.cpp @@ -34,15 +34,19 @@ // FreeBSD #ifndef MAP_NORESERVE -#define MAP_NORESERVE 0 +# define MAP_NORESERVE 0 #endif // Solaris 11 and illumos #ifndef MAP_ALIGNED_SUPER -#define MAP_ALIGNED_SUPER 0 +# define MAP_ALIGNED_SUPER 0 #endif // macOS #ifndef MAP_ANONYMOUS -#define MAP_ANONYMOUS MAP_ANON +# define MAP_ANONYMOUS MAP_ANON +#endif +// PlayStation 4 +#ifndef MAP_SYSTEM +# define MAP_SYSTEM 0 #endif #endif // ^^^ POSIX ^^^ @@ -434,8 +438,8 @@ static void* ChooseVirtualBase(size_t virtual_size) { #else static void* ChooseVirtualBase(size_t virtual_size) { -#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) || defined(__sun__) || defined(__HAIKU__) || defined(__managarm__) || defined(__AIX__) - void* virtual_base = mmap(nullptr, virtual_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE | MAP_ALIGNED_SUPER, -1, 0); +#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) || defined(__sun__) || defined(__HAIKU__) || defined(__managarm__) || defined(__AIX__) || defined(__OPENORBIS__) + void* virtual_base = mmap(nullptr, virtual_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE | MAP_ALIGNED_SUPER | MAP_SYSTEM, -1, 0); if (virtual_base != MAP_FAILED) return virtual_base; #endif @@ -534,13 +538,13 @@ public: } if (use_anon) { LOG_WARNING(Common_Memory, "Using private mappings instead of shared ones"); - backing_base = static_cast(mmap(nullptr, backing_size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0)); + backing_base = static_cast(mmap(nullptr, backing_size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE | MAP_SYSTEM, -1, 0)); if (fd > 0) { fd = -1; close(fd); } } else { - backing_base = static_cast(mmap(nullptr, backing_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)); + backing_base = static_cast(mmap(nullptr, backing_size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_SYSTEM, fd, 0)); } ASSERT_MSG(backing_base != MAP_FAILED, "mmap failed: {}", strerror(errno)); From 9f2447357b6e27401c41e6c706aea173d39940a1 Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 1 Dec 2025 18:54:57 +0000 Subject: [PATCH 17/78] MAP_SYSTEM --- src/common/host_memory.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/common/host_memory.cpp b/src/common/host_memory.cpp index 0ff5807d9a..f0262dac15 100644 --- a/src/common/host_memory.cpp +++ b/src/common/host_memory.cpp @@ -45,8 +45,15 @@ # define MAP_ANONYMOUS MAP_ANON #endif // PlayStation 4 +// Flag needs to be undef-ed on non PS4 since it has different semantics +// on some platforms. #ifndef MAP_SYSTEM -# define MAP_SYSTEM 0 +# ifdef __OPENORBIS__ +# define MAP_SYSTEM 0x2000 +# else +# undef MAP_SYSTEM +# define MAP_SYSTEM 0 +# endif #endif #endif // ^^^ POSIX ^^^ From 9051fcb33b6fe34d3dd74f75f23506cfa746ee52 Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 1 Dec 2025 19:29:40 +0000 Subject: [PATCH 18/78] more memory shit --- src/common/host_memory.cpp | 12 +++++++++--- src/yuzu_cmd/yuzu.cpp | 3 +-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/common/host_memory.cpp b/src/common/host_memory.cpp index f0262dac15..3181eb96cf 100644 --- a/src/common/host_memory.cpp +++ b/src/common/host_memory.cpp @@ -30,6 +30,8 @@ #include #include #include +#elif defined(__OPENORBIS__) +#include #endif // FreeBSD @@ -445,12 +447,16 @@ static void* ChooseVirtualBase(size_t virtual_size) { #else static void* ChooseVirtualBase(size_t virtual_size) { -#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) || defined(__sun__) || defined(__HAIKU__) || defined(__managarm__) || defined(__AIX__) || defined(__OPENORBIS__) - void* virtual_base = mmap(nullptr, virtual_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE | MAP_ALIGNED_SUPER | MAP_SYSTEM, -1, 0); +#if defined(__OPENORBIS__) + return mmap(nullptr, virtual_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_SYSTEM, -1, 0); +#elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) || defined(__sun__) || defined(__HAIKU__) || defined(__managarm__) || defined(__AIX__) + void* virtual_base = mmap(nullptr, virtual_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE | MAP_ALIGNED_SUPER, -1, 0); if (virtual_base != MAP_FAILED) return virtual_base; -#endif return mmap(nullptr, virtual_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0); +#else + return mmap(nullptr, virtual_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0); +#endif } #endif diff --git a/src/yuzu_cmd/yuzu.cpp b/src/yuzu_cmd/yuzu.cpp index 02f2aee856..f58d805f5b 100644 --- a/src/yuzu_cmd/yuzu.cpp +++ b/src/yuzu_cmd/yuzu.cpp @@ -61,8 +61,7 @@ STUB_WEAK(ZSTD_trace_decompress_begin) STUB_WEAK(ZSTD_trace_decompress_end) FILE* __stderrp = stdout; # undef STUB_WEAK -#endif -#ifdef _WIN32 +#elif defined(_WIN32) extern "C" { // tells Nvidia and AMD drivers to use the dedicated GPU by default on laptops with switchable // graphics From 5d1e74533cdbe9ef943aad00e82b7f1ce14f3e16 Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 1 Dec 2025 20:07:43 +0000 Subject: [PATCH 19/78] force NO fastmem --- src/common/host_memory.cpp | 19 +++++++++++------- src/common/virtual_buffer.cpp | 37 +++++++++++++++++++++++++---------- 2 files changed, 39 insertions(+), 17 deletions(-) diff --git a/src/common/host_memory.cpp b/src/common/host_memory.cpp index 3181eb96cf..1665df2a54 100644 --- a/src/common/host_memory.cpp +++ b/src/common/host_memory.cpp @@ -446,16 +446,14 @@ static void* ChooseVirtualBase(size_t virtual_size) { #else -static void* ChooseVirtualBase(size_t virtual_size) { -#if defined(__OPENORBIS__) - return mmap(nullptr, virtual_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_SYSTEM, -1, 0); -#elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) || defined(__sun__) || defined(__HAIKU__) || defined(__managarm__) || defined(__AIX__) - void* virtual_base = mmap(nullptr, virtual_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE | MAP_ALIGNED_SUPER, -1, 0); +static void* ChooseVirtualBase(size_t size) { +#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) || defined(__sun__) || defined(__HAIKU__) || defined(__managarm__) || defined(__AIX__) + void* virtual_base = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE | MAP_ALIGNED_SUPER, -1, 0); if (virtual_base != MAP_FAILED) return virtual_base; - return mmap(nullptr, virtual_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0); + return mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0); #else - return mmap(nullptr, virtual_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0); + return mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0); #endif } @@ -690,6 +688,12 @@ private: #endif // ^^^ POSIX ^^^ HostMemory::HostMemory(size_t backing_size_, size_t virtual_size_) : backing_size(backing_size_), virtual_size(virtual_size_) { +#ifdef __OPENORBIS__ + LOG_WARNING(HW_Memory, "Platform doesn't support fastmem"); + fallback_buffer = std::make_unique>(backing_size); + backing_base = fallback_buffer->data(); + virtual_base = nullptr; +#else // Try to allocate a fastmem arena. // The implementation will fail with std::bad_alloc on errors. impl = std::make_unique(AlignUp(backing_size, PageAlignment), AlignUp(virtual_size, PageAlignment) + HugePageSize); @@ -700,6 +704,7 @@ HostMemory::HostMemory(size_t backing_size_, size_t virtual_size_) : backing_siz virtual_base = reinterpret_cast(Common::AlignUp(uintptr_t(virtual_base), HugePageSize)); virtual_base_offset = virtual_base - impl->virtual_base; } +#endif } HostMemory::~HostMemory() = default; diff --git a/src/common/virtual_buffer.cpp b/src/common/virtual_buffer.cpp index 55ddfc243a..ef9113c557 100644 --- a/src/common/virtual_buffer.cpp +++ b/src/common/virtual_buffer.cpp @@ -6,6 +6,8 @@ #ifdef _WIN32 #include +#elif defined(__OPENORBIS__) +#include #else #include #endif @@ -17,23 +19,38 @@ namespace Common { void* AllocateMemoryPages(std::size_t size) noexcept { #ifdef _WIN32 - void* base = VirtualAlloc(nullptr, size, MEM_COMMIT, PAGE_READWRITE); + void* addr = VirtualAlloc(nullptr, size, MEM_COMMIT, PAGE_READWRITE); + ASSERT(addr != nullptr); +#elif defined(__OPENORBIS__) + u64 align = 16384; + void *addr = nullptr; + off_t direct_mem_off; + int32_t rc; + if ((rc = sceKernelAllocateDirectMemory(0, sceKernelGetDirectMemorySize(), size, align, 3, &direct_mem_off)) < 0) { + ASSERT(false && "sceKernelAllocateDirectMemory"); + return nullptr; + } + if ((rc = sceKernelMapDirectMemory(&addr, size, 0x33, 0, direct_mem_off, align)) < 0) { + ASSERT(false && "sceKernelMapDirectMemory"); + return nullptr; + } + ASSERT(addr != nullptr); #else - void* base = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); - if (base == MAP_FAILED) - base = nullptr; + void* addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); + ASSERT(addr != MAP_FAILED); #endif - ASSERT(base); - return base; + return addr; } -void FreeMemoryPages(void* base, [[maybe_unused]] std::size_t size) noexcept { - if (!base) +void FreeMemoryPages(void* addr, [[maybe_unused]] std::size_t size) noexcept { + if (!addr) return; #ifdef _WIN32 - ASSERT(VirtualFree(base, 0, MEM_RELEASE)); + VirtualFree(addr, 0, MEM_RELEASE) +#elif defined(__OPENORBIS__) #else - ASSERT(munmap(base, size) == 0); + int rc = munmap(addr, size); + ASSERT(rc == 0); #endif } From 6765e7cd17c35dce4de072d8b4167c79bc5f4460 Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 1 Dec 2025 20:21:16 +0000 Subject: [PATCH 20/78] make virtual buffer become an optional --- src/common/host_memory.cpp | 2 +- src/common/host_memory.h | 1 + src/common/virtual_buffer.h | 7 ++++--- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/common/host_memory.cpp b/src/common/host_memory.cpp index 1665df2a54..e84bdfc033 100644 --- a/src/common/host_memory.cpp +++ b/src/common/host_memory.cpp @@ -690,7 +690,7 @@ private: HostMemory::HostMemory(size_t backing_size_, size_t virtual_size_) : backing_size(backing_size_), virtual_size(virtual_size_) { #ifdef __OPENORBIS__ LOG_WARNING(HW_Memory, "Platform doesn't support fastmem"); - fallback_buffer = std::make_unique>(backing_size); + fallback_buffer.emplace(backing_size); backing_base = fallback_buffer->data(); virtual_base = nullptr; #else diff --git a/src/common/host_memory.h b/src/common/host_memory.h index 8dd30aa9de..31af3cc9f1 100644 --- a/src/common/host_memory.h +++ b/src/common/host_memory.h @@ -7,6 +7,7 @@ #pragma once #include +#include #include "common/common_funcs.h" #include "common/common_types.h" #include "common/virtual_buffer.h" diff --git a/src/common/virtual_buffer.h b/src/common/virtual_buffer.h index 4f6e3e6e5c..74cc3a66f9 100644 --- a/src/common/virtual_buffer.h +++ b/src/common/virtual_buffer.h @@ -32,9 +32,10 @@ public: VirtualBuffer(const VirtualBuffer&) = delete; VirtualBuffer& operator=(const VirtualBuffer&) = delete; - VirtualBuffer(VirtualBuffer&& other) noexcept - : alloc_size{std::exchange(other.alloc_size, 0)}, base_ptr{std::exchange(other.base_ptr), - nullptr} {} + VirtualBuffer(VirtualBuffer&& other) noexcept { + alloc_size = std::exchange(other.alloc_size, 0); + base_ptr = std::exchange(other.base_ptr, nullptr); + } VirtualBuffer& operator=(VirtualBuffer&& other) noexcept { alloc_size = std::exchange(other.alloc_size, 0); From 98ac8ab13ce78e3a6ad98ec5b90be7f32d94ced3 Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 1 Dec 2025 21:29:18 +0000 Subject: [PATCH 21/78] extra ps4 defs --- src/common/host_memory.cpp | 11 ----------- src/common/virtual_buffer.cpp | 29 +++++++++++++++-------------- src/core/device_memory.h | 13 ++++--------- 3 files changed, 19 insertions(+), 34 deletions(-) diff --git a/src/common/host_memory.cpp b/src/common/host_memory.cpp index e84bdfc033..8dce51763d 100644 --- a/src/common/host_memory.cpp +++ b/src/common/host_memory.cpp @@ -46,17 +46,6 @@ #ifndef MAP_ANONYMOUS # define MAP_ANONYMOUS MAP_ANON #endif -// PlayStation 4 -// Flag needs to be undef-ed on non PS4 since it has different semantics -// on some platforms. -#ifndef MAP_SYSTEM -# ifdef __OPENORBIS__ -# define MAP_SYSTEM 0x2000 -# else -# undef MAP_SYSTEM -# define MAP_SYSTEM 0 -# endif -#endif #endif // ^^^ POSIX ^^^ diff --git a/src/common/virtual_buffer.cpp b/src/common/virtual_buffer.cpp index ef9113c557..1d4929d233 100644 --- a/src/common/virtual_buffer.cpp +++ b/src/common/virtual_buffer.cpp @@ -14,6 +14,19 @@ #include "common/assert.h" #include "common/virtual_buffer.h" +#include "common/logging/log.h" + +// PlayStation 4 +// Flag needs to be undef-ed on non PS4 since it has different semantics +// on some platforms. +#ifdef __OPENORBIS__ +# ifndef MAP_SYSTEM +# define MAP_SYSTEM 0x2000 +# endif +# ifndef MAP_VOID +# define MAP_VOID 0x100 +# endif +#endif namespace Common { @@ -22,19 +35,8 @@ void* AllocateMemoryPages(std::size_t size) noexcept { void* addr = VirtualAlloc(nullptr, size, MEM_COMMIT, PAGE_READWRITE); ASSERT(addr != nullptr); #elif defined(__OPENORBIS__) - u64 align = 16384; - void *addr = nullptr; - off_t direct_mem_off; - int32_t rc; - if ((rc = sceKernelAllocateDirectMemory(0, sceKernelGetDirectMemorySize(), size, align, 3, &direct_mem_off)) < 0) { - ASSERT(false && "sceKernelAllocateDirectMemory"); - return nullptr; - } - if ((rc = sceKernelMapDirectMemory(&addr, size, 0x33, 0, direct_mem_off, align)) < 0) { - ASSERT(false && "sceKernelMapDirectMemory"); - return nullptr; - } - ASSERT(addr != nullptr); + void* addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); + ASSERT(addr != MAP_FAILED); #else void* addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); ASSERT(addr != MAP_FAILED); @@ -47,7 +49,6 @@ void FreeMemoryPages(void* addr, [[maybe_unused]] std::size_t size) noexcept { return; #ifdef _WIN32 VirtualFree(addr, 0, MEM_RELEASE) -#elif defined(__OPENORBIS__) #else int rc = munmap(addr, size); ASSERT(rc == 0); diff --git a/src/core/device_memory.h b/src/core/device_memory.h index 11bf0e3268..b96717871c 100644 --- a/src/core/device_memory.h +++ b/src/core/device_memory.h @@ -26,27 +26,22 @@ public: template Common::PhysicalAddress GetPhysicalAddr(const T* ptr) const { - return (reinterpret_cast(ptr) - - reinterpret_cast(buffer.BackingBasePointer())) + - DramMemoryMap::Base; + return (uintptr_t(ptr) - uintptr_t(buffer.BackingBasePointer())) + DramMemoryMap::Base; } template PAddr GetRawPhysicalAddr(const T* ptr) const { - return static_cast(reinterpret_cast(ptr) - - reinterpret_cast(buffer.BackingBasePointer())); + return PAddr(uintptr_t(ptr) - uintptr_t(buffer.BackingBasePointer())); } template T* GetPointer(Common::PhysicalAddress addr) { - return reinterpret_cast(buffer.BackingBasePointer() + - (GetInteger(addr) - DramMemoryMap::Base)); + return reinterpret_cast(buffer.BackingBasePointer() + (GetInteger(addr) - DramMemoryMap::Base)); } template const T* GetPointer(Common::PhysicalAddress addr) const { - return reinterpret_cast(buffer.BackingBasePointer() + - (GetInteger(addr) - DramMemoryMap::Base)); + return reinterpret_cast(buffer.BackingBasePointer() + (GetInteger(addr) - DramMemoryMap::Base)); } template From 81b953affc61dc2e22170ca8e11db1bfa66dfa9e Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 1 Dec 2025 21:35:01 +0000 Subject: [PATCH 22/78] evil haxx --- src/common/host_memory.cpp | 4 ++-- src/common/virtual_buffer.cpp | 2 -- src/core/hle/kernel/board/nintendo/nx/k_system_control.cpp | 4 ++++ 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/common/host_memory.cpp b/src/common/host_memory.cpp index 8dce51763d..4691c99e54 100644 --- a/src/common/host_memory.cpp +++ b/src/common/host_memory.cpp @@ -538,13 +538,13 @@ public: } if (use_anon) { LOG_WARNING(Common_Memory, "Using private mappings instead of shared ones"); - backing_base = static_cast(mmap(nullptr, backing_size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE | MAP_SYSTEM, -1, 0)); + backing_base = static_cast(mmap(nullptr, backing_size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0)); if (fd > 0) { fd = -1; close(fd); } } else { - backing_base = static_cast(mmap(nullptr, backing_size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_SYSTEM, fd, 0)); + backing_base = static_cast(mmap(nullptr, backing_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)); } ASSERT_MSG(backing_base != MAP_FAILED, "mmap failed: {}", strerror(errno)); diff --git a/src/common/virtual_buffer.cpp b/src/common/virtual_buffer.cpp index 1d4929d233..5a05f12d47 100644 --- a/src/common/virtual_buffer.cpp +++ b/src/common/virtual_buffer.cpp @@ -6,8 +6,6 @@ #ifdef _WIN32 #include -#elif defined(__OPENORBIS__) -#include #else #include #endif diff --git a/src/core/hle/kernel/board/nintendo/nx/k_system_control.cpp b/src/core/hle/kernel/board/nintendo/nx/k_system_control.cpp index 1446653916..2e6a6aa364 100644 --- a/src/core/hle/kernel/board/nintendo/nx/k_system_control.cpp +++ b/src/core/hle/kernel/board/nintendo/nx/k_system_control.cpp @@ -85,7 +85,11 @@ size_t KSystemControl::Init::GetIntendedMemorySize() { switch (GetMemorySizeForInit()) { case Smc::MemorySize_4GB: default: // All invalid modes should go to 4GB. +#ifdef __OPENORBIS__ + return 2_GiB; +#else return 4_GiB; +#endif case Smc::MemorySize_6GB: return 6_GiB; case Smc::MemorySize_8GB: From 39b8107b5cae42628e291ac40bdd4af78f69cae1 Mon Sep 17 00:00:00 2001 From: lizzie Date: Fri, 5 Dec 2025 03:52:18 +0000 Subject: [PATCH 23/78] adapt to new master --- .patch/mbedtls/0002-aesni-fix.patch | 13 ------------- externals/cmake-modules/DetectPlatform.cmake | 2 ++ 2 files changed, 2 insertions(+), 13 deletions(-) delete mode 100644 .patch/mbedtls/0002-aesni-fix.patch diff --git a/.patch/mbedtls/0002-aesni-fix.patch b/.patch/mbedtls/0002-aesni-fix.patch deleted file mode 100644 index e9a1bce5e6..0000000000 --- a/.patch/mbedtls/0002-aesni-fix.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/library/aesni.h b/library/aesni.h -index 754c984c79..59e27afd3e 100644 ---- a/library/aesni.h -+++ b/library/aesni.h -@@ -35,7 +35,7 @@ - /* GCC-like compilers: currently, we only support intrinsics if the requisite - * target flag is enabled when building the library (e.g. `gcc -mpclmul -msse2` - * or `clang -maes -mpclmul`). */ --#if (defined(__GNUC__) || defined(__clang__)) && defined(__AES__) && defined(__PCLMUL__) -+#if (defined(__GNUC__) || defined(__clang__)) && !defined(__OPENORBIS__) - #define MBEDTLS_AESNI_HAVE_INTRINSICS - #endif - /* For 32-bit, we only support intrinsics */ diff --git a/externals/cmake-modules/DetectPlatform.cmake b/externals/cmake-modules/DetectPlatform.cmake index 6475884f1f..5d305438b9 100644 --- a/externals/cmake-modules/DetectPlatform.cmake +++ b/externals/cmake-modules/DetectPlatform.cmake @@ -17,6 +17,8 @@ if (${CMAKE_SYSTEM_NAME} STREQUAL "SunOS") set(PLATFORM_SUN ON) +elseif (${CMAKE_SYSTEM_NAME} STREQUAL "OpenOrbis") + set(PLATFORM_PS4 ON) elseif (${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD") set(PLATFORM_FREEBSD ON) elseif (${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD") From 5bc13df3ebef569c7356b8899ddb9e7e6c38e4c9 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 6 Dec 2025 20:50:36 +0000 Subject: [PATCH 24/78] fixes for mbedtls --- .patch/mbedtls/0003-openorbis.patch | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .patch/mbedtls/0003-openorbis.patch diff --git a/.patch/mbedtls/0003-openorbis.patch b/.patch/mbedtls/0003-openorbis.patch new file mode 100644 index 0000000000..46cfbd408f --- /dev/null +++ b/.patch/mbedtls/0003-openorbis.patch @@ -0,0 +1,13 @@ +diff --git a/library/entropy_poll.c b/library/entropy_poll.c +index 611768c..8950ee4 100644 +--- a/library/entropy_poll.c ++++ b/library/entropy_poll.c +@@ -118,7 +118,7 @@ static int getrandom_wrapper(void *buf, size_t buflen, unsigned int flags) + * + * Documentation: https://netbsd.gw.com/cgi-bin/man-cgi?sysctl+7 + */ +-#if (defined(__FreeBSD__) || defined(__NetBSD__)) && !defined(HAVE_GETRANDOM) ++#if (defined(__FreeBSD__) || defined(__NetBSD__)) && !defined(HAVE_GETRANDOM) && !defined(__OPENORBIS__) + #include + #include + #if defined(KERN_ARND) From 7f2e42ad405797d2293167ce340167185843a97d Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 6 Dec 2025 21:31:14 +0000 Subject: [PATCH 25/78] add sce_module so it loads on real hw --- CMakeModules/OpenOrbis.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeModules/OpenOrbis.cmake b/CMakeModules/OpenOrbis.cmake index 4e76731f6a..593c951e30 100644 --- a/CMakeModules/OpenOrbis.cmake +++ b/CMakeModules/OpenOrbis.cmake @@ -19,7 +19,7 @@ function(create_ps4_pkg project target content_id) COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} TITLE --type Utf8 --maxsize 128 --value ${target} COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} TITLE_ID --type Utf8 --maxsize 12 --value BREW00090 COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} VERSION --type Utf8 --maxsize 8 --value 1.03 - COMMAND ${CMAKE_SYSROOT}/bin/create-gp4 -out ${target}.gp4 --content-id=${content_id} --files "eboot.bin ${sce_sys_param}" + COMMAND ${CMAKE_SYSROOT}/bin/create-gp4 -out ${target}.gp4 --content-id=${content_id} --files "eboot.bin ${sce_sys_param} sce_module/libc.prx sce_module/libSceFios2.prx" COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core pkg_build ${target}.gp4 . VERBATIM WORKING_DIRECTORY ${CMAKE_BINARY_DIR} From 1c4f568d5603bb922b5f1face5cb1ec5459c57f8 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 6 Dec 2025 21:35:32 +0000 Subject: [PATCH 26/78] license --- .ci/ps4/make-toolchain.sh | 3 +++ CMakeModules/FindSDL2.cmake | 3 +++ src/common/fs/fs.cpp | 3 +++ src/common/memory_detect.cpp | 3 +++ src/common/virtual_buffer.h | 3 +++ src/core/device_memory.h | 3 +++ src/input_common/drivers/joycon.h | 3 +++ src/input_common/helpers/joycon_driver.cpp | 3 +++ src/input_common/helpers/joycon_protocol/common_protocol.cpp | 3 +++ src/input_common/helpers/joycon_protocol/joycon_types.h | 3 +++ src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp | 3 +++ 11 files changed, 33 insertions(+) mode change 100644 => 100755 .ci/ps4/make-toolchain.sh diff --git a/.ci/ps4/make-toolchain.sh b/.ci/ps4/make-toolchain.sh old mode 100644 new mode 100755 index 727596ae36..7903a79169 --- a/.ci/ps4/make-toolchain.sh +++ b/.ci/ps4/make-toolchain.sh @@ -1,5 +1,8 @@ #!/usr/local/bin/bash -ex +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + # Define global vars # These flags are used everywhere, so let's reuse them. export OO_PS4_TOOLCHAIN="$PWD/prefix" diff --git a/CMakeModules/FindSDL2.cmake b/CMakeModules/FindSDL2.cmake index 2445d36ec5..a7e7225dbb 100644 --- a/CMakeModules/FindSDL2.cmake +++ b/CMakeModules/FindSDL2.cmake @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + # Distributed under the OSI-approved BSD 3-Clause License. See accompanying # file Copyright.txt or https://cmake.org/licensing for details. diff --git a/src/common/fs/fs.cpp b/src/common/fs/fs.cpp index c86a8e565d..1c9c3b697a 100644 --- a/src/common/fs/fs.cpp +++ b/src/common/fs/fs.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/common/memory_detect.cpp b/src/common/memory_detect.cpp index 8bd544e3e2..b755c1a77e 100644 --- a/src/common/memory_detect.cpp +++ b/src/common/memory_detect.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/common/virtual_buffer.h b/src/common/virtual_buffer.h index 74cc3a66f9..bb012196fe 100644 --- a/src/common/virtual_buffer.h +++ b/src/common/virtual_buffer.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/device_memory.h b/src/core/device_memory.h index b96717871c..17b585d67a 100644 --- a/src/core/device_memory.h +++ b/src/core/device_memory.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/input_common/drivers/joycon.h b/src/input_common/drivers/joycon.h index cc07958a0f..fa8e32958d 100644 --- a/src/input_common/drivers/joycon.h +++ b/src/input_common/drivers/joycon.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/input_common/helpers/joycon_driver.cpp b/src/input_common/helpers/joycon_driver.cpp index 10c2878cea..2b70129bfc 100644 --- a/src/input_common/helpers/joycon_driver.cpp +++ b/src/input_common/helpers/joycon_driver.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/input_common/helpers/joycon_protocol/common_protocol.cpp b/src/input_common/helpers/joycon_protocol/common_protocol.cpp index 669e89f064..1c9f1a690c 100644 --- a/src/input_common/helpers/joycon_protocol/common_protocol.cpp +++ b/src/input_common/helpers/joycon_protocol/common_protocol.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/input_common/helpers/joycon_protocol/joycon_types.h b/src/input_common/helpers/joycon_protocol/joycon_types.h index 9be84b36a2..e7c4867ff4 100644 --- a/src/input_common/helpers/joycon_protocol/joycon_types.h +++ b/src/input_common/helpers/joycon_protocol/joycon_types.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp b/src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp index a21eea1219..165dc5245f 100644 --- a/src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp +++ b/src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later From bc49a8ca0b10f374b801dde7a7062da93d718815 Mon Sep 17 00:00:00 2001 From: lizzie Date: Thu, 11 Dec 2025 05:01:48 +0000 Subject: [PATCH 27/78] swap handling --- src/common/host_memory.cpp | 1 + src/common/virtual_buffer.cpp | 28 +++++++++++++++++++++++++++- src/common/virtual_buffer.h | 1 + src/yuzu_cmd/yuzu.cpp | 16 ++++++++++++++-- 4 files changed, 43 insertions(+), 3 deletions(-) diff --git a/src/common/host_memory.cpp b/src/common/host_memory.cpp index 4691c99e54..ce28b36527 100644 --- a/src/common/host_memory.cpp +++ b/src/common/host_memory.cpp @@ -678,6 +678,7 @@ private: HostMemory::HostMemory(size_t backing_size_, size_t virtual_size_) : backing_size(backing_size_), virtual_size(virtual_size_) { #ifdef __OPENORBIS__ + Common::InitSwap(); LOG_WARNING(HW_Memory, "Platform doesn't support fastmem"); fallback_buffer.emplace(backing_size); backing_base = fallback_buffer->data(); diff --git a/src/common/virtual_buffer.cpp b/src/common/virtual_buffer.cpp index 5a05f12d47..34f9c57463 100644 --- a/src/common/virtual_buffer.cpp +++ b/src/common/virtual_buffer.cpp @@ -10,6 +10,10 @@ #include #endif +#ifdef __OPENORBIS__ +#include +#endif + #include "common/assert.h" #include "common/virtual_buffer.h" #include "common/logging/log.h" @@ -33,7 +37,7 @@ void* AllocateMemoryPages(std::size_t size) noexcept { void* addr = VirtualAlloc(nullptr, size, MEM_COMMIT, PAGE_READWRITE); ASSERT(addr != nullptr); #elif defined(__OPENORBIS__) - void* addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); + void* addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_VOID | MAP_PRIVATE, -1, 0); ASSERT(addr != MAP_FAILED); #else void* addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); @@ -53,4 +57,26 @@ void FreeMemoryPages(void* addr, [[maybe_unused]] std::size_t size) noexcept { #endif } +#ifdef __OPENORBIS__ +static struct sigaction old_sa_segv; +static void SwapHandler(int sig, siginfo_t* si, void* raw_context) { + void* a_addr = reinterpret_cast(uintptr_t(si->si_addr) & ~0xfff); + mmap(a_addr, 4096, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); + //mprotect(a_addr, 4096, PROT_READ | PROT_WRITE); +} + +bool InitSwap() noexcept { + struct sigaction sa; + sa.sa_handler = NULL; + sa.sa_sigaction = &SwapHandler; + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_SIGINFO | SA_RESTART; + return sigaction(SIGSEGV, &sa, &old_sa_segv) == 0; +} +#else +bool InitSwap() noexcept { + return true; +} +#endif + } // namespace Common diff --git a/src/common/virtual_buffer.h b/src/common/virtual_buffer.h index bb012196fe..407f6eb3d3 100644 --- a/src/common/virtual_buffer.h +++ b/src/common/virtual_buffer.h @@ -12,6 +12,7 @@ namespace Common { void* AllocateMemoryPages(std::size_t size) noexcept; void FreeMemoryPages(void* base, std::size_t size) noexcept; +bool InitSwap() noexcept; template class VirtualBuffer final { diff --git a/src/yuzu_cmd/yuzu.cpp b/src/yuzu_cmd/yuzu.cpp index f58d805f5b..eb23a1f8c6 100644 --- a/src/yuzu_cmd/yuzu.cpp +++ b/src/yuzu_cmd/yuzu.cpp @@ -52,6 +52,7 @@ #endif #ifdef __OPENORBIS__ +#include # define STUB_WEAK(name) extern "C" void name() { printf("called " #name); asm volatile("ud2"); } STUB_WEAK(__cxa_thread_atexit) STUB_WEAK(__assert) @@ -431,10 +432,20 @@ int main(int argc, char** argv) { [](VideoCore::LoadCallbackStage, size_t value, size_t total) {}); } - system.RegisterExitCallback([&] { + auto const exit_fn = [&] { +#ifdef __OPENORBIS__ + sceSystemServiceLoadExec("EXIT", nullptr); +#else // Just exit right away. exit(0); - }); +#endif + }; + system.RegisterExitCallback(exit_fn); + +#ifdef __linux__ + Common::Linux::StartGamemode(); +#endif + void(system.Run()); if (system.DebuggerEnabled()) { system.InitializeDebugger(); @@ -446,6 +457,7 @@ int main(int argc, char** argv) { void(system.Pause()); system.ShutdownMainProcess(); detached_tasks.WaitForAllTasks(); + exit_fn(); return 0; } From 9e0ac816ae01a9bab3f5230a5bdba9b32a20064d Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 6 Dec 2025 23:02:09 +0000 Subject: [PATCH 28/78] fixes 4 stuff --- src/common/virtual_buffer.cpp | 10 +++++----- .../hle/kernel/board/nintendo/nx/k_system_control.cpp | 4 ---- .../src/dynarmic/backend/exception_handler_posix.cpp | 2 +- src/yuzu_cmd/CMakeLists.txt | 2 +- 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/common/virtual_buffer.cpp b/src/common/virtual_buffer.cpp index 34f9c57463..3e5f327245 100644 --- a/src/common/virtual_buffer.cpp +++ b/src/common/virtual_buffer.cpp @@ -37,7 +37,7 @@ void* AllocateMemoryPages(std::size_t size) noexcept { void* addr = VirtualAlloc(nullptr, size, MEM_COMMIT, PAGE_READWRITE); ASSERT(addr != nullptr); #elif defined(__OPENORBIS__) - void* addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_VOID | MAP_PRIVATE, -1, 0); + void* addr = mmap(nullptr, size, PROT_NONE, MAP_VOID | MAP_PRIVATE, -1, 0); ASSERT(addr != MAP_FAILED); #else void* addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); @@ -60,15 +60,15 @@ void FreeMemoryPages(void* addr, [[maybe_unused]] std::size_t size) noexcept { #ifdef __OPENORBIS__ static struct sigaction old_sa_segv; static void SwapHandler(int sig, siginfo_t* si, void* raw_context) { - void* a_addr = reinterpret_cast(uintptr_t(si->si_addr) & ~0xfff); - mmap(a_addr, 4096, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); - //mprotect(a_addr, 4096, PROT_READ | PROT_WRITE); + void* aligned_addr = reinterpret_cast(uintptr_t(si->si_addr) & ~0xfff); + void* res = mmap(aligned_addr, 4096, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0); + ASSERT(res != MAP_FAILED); } bool InitSwap() noexcept { struct sigaction sa; sa.sa_handler = NULL; - sa.sa_sigaction = &SwapHandler; + sa.__sa_handler.__sa_sigaction = &SwapHandler; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_SIGINFO | SA_RESTART; return sigaction(SIGSEGV, &sa, &old_sa_segv) == 0; diff --git a/src/core/hle/kernel/board/nintendo/nx/k_system_control.cpp b/src/core/hle/kernel/board/nintendo/nx/k_system_control.cpp index 2e6a6aa364..1446653916 100644 --- a/src/core/hle/kernel/board/nintendo/nx/k_system_control.cpp +++ b/src/core/hle/kernel/board/nintendo/nx/k_system_control.cpp @@ -85,11 +85,7 @@ size_t KSystemControl::Init::GetIntendedMemorySize() { switch (GetMemorySizeForInit()) { case Smc::MemorySize_4GB: default: // All invalid modes should go to 4GB. -#ifdef __OPENORBIS__ - return 2_GiB; -#else return 4_GiB; -#endif case Smc::MemorySize_6GB: return 6_GiB; case Smc::MemorySize_8GB: diff --git a/src/dynarmic/src/dynarmic/backend/exception_handler_posix.cpp b/src/dynarmic/src/dynarmic/backend/exception_handler_posix.cpp index 8470d77b2d..fc2d8d6284 100644 --- a/src/dynarmic/src/dynarmic/backend/exception_handler_posix.cpp +++ b/src/dynarmic/src/dynarmic/backend/exception_handler_posix.cpp @@ -60,7 +60,7 @@ public: signal_stack_memory = mmap(nullptr, signal_stack_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); #ifdef __OPENORBIS__ - fmt::print(stderr, "no fastmem on ps4\n"); + fmt::print(stderr, "no fastmem on PS4\n"); supports_fast_mem = false; #else stack_t signal_stack{}; diff --git a/src/yuzu_cmd/CMakeLists.txt b/src/yuzu_cmd/CMakeLists.txt index 605ef410a8..8707e8ce7e 100644 --- a/src/yuzu_cmd/CMakeLists.txt +++ b/src/yuzu_cmd/CMakeLists.txt @@ -35,7 +35,7 @@ target_link_libraries(yuzu-cmd PRIVATE glad) if (MSVC) target_link_libraries(yuzu-cmd PRIVATE getopt) elseif(PLATFORM_PS4) - target_link_libraries(yuzu-cmd PRIVATE SceVideoOut SceAudioOut ScePad) + target_link_libraries(yuzu-cmd PRIVATE SceVideoOut SceAudioOut ScePad SceSystemService) endif() target_link_libraries(yuzu-cmd PRIVATE ${PLATFORM_LIBRARIES} Threads::Threads) From 733c596a14b4ce7e98ba2cb88327f94fab113805 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sun, 7 Dec 2025 00:39:38 +0000 Subject: [PATCH 29/78] more stupid stuff --- src/common/virtual_buffer.cpp | 71 +++++++++++++++++++++++------------ src/yuzu_cmd/yuzu.cpp | 5 +++ 2 files changed, 53 insertions(+), 23 deletions(-) diff --git a/src/common/virtual_buffer.cpp b/src/common/virtual_buffer.cpp index 3e5f327245..d444e81edf 100644 --- a/src/common/virtual_buffer.cpp +++ b/src/common/virtual_buffer.cpp @@ -11,7 +11,9 @@ #endif #ifdef __OPENORBIS__ +#include #include +#include #endif #include "common/assert.h" @@ -28,10 +30,54 @@ # ifndef MAP_VOID # define MAP_VOID 0x100 # endif +// sigaction(2) has a motherfucking bug on musl where the thing isnt even properly prefixed +# undef sa_sigaction +# define sa_sigaction __sa_handler.__sa_sigaction #endif namespace Common { +#ifdef __OPENORBIS__ +static struct sigaction old_sa_segv; +static boost::container::static_vector, 16> swap_regions; +static void SwapHandler(int sig, siginfo_t* si, void* raw_context) { + if (std::ranges::find_if(swap_regions, [addr = si->si_addr](auto const& e) { + return uintptr_t(addr) >= uintptr_t(e.first) && uintptr_t(addr) < uintptr_t(e.first) + e.second; + }) != swap_regions.end()) { + size_t const page_size = 4096; + size_t const page_mask = ~0xfff; + // should replace the existing mapping... ugh + void* aligned_addr = reinterpret_cast(uintptr_t(si->si_addr) & page_mask); + void* res = mmap(aligned_addr, page_size, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0); + ASSERT(res != MAP_FAILED); + } else { + struct sigaction* retry_sa = &old_sa_segv; + if ((retry_sa->sa_flags & SA_SIGINFO) != 0) { + retry_sa->sa_sigaction(sig, si, raw_context); + } else if (retry_sa->sa_handler == SIG_DFL) { + signal(sig, SIG_DFL); + } else if (retry_sa->sa_handler == SIG_IGN) { + // ignore? + } else { + retry_sa->sa_handler(sig); + } + } +} + +bool InitSwap() noexcept { + struct sigaction sa; + sa.sa_handler = NULL; + sa.sa_sigaction = &SwapHandler; + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_SIGINFO | SA_RESTART; + return sigaction(SIGSEGV, &sa, &old_sa_segv) == 0; +} +#else +bool InitSwap() noexcept { + return true; +} +#endif + void* AllocateMemoryPages(std::size_t size) noexcept { #ifdef _WIN32 void* addr = VirtualAlloc(nullptr, size, MEM_COMMIT, PAGE_READWRITE); @@ -39,6 +85,7 @@ void* AllocateMemoryPages(std::size_t size) noexcept { #elif defined(__OPENORBIS__) void* addr = mmap(nullptr, size, PROT_NONE, MAP_VOID | MAP_PRIVATE, -1, 0); ASSERT(addr != MAP_FAILED); + swap_regions.emplace_back(addr, size); #else void* addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); ASSERT(addr != MAP_FAILED); @@ -50,33 +97,11 @@ void FreeMemoryPages(void* addr, [[maybe_unused]] std::size_t size) noexcept { if (!addr) return; #ifdef _WIN32 - VirtualFree(addr, 0, MEM_RELEASE) + VirtualFree(addr, 0, MEM_RELEASE); #else int rc = munmap(addr, size); ASSERT(rc == 0); #endif } -#ifdef __OPENORBIS__ -static struct sigaction old_sa_segv; -static void SwapHandler(int sig, siginfo_t* si, void* raw_context) { - void* aligned_addr = reinterpret_cast(uintptr_t(si->si_addr) & ~0xfff); - void* res = mmap(aligned_addr, 4096, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0); - ASSERT(res != MAP_FAILED); -} - -bool InitSwap() noexcept { - struct sigaction sa; - sa.sa_handler = NULL; - sa.__sa_handler.__sa_sigaction = &SwapHandler; - sigemptyset(&sa.sa_mask); - sa.sa_flags = SA_SIGINFO | SA_RESTART; - return sigaction(SIGSEGV, &sa, &old_sa_segv) == 0; -} -#else -bool InitSwap() noexcept { - return true; -} -#endif - } // namespace Common diff --git a/src/yuzu_cmd/yuzu.cpp b/src/yuzu_cmd/yuzu.cpp index eb23a1f8c6..018b886130 100644 --- a/src/yuzu_cmd/yuzu.cpp +++ b/src/yuzu_cmd/yuzu.cpp @@ -236,6 +236,11 @@ int main(int argc, char** argv) { // clang-format on }; +#ifdef __OPENORBIS__ + // PS4 will use this path by default UNLESS overriden; this is so users + // can quickly launch whatever they want. + filepath = "/data/eden/games/test.nro"; +#endif while (optind < argc) { int arg = getopt_long(argc, argv, "g:fhvp::c:u:d:", long_options, &option_index); if (arg != -1) { From 14984625b7a54d92e7d75d0f74ab26f4f14ddfd6 Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 8 Dec 2025 03:08:25 +0000 Subject: [PATCH 30/78] proper memswap mechanism --- src/common/virtual_buffer.cpp | 101 ++++++++++++++++++++++-------- src/common/virtual_buffer.h | 2 +- src/qt_common/config/uisettings.h | 8 ++- src/yuzu_cmd/yuzu.cpp | 5 +- 4 files changed, 86 insertions(+), 30 deletions(-) diff --git a/src/common/virtual_buffer.cpp b/src/common/virtual_buffer.cpp index d444e81edf..7a6e7b8352 100644 --- a/src/common/virtual_buffer.cpp +++ b/src/common/virtual_buffer.cpp @@ -14,6 +14,9 @@ #include #include #include +#include +typedef void (*SceKernelExceptionHandler)(int32_t, void*); +extern "C" int32_t sceKernelInstallExceptionHandler(int32_t signum, SceKernelExceptionHandler handler); #endif #include "common/assert.h" @@ -38,44 +41,90 @@ namespace Common { #ifdef __OPENORBIS__ -static struct sigaction old_sa_segv; + +namespace Orbis { +struct Ucontext { + struct Sigset { + u64 bits[2]; + } uc_sigmask; + int field1_0x10[12]; + struct Mcontext { + u64 mc_onstack; + u64 mc_rdi; + u64 mc_rsi; + u64 mc_rdx; + u64 mc_rcx; + u64 mc_r8; + u64 mc_r9; + u64 mc_rax; + u64 mc_rbx; + u64 mc_rbp; + u64 mc_r10; + u64 mc_r11; + u64 mc_r12; + u64 mc_r13; + u64 mc_r14; + u64 mc_r15; + int mc_trapno; + u16 mc_fs; + u16 mc_gs; + u64 mc_addr; + int mc_flags; + u16 mc_es; + u16 mc_ds; + u64 mc_err; + u64 mc_rip; + u64 mc_cs; + u64 mc_rflags; + u64 mc_rsp; + u64 mc_ss; + u64 mc_len; + u64 mc_fpformat; + u64 mc_ownedfp; + u64 mc_lbrfrom; + u64 mc_lbrto; + u64 mc_aux1; + u64 mc_aux2; + u64 mc_fpstate[104]; + u64 mc_fsbase; + u64 mc_gsbase; + u64 mc_spare[6]; + } uc_mcontext; + struct Ucontext* uc_link; + struct ExStack { + void* ss_sp; + std::size_t ss_size; + int ss_flags; + int _align; + } uc_stack; + int uc_flags; + int __spare[4]; + int field7_0x4f4[3]; +}; +} + static boost::container::static_vector, 16> swap_regions; -static void SwapHandler(int sig, siginfo_t* si, void* raw_context) { - if (std::ranges::find_if(swap_regions, [addr = si->si_addr](auto const& e) { +static void SwapHandler(int sig, void* raw_context) { + auto& mctx = ((Orbis::Ucontext*)raw_context)->uc_mcontext; + if (std::ranges::find_if(swap_regions, [addr = mctx.mc_addr](auto const& e) { return uintptr_t(addr) >= uintptr_t(e.first) && uintptr_t(addr) < uintptr_t(e.first) + e.second; }) != swap_regions.end()) { size_t const page_size = 4096; size_t const page_mask = ~0xfff; // should replace the existing mapping... ugh - void* aligned_addr = reinterpret_cast(uintptr_t(si->si_addr) & page_mask); + void* aligned_addr = reinterpret_cast(uintptr_t(mctx.mc_addr) & page_mask); void* res = mmap(aligned_addr, page_size, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0); ASSERT(res != MAP_FAILED); } else { - struct sigaction* retry_sa = &old_sa_segv; - if ((retry_sa->sa_flags & SA_SIGINFO) != 0) { - retry_sa->sa_sigaction(sig, si, raw_context); - } else if (retry_sa->sa_handler == SIG_DFL) { - signal(sig, SIG_DFL); - } else if (retry_sa->sa_handler == SIG_IGN) { - // ignore? - } else { - retry_sa->sa_handler(sig); - } + LOG_ERROR(HW_Memory, "fault in addr {:#x}", mctx.mc_addr); + sceSystemServiceLoadExec("EXIT", nullptr); } } - -bool InitSwap() noexcept { - struct sigaction sa; - sa.sa_handler = NULL; - sa.sa_sigaction = &SwapHandler; - sigemptyset(&sa.sa_mask); - sa.sa_flags = SA_SIGINFO | SA_RESTART; - return sigaction(SIGSEGV, &sa, &old_sa_segv) == 0; +void InitSwap() noexcept { + sceKernelInstallExceptionHandler(SIGSEGV, &SwapHandler); } #else -bool InitSwap() noexcept { - return true; -} +void InitSwap() noexcept {} #endif void* AllocateMemoryPages(std::size_t size) noexcept { @@ -83,7 +132,7 @@ void* AllocateMemoryPages(std::size_t size) noexcept { void* addr = VirtualAlloc(nullptr, size, MEM_COMMIT, PAGE_READWRITE); ASSERT(addr != nullptr); #elif defined(__OPENORBIS__) - void* addr = mmap(nullptr, size, PROT_NONE, MAP_VOID | MAP_PRIVATE, -1, 0); + void* addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_VOID | MAP_PRIVATE, -1, 0); ASSERT(addr != MAP_FAILED); swap_regions.emplace_back(addr, size); #else diff --git a/src/common/virtual_buffer.h b/src/common/virtual_buffer.h index 407f6eb3d3..c25b52a51a 100644 --- a/src/common/virtual_buffer.h +++ b/src/common/virtual_buffer.h @@ -12,7 +12,7 @@ namespace Common { void* AllocateMemoryPages(std::size_t size) noexcept; void FreeMemoryPages(void* base, std::size_t size) noexcept; -bool InitSwap() noexcept; +void InitSwap() noexcept; template class VirtualBuffer final { diff --git a/src/qt_common/config/uisettings.h b/src/qt_common/config/uisettings.h index 49205c5b84..363b0dad76 100644 --- a/src/qt_common/config/uisettings.h +++ b/src/qt_common/config/uisettings.h @@ -159,7 +159,13 @@ struct Values { Setting enable_discord_presence{linkage, false, "enable_discord_presence", Category::Ui}; // logging - Setting show_console{linkage, false, "showConsole", Category::Ui}; + Setting show_console{linkage, +#ifdef __OPENORBIS__ + true, +#else + false, +#endif + "showConsole", Category::Ui}; // Screenshots Setting enable_screenshot_save_as{linkage, true, "enable_screenshot_save_as", diff --git a/src/yuzu_cmd/yuzu.cpp b/src/yuzu_cmd/yuzu.cpp index 018b886130..8271ea713d 100644 --- a/src/yuzu_cmd/yuzu.cpp +++ b/src/yuzu_cmd/yuzu.cpp @@ -53,8 +53,10 @@ #ifdef __OPENORBIS__ #include +#include +#include <__thread/support.h> # define STUB_WEAK(name) extern "C" void name() { printf("called " #name); asm volatile("ud2"); } -STUB_WEAK(__cxa_thread_atexit) +void *__cxa_thread_atexit_impl = nullptr; STUB_WEAK(__assert) STUB_WEAK(ZSTD_trace_compress_begin) STUB_WEAK(ZSTD_trace_compress_end) @@ -235,7 +237,6 @@ int main(int argc, char** argv) { {0, 0, 0, 0}, // clang-format on }; - #ifdef __OPENORBIS__ // PS4 will use this path by default UNLESS overriden; this is so users // can quickly launch whatever they want. From c9c3762c8ec77fe99fc90670086811a7c0fbbb70 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sun, 18 Jan 2026 16:34:51 +0000 Subject: [PATCH 31/78] opengl bullshit --- src/common/settings.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/settings.h b/src/common/settings.h index 8cd55bcdd3..248a8016da 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -332,7 +332,7 @@ struct Values { // Renderer SwitchableSetting renderer_backend{linkage, -#if defined(__sun__) || defined(__managarm__) +#if defined(__sun__) || defined(__managarm__) || defined(__OPENORBIS__) RendererBackend::OpenGL_GLSL, #else RendererBackend::Vulkan, From cf2d3a15bcd0130debfbc5ba380350feb333a426 Mon Sep 17 00:00:00 2001 From: lizzie Date: Fri, 26 Dec 2025 12:11:05 +0000 Subject: [PATCH 32/78] fix for crashes on TLS due to openorbis being W E I R D --- src/common/settings.h | 9 ++++++++- src/common/virtual_buffer.cpp | 5 +++-- src/input_common/main.cpp | 19 +++++++++++++++++++ 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/common/settings.h b/src/common/settings.h index 248a8016da..e2d91783d3 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -196,7 +196,14 @@ struct Values { linkage, false, "dump_audio_commands", Category::Audio, Specialization::Default, false}; // Core - SwitchableSetting use_multi_core{linkage, true, "use_multi_core", Category::Core}; + SwitchableSetting use_multi_core{linkage, +#ifdef __OPENORBIS__ + // Re-enable once proper TLS support is added + false, +#else + true, +#endif + "use_multi_core", Category::Core}; SwitchableSetting memory_layout_mode{linkage, MemoryLayout::Memory_4Gb, "memory_layout_mode", diff --git a/src/common/virtual_buffer.cpp b/src/common/virtual_buffer.cpp index 7a6e7b8352..a4ccd84d38 100644 --- a/src/common/virtual_buffer.cpp +++ b/src/common/virtual_buffer.cpp @@ -104,6 +104,7 @@ struct Ucontext { } static boost::container::static_vector, 16> swap_regions; +extern "C" int sceKernelRemoveExceptionHandler(s32 sig_num); static void SwapHandler(int sig, void* raw_context) { auto& mctx = ((Orbis::Ucontext*)raw_context)->uc_mcontext; if (std::ranges::find_if(swap_regions, [addr = mctx.mc_addr](auto const& e) { @@ -116,8 +117,8 @@ static void SwapHandler(int sig, void* raw_context) { void* res = mmap(aligned_addr, page_size, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0); ASSERT(res != MAP_FAILED); } else { - LOG_ERROR(HW_Memory, "fault in addr {:#x}", mctx.mc_addr); - sceSystemServiceLoadExec("EXIT", nullptr); + LOG_ERROR(HW_Memory, "fault in addr {:#x} at {:#x}", mctx.mc_addr, mctx.mc_rip); // print caller address + sceKernelRemoveExceptionHandler(SIGSEGV); // to not catch the next signal } } void InitSwap() noexcept { diff --git a/src/input_common/main.cpp b/src/input_common/main.cpp index b04a70590a..2fc8aa4e8a 100644 --- a/src/input_common/main.cpp +++ b/src/input_common/main.cpp @@ -82,7 +82,10 @@ struct InputSubsystem::Impl { #ifdef ENABLE_LIBUSB RegisterEngine("gcpad", gcadapter); #endif +#ifndef __OPENORBIS__ + // TODO: Issue in PS4, crash for UDP_client RegisterEngine("cemuhookudp", udp_client); +#endif RegisterEngine("tas", tas_input); RegisterEngine("camera", camera); #ifdef ANDROID @@ -116,7 +119,9 @@ struct InputSubsystem::Impl { #ifdef ENABLE_LIBUSB UnregisterEngine(gcadapter); #endif +#ifndef __OPENORBIS__ UnregisterEngine(udp_client); +#endif UnregisterEngine(tas_input); UnregisterEngine(camera); #ifdef ANDROID @@ -152,8 +157,10 @@ struct InputSubsystem::Impl { auto gcadapter_devices = gcadapter->GetInputDevices(); devices.insert(devices.end(), gcadapter_devices.begin(), gcadapter_devices.end()); #endif +#ifndef __OPENORBIS__ auto udp_devices = udp_client->GetInputDevices(); devices.insert(devices.end(), udp_devices.begin(), udp_devices.end()); +#endif #ifdef HAVE_SDL2 auto joycon_devices = joycon->GetInputDevices(); devices.insert(devices.end(), joycon_devices.begin(), joycon_devices.end()); @@ -186,9 +193,11 @@ struct InputSubsystem::Impl { return gcadapter; } #endif +#ifndef __OPENORBIS__ if (engine == udp_client->GetEngineName()) { return udp_client; } +#endif #ifdef HAVE_SDL2 if (engine == sdl->GetEngineName()) { return sdl; @@ -271,9 +280,11 @@ struct InputSubsystem::Impl { return true; } #endif +#ifndef __OPENORBIS__ if (engine == udp_client->GetEngineName()) { return true; } +#endif if (engine == tas_input->GetEngineName()) { return true; } @@ -300,7 +311,9 @@ struct InputSubsystem::Impl { #ifdef ENABLE_LIBUSB gcadapter->BeginConfiguration(); #endif +#ifndef __OPENORBIS__ udp_client->BeginConfiguration(); +#endif #ifdef HAVE_SDL2 sdl->BeginConfiguration(); joycon->BeginConfiguration(); @@ -316,7 +329,9 @@ struct InputSubsystem::Impl { #ifdef ENABLE_LIBUSB gcadapter->EndConfiguration(); #endif +#ifndef __OPENORBIS__ udp_client->EndConfiguration(); +#endif #ifdef HAVE_SDL2 sdl->EndConfiguration(); joycon->EndConfiguration(); @@ -341,7 +356,9 @@ struct InputSubsystem::Impl { std::shared_ptr mouse; std::shared_ptr touch_screen; std::shared_ptr tas_input; +#ifndef __OPENORBIS__ std::shared_ptr udp_client; +#endif std::shared_ptr camera; std::shared_ptr virtual_amiibo; std::shared_ptr virtual_gamepad; @@ -470,7 +487,9 @@ bool InputSubsystem::IsStickInverted(const Common::ParamPackage& params) const { } void InputSubsystem::ReloadInputDevices() { +#ifndef __OPENORBIS__ impl->udp_client.get()->ReloadSockets(); +#endif } void InputSubsystem::BeginMapping(Polling::InputType type) { From 9fd522ccbebca6dd9e1c425956e0f2c1e6858bf0 Mon Sep 17 00:00:00 2001 From: lizzie Date: Thu, 8 Jan 2026 13:44:03 +0000 Subject: [PATCH 33/78] fix sdl2 --- externals/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index f79f776be4..5ca90b2b23 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -173,8 +173,10 @@ if (NOT ANDROID) if (PLATFORM_PS4) set(SDL2_LIBRARY ${CMAKE_SYSROOT}/lib/libSDL2.a) set(SDL2_INCLUDE_DIR ${CMAKE_SYSROOT}/include/SDL2) + find_package(SDL2 REQUIRED) + else() + find_package(SDL2 2.26.4 REQUIRED) endif() - find_package(SDL2 REQUIRED) endif() set(BUILD_SHARED_LIBS OFF) From 42a29d09d297c1459f248ae99af51d6aa533f456 Mon Sep 17 00:00:00 2001 From: lizzie Date: Thu, 8 Jan 2026 22:45:20 +0000 Subject: [PATCH 34/78] fix alloc failures --- src/common/virtual_buffer.cpp | 43 +++++++++++++++---- src/core/arm/dynarmic/arm_dynarmic_32.cpp | 8 +++- src/core/arm/dynarmic/arm_dynarmic_64.cpp | 8 +++- .../src/dynarmic/backend/x64/a32_emit_x64.h | 6 +++ .../src/dynarmic/backend/x64/a64_emit_x64.h | 5 +++ 5 files changed, 60 insertions(+), 10 deletions(-) diff --git a/src/common/virtual_buffer.cpp b/src/common/virtual_buffer.cpp index a4ccd84d38..407bf2e157 100644 --- a/src/common/virtual_buffer.cpp +++ b/src/common/virtual_buffer.cpp @@ -13,6 +13,7 @@ #ifdef __OPENORBIS__ #include #include +#include #include #include typedef void (*SceKernelExceptionHandler)(int32_t, void*); @@ -107,15 +108,19 @@ static boost::container::static_vector, 16> swap_region extern "C" int sceKernelRemoveExceptionHandler(s32 sig_num); static void SwapHandler(int sig, void* raw_context) { auto& mctx = ((Orbis::Ucontext*)raw_context)->uc_mcontext; - if (std::ranges::find_if(swap_regions, [addr = mctx.mc_addr](auto const& e) { + if (auto const it = std::ranges::find_if(swap_regions, [addr = mctx.mc_addr](auto const& e) { return uintptr_t(addr) >= uintptr_t(e.first) && uintptr_t(addr) < uintptr_t(e.first) + e.second; - }) != swap_regions.end()) { - size_t const page_size = 4096; - size_t const page_mask = ~0xfff; + }); it != swap_regions.end()) { + size_t const page_size = 4096 * 8; + size_t const page_mask = ~(page_size - 1); // should replace the existing mapping... ugh void* aligned_addr = reinterpret_cast(uintptr_t(mctx.mc_addr) & page_mask); void* res = mmap(aligned_addr, page_size, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0); - ASSERT(res != MAP_FAILED); + if (res == MAP_FAILED) { + LOG_ERROR(HW_Memory, "FAIL mapped addr {},{} @ {}:{}", mctx.mc_addr, aligned_addr, it->first, it->second); + } else { + LOG_INFO(HW_Memory, "OK mapped addr {},{} @ {}:{}", mctx.mc_addr, aligned_addr, it->first, it->second); + } } else { LOG_ERROR(HW_Memory, "fault in addr {:#x} at {:#x}", mctx.mc_addr, mctx.mc_rip); // print caller address sceKernelRemoveExceptionHandler(SIGSEGV); // to not catch the next signal @@ -128,14 +133,36 @@ void InitSwap() noexcept { void InitSwap() noexcept {} #endif +static const char *swapfile_names[] { + "/data/eden/games/swap0.bin", + "/data/eden/games/swap1.bin", + "/data/eden/games/swap2.bin", + "/data/eden/games/swap3.bin", + "/data/eden/games/swap4.bin" +}; +static size_t swapfile_count = 0; + void* AllocateMemoryPages(std::size_t size) noexcept { #ifdef _WIN32 void* addr = VirtualAlloc(nullptr, size, MEM_COMMIT, PAGE_READWRITE); ASSERT(addr != nullptr); #elif defined(__OPENORBIS__) - void* addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_VOID | MAP_PRIVATE, -1, 0); - ASSERT(addr != MAP_FAILED); - swap_regions.emplace_back(addr, size); + void* addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); + if (addr == MAP_FAILED) { + LOG_WARNING(HW_Memory, "failed to mmap({} bytes) using swapfile {}", size, swapfile_names[swapfile_count]); + // int fd = open(swapfile_names[swapfile_count], O_TRUNC | O_RDWR | O_CREAT, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH); + // ASSERT(fd > 0); + // ftruncate(fd, size); + // addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); + // ASSERT(addr != MAP_FAILED); + // ++swapfile_count; + + addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_VOID | MAP_PRIVATE, -1, 0); + ASSERT(addr != MAP_FAILED); + swap_regions.emplace_back(addr, size); + } else { + LOG_INFO(HW_Memory, "mmap {} bytes", size); + } #else void* addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); ASSERT(addr != MAP_FAILED); diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index 6fafbd9042..a485ba9a78 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp @@ -202,7 +202,9 @@ void ArmDynarmic32::MakeJit(Common::PageTable* page_table) { config.enable_cycle_counting = !m_uses_wall_clock; // Code cache size -#if defined(ARCHITECTURE_arm64) || defined(__sun__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) +#if defined(__OPENORBIS__) + config.code_cache_size = std::uint32_t(32_MiB); +#elif defined(ARCHITECTURE_arm64) || defined(__sun__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) config.code_cache_size = std::uint32_t(128_MiB); #else config.code_cache_size = std::uint32_t(512_MiB); @@ -304,6 +306,10 @@ void ArmDynarmic32::MakeJit(Common::PageTable* page_table) { default: break; } +#ifdef __OPENORBIS__ + config.unsafe_optimizations = false; + config.optimizations = Dynarmic::no_optimizations; +#endif m_jit.emplace(config); } diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index 55584d0e38..bfd531dabc 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp @@ -254,7 +254,9 @@ void ArmDynarmic64::MakeJit(Common::PageTable* page_table, std::size_t address_s config.enable_cycle_counting = !m_uses_wall_clock; // Code cache size -#if defined(ARCHITECTURE_arm64) || defined(__sun__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) +#if defined(__OPENORBIS__) + config.code_cache_size = std::uint32_t(32_MiB); +#elif defined(ARCHITECTURE_arm64) || defined(__sun__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) config.code_cache_size = std::uint32_t(128_MiB); #else config.code_cache_size = std::uint32_t(512_MiB); @@ -355,6 +357,10 @@ void ArmDynarmic64::MakeJit(Common::PageTable* page_table, std::size_t address_s default: break; } +#ifdef __OPENORBIS__ + config.unsafe_optimizations = false; + config.optimizations = Dynarmic::no_optimizations; +#endif m_jit.emplace(config); } diff --git a/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.h b/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.h index 5ec78ff50e..7b794b9289 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.h +++ b/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.h @@ -66,8 +66,14 @@ public: const void* code_ptr = nullptr; }; static_assert(sizeof(FastDispatchEntry) == 0x10); +#ifdef __OPENORBIS__ + static constexpr u64 fast_dispatch_table_mask = 0xFF0; + static constexpr size_t fast_dispatch_table_size = 0x100; +#else static constexpr u64 fast_dispatch_table_mask = 0xFFFF0; static constexpr size_t fast_dispatch_table_size = 0x10000; +#endif + void ClearFastDispatchTable(); void GenFastmemFallbacks(); void GenTerminalHandlers(); diff --git a/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.h b/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.h index dd556e36ce..b0c0db5f83 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.h +++ b/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.h @@ -59,8 +59,13 @@ public: const void* code_ptr = nullptr; }; static_assert(sizeof(FastDispatchEntry) == 0x10); +#ifdef __OPENORBIS__ + static constexpr u64 fast_dispatch_table_mask = 0xFF0; + static constexpr size_t fast_dispatch_table_size = 0x100; +#else static constexpr u64 fast_dispatch_table_mask = 0xFFFFF0; static constexpr size_t fast_dispatch_table_size = 0x100000; +#endif void ClearFastDispatchTable(); void GenMemory128Accessors(); From 23d7c6aacfabf9a2a4925cecd9f7da77c92594be Mon Sep 17 00:00:00 2001 From: lizzie Date: Thu, 8 Jan 2026 23:12:41 +0000 Subject: [PATCH 35/78] force running services on host --- .ci/ps4/build.sh | 4 +++- src/core/hle/service/services.cpp | 16 +++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/.ci/ps4/build.sh b/.ci/ps4/build.sh index 0bffdca680..a4bfc97540 100755 --- a/.ci/ps4/build.sh +++ b/.ci/ps4/build.sh @@ -30,6 +30,8 @@ set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) set(CMAKE_SIZEOF_VOID_P 8) EOF +NPROC=$(nproc || 1) + # Normally a platform has a package manager # PS4 does not, atleast not in the normal sense export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" $@) @@ -51,4 +53,4 @@ cmake -S . -B build -G "Unix Makefiles" \ -DYUZU_USE_EXTERNAL_FFMPEG=ON \ -DYUZU_USE_CPM=ON \ "${EXTRA_CMAKE_FLAGS[@]}" || exit -cmake --build build -t yuzu-cmd_pkg -- -j8 +cmake --build build -t yuzu-cmd_pkg -- -j$NPROC diff --git a/src/core/hle/service/services.cpp b/src/core/hle/service/services.cpp index 636f54ad49..7d9372e694 100644 --- a/src/core/hle/service/services.cpp +++ b/src/core/hle/service/services.cpp @@ -73,6 +73,13 @@ Services::Services(std::shared_ptr& sm, Core::System& system system.GetFileSystemController().CreateFactories(*system.GetFilesystem(), false); +#ifdef __OPENORBIS__ + // PS4 requires us to run this on a single thread so we don't immediately die + bool const run_on_host = false; +#else + bool const run_on_host = true; +#endif + // Just a quick C++ lesson // Capturing lambdas will silently create new variables for the objects referenced via = // and create a `auto&` sorts of for `&`; with all your usual reference shenanigans. @@ -92,9 +99,12 @@ Services::Services(std::shared_ptr& sm, Core::System& system {"Loader", &LDR::LoopProcess}, {"nvservices", &Nvidia::LoopProcess}, {"bsdsocket", &Sockets::LoopProcess}, - }) - kernel.RunOnHostCoreProcess(std::string(e.first), [&system, f = e.second] { f(system); }).detach(); - kernel.RunOnHostCoreProcess("vi", [&, token] { VI::LoopProcess(system, token); }).detach(); + }) { + if (run_on_host) kernel.RunOnHostCoreProcess("vi", [&, token] { VI::LoopProcess(system, token); }).detach(); + else kernel.RunOnGuestCoreProcess(std::string(e.first), [&system, f = e.second] { f(system); }); + } + if (run_on_host) kernel.RunOnHostCoreProcess("vi", [&, token] { VI::LoopProcess(system, token); }).detach(); + else kernel.RunOnGuestCoreProcess("vi", [&, token] { VI::LoopProcess(system, token); }); // Avoid cold clones of lambdas -- succintly for (auto const& e : std::vector>{ {"sm", &SM::LoopProcess}, From 7a08f340dc5ff6fe1c0de2207273424d85ae0d0c Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 13 Jan 2026 08:10:02 +0000 Subject: [PATCH 36/78] add fallback buffer back --- src/common/host_memory.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/common/host_memory.h b/src/common/host_memory.h index 31af3cc9f1..f26804b55b 100644 --- a/src/common/host_memory.h +++ b/src/common/host_memory.h @@ -83,6 +83,9 @@ private: u8* backing_base{}; u8* virtual_base{}; size_t virtual_base_offset{}; +#ifdef __OPENORBIS__ + std::optional> fallback_buffer; +#endif }; } // namespace Common From 46a00cc978076d5239c21ec654546c49806811ea Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 13 Jan 2026 10:42:46 +0000 Subject: [PATCH 37/78] fibers that don't immediately crash?!!?!?!!? --- src/common/fiber.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/common/fiber.cpp b/src/common/fiber.cpp index 69eca732eb..1b201c47af 100644 --- a/src/common/fiber.cpp +++ b/src/common/fiber.cpp @@ -33,6 +33,9 @@ struct Fiber::FiberImpl { boost::context::detail::fcontext_t context{}; boost::context::detail::fcontext_t rewind_context{}; + boost::context::detail::fcontext_t context{}; + boost::context::detail::fcontext_t rewind_context{}; + std::mutex guard; std::function entry_point; std::function rewind_point; From cfd11d8a5e23d2592adf1019b8e87064450f2fe1 Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 13 Jan 2026 10:42:57 +0000 Subject: [PATCH 38/78] fix atexit impl --- src/yuzu_cmd/yuzu.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/yuzu_cmd/yuzu.cpp b/src/yuzu_cmd/yuzu.cpp index 8271ea713d..59ff32796f 100644 --- a/src/yuzu_cmd/yuzu.cpp +++ b/src/yuzu_cmd/yuzu.cpp @@ -56,7 +56,9 @@ #include #include <__thread/support.h> # define STUB_WEAK(name) extern "C" void name() { printf("called " #name); asm volatile("ud2"); } -void *__cxa_thread_atexit_impl = nullptr; +extern "C" void __cxa_thread_atexit_impl() { + //printf("atexit called"); +} STUB_WEAK(__assert) STUB_WEAK(ZSTD_trace_compress_begin) STUB_WEAK(ZSTD_trace_compress_end) From 9df314c9149777688b186de0269c6ad8a9abb9a3 Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 13 Jan 2026 11:26:30 +0000 Subject: [PATCH 39/78] more inline pt2 --- .../service/ns/platform_service_manager.cpp | 62 ++++++++----------- 1 file changed, 26 insertions(+), 36 deletions(-) diff --git a/src/core/hle/service/ns/platform_service_manager.cpp b/src/core/hle/service/ns/platform_service_manager.cpp index e91e6451a8..a615037c24 100644 --- a/src/core/hle/service/ns/platform_service_manager.cpp +++ b/src/core/hle/service/ns/platform_service_manager.cpp @@ -34,10 +34,10 @@ struct FontRegion { // The below data is specific to shared font data dumped from Switch on f/w 2.2 // Virtual address and offsets/sizes likely will vary by dump -[[maybe_unused]] constexpr VAddr SHARED_FONT_MEM_VADDR{0x00000009d3016000ULL}; -constexpr u32 EXPECTED_RESULT{0x7f9a0218}; // What we expect the decrypted bfttf first 4 bytes to be -constexpr u32 EXPECTED_MAGIC{0x36f81a1e}; // What we expect the encrypted bfttf first 4 bytes to be -constexpr u64 SHARED_FONT_MEM_SIZE{0x1100000}; +[[maybe_unused]] constexpr VAddr SHARED_FONT_MEM_VADDR = 0x00000009d3016000ULL; +constexpr u32 EXPECTED_RESULT = 0x7f9a0218; // What we expect the decrypted bfttf first 4 bytes to be +constexpr u32 EXPECTED_MAGIC = 0x36f81a1e; // What we expect the encrypted bfttf first 4 bytes to be +constexpr u64 SHARED_FONT_MEM_SIZE = 0x1100000; constexpr FontRegion EMPTY_REGION{0, 0}; static void DecryptSharedFont(const std::span input, std::span output, std::size_t& offset) { @@ -70,7 +70,7 @@ void EncryptSharedFont(const std::vector& input, std::vector& output, s const auto key = Common::swap32(EXPECTED_RESULT ^ EXPECTED_MAGIC); std::vector transformed_font(input.size() + 2); transformed_font[0] = Common::swap32(EXPECTED_MAGIC); - transformed_font[1] = Common::swap32(static_cast(input.size() * sizeof(u32))) ^ key; + transformed_font[1] = Common::swap32(u32(input.size() * sizeof(u32))) ^ key; std::transform(input.begin(), input.end(), transformed_font.begin() + 2, [key](u32 in) { return in ^ key; }); std::memcpy(output.data() + offset, transformed_font.data(), transformed_font.size() * sizeof(u32)); offset += transformed_font.size() * sizeof(u32); @@ -119,40 +119,30 @@ IPlatformServiceManager::IPlatformServiceManager(Core::System& system_, const ch // Rebuild shared fonts from data ncas or synthesize for (auto& font : SHARED_FONTS) { FileSys::VirtualFile romfs; - const auto nca = - nand->GetEntry(static_cast(font.first), FileSys::ContentRecordType::Data); - if (nca) { + if (auto const nca = nand->GetEntry(u64(font.first), FileSys::ContentRecordType::Data); nca) romfs = nca->GetRomFS(); - } - - if (!romfs) { - romfs = FileSys::SystemArchive::SynthesizeSystemArchive(static_cast(font.first)); - } - - if (!romfs) { + if (!romfs) + romfs = FileSys::SystemArchive::SynthesizeSystemArchive(u64(font.first)); + if (romfs) { + if (auto const extracted_romfs = FileSys::ExtractRomFS(romfs); extracted_romfs) { + if (auto const font_fp = extracted_romfs->GetFile(font.second); font_fp) { + std::vector font_data_u32(font_fp->GetSize() / sizeof(u32)); + font_fp->ReadBytes(font_data_u32.data(), font_fp->GetSize()); + // We need to be BigEndian as u32s for the xor encryption + std::transform(font_data_u32.begin(), font_data_u32.end(), font_data_u32.begin(), Common::swap32); + // Font offset and size do not account for the header + const FontRegion region{u32(offset + 8), u32((font_data_u32.size() * sizeof(u32)) - 8)}; + DecryptSharedFont(font_data_u32, impl->shared_font, offset); + impl->shared_font_regions.push_back(region); + } else { + LOG_ERROR(Service_NS, "{:016X} has no file \"{}\"! Skipping", font.first, font.second); + } + } else { + LOG_ERROR(Service_NS, "Failed to extract RomFS for {:016X}! Skipping", font.first); + } + } else { LOG_ERROR(Service_NS, "Failed to find or synthesize {:016X}! Skipping", font.first); - continue; } - - const auto extracted_romfs = FileSys::ExtractRomFS(romfs); - if (!extracted_romfs) { - LOG_ERROR(Service_NS, "Failed to extract RomFS for {:016X}! Skipping", font.first); - continue; - } - const auto font_fp = extracted_romfs->GetFile(font.second); - if (!font_fp) { - LOG_ERROR(Service_NS, "{:016X} has no file \"{}\"! Skipping", font.first, font.second); - continue; - } - std::vector font_data_u32(font_fp->GetSize() / sizeof(u32)); - font_fp->ReadBytes(font_data_u32.data(), font_fp->GetSize()); - // We need to be BigEndian as u32s for the xor encryption - std::transform(font_data_u32.begin(), font_data_u32.end(), font_data_u32.begin(), - Common::swap32); - // Font offset and size do not account for the header - const FontRegion region{u32(offset + 8), u32((font_data_u32.size() * sizeof(u32)) - 8)}; - DecryptSharedFont(font_data_u32, impl->shared_font, offset); - impl->shared_font_regions.push_back(region); } } From d1f10e93949c4672a5e700e16c9dba5740d95f85 Mon Sep 17 00:00:00 2001 From: lizzie Date: Fri, 16 Jan 2026 08:46:20 +0000 Subject: [PATCH 40/78] extra buffer precautions to not exhaust DMem, format better + perf history nerf --- src/common/fiber.cpp | 3 --- src/common/virtual_buffer.cpp | 40 +++++++++++------------------------ src/core/perf_stats.h | 4 ++++ 3 files changed, 16 insertions(+), 31 deletions(-) diff --git a/src/common/fiber.cpp b/src/common/fiber.cpp index 1b201c47af..69eca732eb 100644 --- a/src/common/fiber.cpp +++ b/src/common/fiber.cpp @@ -33,9 +33,6 @@ struct Fiber::FiberImpl { boost::context::detail::fcontext_t context{}; boost::context::detail::fcontext_t rewind_context{}; - boost::context::detail::fcontext_t context{}; - boost::context::detail::fcontext_t rewind_context{}; - std::mutex guard; std::function entry_point; std::function rewind_point; diff --git a/src/common/virtual_buffer.cpp b/src/common/virtual_buffer.cpp index 407bf2e157..5b9764d236 100644 --- a/src/common/virtual_buffer.cpp +++ b/src/common/virtual_buffer.cpp @@ -111,15 +111,15 @@ static void SwapHandler(int sig, void* raw_context) { if (auto const it = std::ranges::find_if(swap_regions, [addr = mctx.mc_addr](auto const& e) { return uintptr_t(addr) >= uintptr_t(e.first) && uintptr_t(addr) < uintptr_t(e.first) + e.second; }); it != swap_regions.end()) { - size_t const page_size = 4096 * 8; + size_t const page_size = 4096 * 4; //16K size_t const page_mask = ~(page_size - 1); // should replace the existing mapping... ugh void* aligned_addr = reinterpret_cast(uintptr_t(mctx.mc_addr) & page_mask); void* res = mmap(aligned_addr, page_size, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0); if (res == MAP_FAILED) { - LOG_ERROR(HW_Memory, "FAIL mapped addr {},{} @ {}:{}", mctx.mc_addr, aligned_addr, it->first, it->second); + LOG_ERROR(HW_Memory, "{},{} @ {}:{}", mctx.mc_addr, aligned_addr, it->first, it->second); } else { - LOG_INFO(HW_Memory, "OK mapped addr {},{} @ {}:{}", mctx.mc_addr, aligned_addr, it->first, it->second); + LOG_TRACE(HW_Memory, "{},{} @ {}:{}", mctx.mc_addr, aligned_addr, it->first, it->second); } } else { LOG_ERROR(HW_Memory, "fault in addr {:#x} at {:#x}", mctx.mc_addr, mctx.mc_rip); // print caller address @@ -133,36 +133,20 @@ void InitSwap() noexcept { void InitSwap() noexcept {} #endif -static const char *swapfile_names[] { - "/data/eden/games/swap0.bin", - "/data/eden/games/swap1.bin", - "/data/eden/games/swap2.bin", - "/data/eden/games/swap3.bin", - "/data/eden/games/swap4.bin" -}; -static size_t swapfile_count = 0; - void* AllocateMemoryPages(std::size_t size) noexcept { #ifdef _WIN32 void* addr = VirtualAlloc(nullptr, size, MEM_COMMIT, PAGE_READWRITE); ASSERT(addr != nullptr); #elif defined(__OPENORBIS__) - void* addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); - if (addr == MAP_FAILED) { - LOG_WARNING(HW_Memory, "failed to mmap({} bytes) using swapfile {}", size, swapfile_names[swapfile_count]); - // int fd = open(swapfile_names[swapfile_count], O_TRUNC | O_RDWR | O_CREAT, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH); - // ASSERT(fd > 0); - // ftruncate(fd, size); - // addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); - // ASSERT(addr != MAP_FAILED); - // ++swapfile_count; - - addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_VOID | MAP_PRIVATE, -1, 0); - ASSERT(addr != MAP_FAILED); - swap_regions.emplace_back(addr, size); - } else { - LOG_INFO(HW_Memory, "mmap {} bytes", size); - } + // void* addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); + // if (addr == MAP_FAILED) { + LOG_WARNING(HW_Memory, "Using VoidMem for {}B area", size); + void* addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_VOID | MAP_PRIVATE, -1, 0); + ASSERT(addr != MAP_FAILED); + swap_regions.emplace_back(addr, size); + // } else { + // LOG_INFO(HW_Memory, "mmap {} bytes", size); + // } #else void* addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); ASSERT(addr != MAP_FAILED); diff --git a/src/core/perf_stats.h b/src/core/perf_stats.h index dd6becc02d..92910a959f 100644 --- a/src/core/perf_stats.h +++ b/src/core/perf_stats.h @@ -60,7 +60,11 @@ private: std::size_t current_index{0}; /// Stores an hour of historical frametime data useful for processing and tracking performance /// regressions with code changes. +#ifdef __OPENORBIS__ + std::array perf_history{}; +#else std::array perf_history{}; +#endif /// Point when the cumulative counters were reset Clock::time_point reset_point = Clock::now(); From 99a67199e371952f8dd6ee546c0081df360517a1 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 17 Jan 2026 00:52:51 +0000 Subject: [PATCH 41/78] reduce arm codeisze, force 16x4 pages again --- src/common/virtual_buffer.cpp | 36 +++++++++++++++-------- src/core/arm/dynarmic/arm_dynarmic_32.cpp | 2 +- src/core/arm/dynarmic/arm_dynarmic_64.cpp | 2 +- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/common/virtual_buffer.cpp b/src/common/virtual_buffer.cpp index 5b9764d236..f3a3a695e0 100644 --- a/src/common/virtual_buffer.cpp +++ b/src/common/virtual_buffer.cpp @@ -105,21 +105,24 @@ struct Ucontext { } static boost::container::static_vector, 16> swap_regions; +static std::mutex evil_swap_mutex; extern "C" int sceKernelRemoveExceptionHandler(s32 sig_num); static void SwapHandler(int sig, void* raw_context) { + std::unique_lock lk{evil_swap_mutex}; auto& mctx = ((Orbis::Ucontext*)raw_context)->uc_mcontext; if (auto const it = std::ranges::find_if(swap_regions, [addr = mctx.mc_addr](auto const& e) { return uintptr_t(addr) >= uintptr_t(e.first) && uintptr_t(addr) < uintptr_t(e.first) + e.second; }); it != swap_regions.end()) { - size_t const page_size = 4096 * 4; //16K + size_t const page_size = 4096 * 8; //16K size_t const page_mask = ~(page_size - 1); // should replace the existing mapping... ugh void* aligned_addr = reinterpret_cast(uintptr_t(mctx.mc_addr) & page_mask); void* res = mmap(aligned_addr, page_size, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0); if (res == MAP_FAILED) { - LOG_ERROR(HW_Memory, "{},{} @ {}:{}", mctx.mc_addr, aligned_addr, it->first, it->second); + LOG_ERROR(HW_Memory, "{:#x},{} @ {}:{:#x}", mctx.mc_addr, aligned_addr, it->first, it->second); + sceKernelRemoveExceptionHandler(SIGSEGV); // to not catch the next signal } else { - LOG_TRACE(HW_Memory, "{},{} @ {}:{}", mctx.mc_addr, aligned_addr, it->first, it->second); + LOG_TRACE(HW_Memory, "{:#x},{} @ {}:{:#x}", mctx.mc_addr, aligned_addr, it->first, it->second); } } else { LOG_ERROR(HW_Memory, "fault in addr {:#x} at {:#x}", mctx.mc_addr, mctx.mc_rip); // print caller address @@ -138,15 +141,17 @@ void* AllocateMemoryPages(std::size_t size) noexcept { void* addr = VirtualAlloc(nullptr, size, MEM_COMMIT, PAGE_READWRITE); ASSERT(addr != nullptr); #elif defined(__OPENORBIS__) - // void* addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); - // if (addr == MAP_FAILED) { - LOG_WARNING(HW_Memory, "Using VoidMem for {}B area", size); - void* addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_VOID | MAP_PRIVATE, -1, 0); - ASSERT(addr != MAP_FAILED); - swap_regions.emplace_back(addr, size); - // } else { - // LOG_INFO(HW_Memory, "mmap {} bytes", size); - // } + void* addr; + if (size <= 8192 * 4096) { + addr = malloc(size); + LOG_WARNING(HW_Memory, "Using DMem for {} bytes area @ {}", size, addr); + ASSERT(addr != nullptr); + } else { + addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_VOID | MAP_PRIVATE, -1, 0); + LOG_WARNING(HW_Memory, "Using VoidMem for {} bytes area @ {}", size, addr); + ASSERT(addr != MAP_FAILED); + swap_regions.emplace_back(addr, size); + } #else void* addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); ASSERT(addr != MAP_FAILED); @@ -159,6 +164,13 @@ void FreeMemoryPages(void* addr, [[maybe_unused]] std::size_t size) noexcept { return; #ifdef _WIN32 VirtualFree(addr, 0, MEM_RELEASE); +#elif defined(__OPENORBIS__) + if (size <= 8192 * 4096) { + free(addr); + } else { + int rc = munmap(addr, size); + ASSERT(rc == 0); + } #else int rc = munmap(addr, size); ASSERT(rc == 0); diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index a485ba9a78..f41a2be482 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp @@ -203,7 +203,7 @@ void ArmDynarmic32::MakeJit(Common::PageTable* page_table) { // Code cache size #if defined(__OPENORBIS__) - config.code_cache_size = std::uint32_t(32_MiB); + config.code_cache_size = std::uint32_t(8_MiB); #elif defined(ARCHITECTURE_arm64) || defined(__sun__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) config.code_cache_size = std::uint32_t(128_MiB); #else diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index bfd531dabc..4da2c2b211 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp @@ -255,7 +255,7 @@ void ArmDynarmic64::MakeJit(Common::PageTable* page_table, std::size_t address_s // Code cache size #if defined(__OPENORBIS__) - config.code_cache_size = std::uint32_t(32_MiB); + config.code_cache_size = std::uint32_t(8_MiB); #elif defined(ARCHITECTURE_arm64) || defined(__sun__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) config.code_cache_size = std::uint32_t(128_MiB); #else From 654117245b7efd3dfd82c3dd8c1fb52a5fee0180 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sun, 18 Jan 2026 16:33:17 +0000 Subject: [PATCH 42/78] add emutls.c --- src/yuzu_cmd/CMakeLists.txt | 4 +- src/yuzu_cmd/emutls.c | 181 ++++++++++++++++++++++++++++++++++++ 2 files changed, 184 insertions(+), 1 deletion(-) create mode 100644 src/yuzu_cmd/emutls.c diff --git a/src/yuzu_cmd/CMakeLists.txt b/src/yuzu_cmd/CMakeLists.txt index 8707e8ce7e..720b7449c7 100644 --- a/src/yuzu_cmd/CMakeLists.txt +++ b/src/yuzu_cmd/CMakeLists.txt @@ -27,6 +27,7 @@ add_executable(yuzu-cmd sdl_config.cpp sdl_config.h yuzu.cpp + emutls.c yuzu.rc ) @@ -70,5 +71,6 @@ if (NOT MSVC) endif() if (PLATFORM_PS4) - create_ps4_pkg(yuzu-cmd eden-cli IV0000-BREW00090_00-EDENEMULAT000000) + create_ps4_eboot(yuzu-cmd eden-cli IV0000-BREW00090_00-EDENEMULAT000000) + #create_ps4_pkg(yuzu-cmd eden-cli IV0000-BREW00090_00-EDENEMULAT000000) endif() diff --git a/src/yuzu_cmd/emutls.c b/src/yuzu_cmd/emutls.c new file mode 100644 index 0000000000..3b0a0cc909 --- /dev/null +++ b/src/yuzu_cmd/emutls.c @@ -0,0 +1,181 @@ +/* ===---------- emutls.c - Implements __emutls_get_address ---------------=== + * + * The LLVM Compiler Infrastructure + * + * This file is dual licensed under the MIT and the University of Illinois Open + * Source Licenses. See LICENSE.TXT for details. + * + * ===----------------------------------------------------------------------=== + */ +#include +#include +#include +#include + +//#include "int_util.h" + +/* Default is not to use posix_memalign, so systems like Android + * can use thread local data without heavier POSIX memory allocators. + */ +#ifndef EMUTLS_USE_POSIX_MEMALIGN +#define EMUTLS_USE_POSIX_MEMALIGN 0 +#endif + +/* For every TLS variable xyz, + * there is one __emutls_control variable named __emutls_v.xyz. + * If xyz has non-zero initial value, __emutls_v.xyz's "value" + * will point to __emutls_t.xyz, which has the initial value. + */ +typedef struct __emutls_control { + size_t size; /* size of the object in bytes */ + size_t align; /* alignment of the object in bytes */ + union { + uintptr_t index; /* data[index-1] is the object address */ + void* address; /* object address, when in single thread env */ + } object; + void* value; /* null or non-zero initial value for the object */ +} __emutls_control; + +static inline void* emutls_memalign_alloc(size_t align, size_t size) { + void *base; +#if EMUTLS_USE_POSIX_MEMALIGN + if (posix_memalign(&base, align, size) != 0) + abort(); +#else + #define EXTRA_ALIGN_PTR_BYTES (align - 1 + sizeof(void*)) + char* object; + if ((object = malloc(EXTRA_ALIGN_PTR_BYTES + size)) == NULL) + abort(); + base = (void*)(((uintptr_t)(object + EXTRA_ALIGN_PTR_BYTES)) + & ~(uintptr_t)(align - 1)); + + ((void**)base)[-1] = object; +#endif + return base; +} + +static inline void emutls_memalign_free(void* base) { +#if EMUTLS_USE_POSIX_MEMALIGN + free(base); +#else + /* The mallocated address is in ((void**)base)[-1] */ + free(((void**)base)[-1]); +#endif +} + +/* Emulated TLS objects are always allocated at run-time. */ +static inline void* emutls_allocate_object(__emutls_control* control) { + /* Use standard C types, check with gcc's emutls.o. */ + //typedef unsigned int gcc_word __attribute__((mode(word))); + //typedef unsigned int gcc_pointer __attribute__((mode(pointer))); + //COMPILE_TIME_ASSERT(sizeof(size_t) == sizeof(gcc_word)); + //COMPILE_TIME_ASSERT(sizeof(uintptr_t) == sizeof(gcc_pointer)); + //COMPILE_TIME_ASSERT(sizeof(uintptr_t) == sizeof(void*)); + + size_t size = control->size; + size_t align = control->align; + if (align < sizeof(void*)) + align = sizeof(void*); + /* Make sure that align is power of 2. */ + if ((align & (align - 1)) != 0) + abort(); + + void* base = emutls_memalign_alloc(align, size); + if (control->value) + memcpy(base, control->value, size); + else + memset(base, 0, size); + return base; +} + +static pthread_mutex_t emutls_mutex = PTHREAD_MUTEX_INITIALIZER; + +static size_t emutls_num_object = 0; /* number of allocated TLS objects */ + +typedef struct emutls_address_array { + uintptr_t size; /* number of elements in the 'data' array */ + void* data[]; +} emutls_address_array; + +static pthread_key_t emutls_pthread_key; + +static void emutls_key_destructor(void* ptr) { + emutls_address_array* array = (emutls_address_array*)ptr; + uintptr_t i; + for (i = 0; i < array->size; ++i) { + if (array->data[i]) + emutls_memalign_free(array->data[i]); + } + free(ptr); +} + +static void emutls_init(void) { + if (pthread_key_create(&emutls_pthread_key, emutls_key_destructor) != 0) + abort(); +} + +/* Returns control->object.index; set index if not allocated yet. */ +static inline uintptr_t emutls_get_index(__emutls_control* control) { + uintptr_t index = __atomic_load_n(&control->object.index, __ATOMIC_ACQUIRE); + if (!index) { + static pthread_once_t once = PTHREAD_ONCE_INIT; + pthread_once(&once, emutls_init); + pthread_mutex_lock(&emutls_mutex); + index = control->object.index; + if (!index) { + index = ++emutls_num_object; + __atomic_store_n(&control->object.index, index, __ATOMIC_RELEASE); + } + pthread_mutex_unlock(&emutls_mutex); + } + return index; +} + +/* Updates newly allocated thread local emutls_address_array. */ +static inline void emutls_check_array_set_size(emutls_address_array* array, + uintptr_t size) { + if (array == NULL) + abort(); + array->size = size; + pthread_setspecific(emutls_pthread_key, (void*)array); +} + +/* Returns the new 'data' array size, number of elements, + * which must be no smaller than the given index. + */ +static inline uintptr_t emutls_new_data_array_size(uintptr_t index) { + /* Need to allocate emutls_address_array with one extra slot + * to store the data array size. + * Round up the emutls_address_array size to multiple of 16. + */ + return ((index + 1 + 15) & ~((uintptr_t)15)) - 1; +} + +/* Returns the thread local emutls_address_array. + * Extends its size if necessary to hold address at index. + */ +static inline emutls_address_array* emutls_get_address_array(uintptr_t index) { + emutls_address_array* array = pthread_getspecific(emutls_pthread_key); + if (array == NULL) { + uintptr_t new_size = emutls_new_data_array_size(index); + array = calloc(new_size + 1, sizeof(void*)); + emutls_check_array_set_size(array, new_size); + } else if (index > array->size) { + uintptr_t orig_size = array->size; + uintptr_t new_size = emutls_new_data_array_size(index); + array = realloc(array, (new_size + 1) * sizeof(void*)); + if (array) + memset(array->data + orig_size, 0, + (new_size - orig_size) * sizeof(void*)); + emutls_check_array_set_size(array, new_size); + } + return array; +} + +void* __emutls_get_address(__emutls_control* control) { + uintptr_t index = emutls_get_index(control); + emutls_address_array* array = emutls_get_address_array(index); + if (array->data[index - 1] == NULL) + array->data[index - 1] = emutls_allocate_object(control); + return array->data[index - 1]; +} From e29aad3f048680cc7c63c87cf9d0723cddd0d6ef Mon Sep 17 00:00:00 2001 From: lizzie Date: Sun, 18 Jan 2026 16:33:50 +0000 Subject: [PATCH 43/78] temp fix for dpad --- .../service/ns/platform_service_manager.cpp | 9 ++++++- src/hid_core/resource_manager.cpp | 26 +++++++++---------- .../resources/abstracted_pad/abstract_pad.cpp | 2 +- .../resources/debug_pad/debug_pad.cpp | 2 +- .../resources/digitizer/digitizer.cpp | 2 +- src/hid_core/resources/keyboard/keyboard.cpp | 2 +- src/hid_core/resources/mouse/debug_mouse.cpp | 2 +- src/hid_core/resources/mouse/mouse.cpp | 2 +- src/hid_core/resources/npad/npad.cpp | 11 ++++---- .../resources/six_axis/console_six_axis.cpp | 2 +- src/hid_core/resources/six_axis/six_axis.cpp | 2 +- .../system_buttons/capture_button.cpp | 2 +- .../resources/system_buttons/home_button.cpp | 2 +- .../resources/system_buttons/sleep_button.cpp | 2 +- .../touch_screen/touch_screen_resource.cpp | 14 +++++----- 15 files changed, 44 insertions(+), 38 deletions(-) diff --git a/src/core/hle/service/ns/platform_service_manager.cpp b/src/core/hle/service/ns/platform_service_manager.cpp index a615037c24..4caea67d2c 100644 --- a/src/core/hle/service/ns/platform_service_manager.cpp +++ b/src/core/hle/service/ns/platform_service_manager.cpp @@ -40,6 +40,7 @@ constexpr u32 EXPECTED_MAGIC = 0x36f81a1e; // What we expect the encrypted bftt constexpr u64 SHARED_FONT_MEM_SIZE = 0x1100000; constexpr FontRegion EMPTY_REGION{0, 0}; +#ifndef __OPENORBIS__ static void DecryptSharedFont(const std::span input, std::span output, std::size_t& offset) { ASSERT(offset + (input.size() * sizeof(u32)) < SHARED_FONT_MEM_SIZE && "Shared fonts exceeds 17mb!"); ASSERT(input[0] == EXPECTED_MAGIC && "Failed to derive key, unexpected magic number"); @@ -51,6 +52,7 @@ static void DecryptSharedFont(const std::span input, std::span ou std::memcpy(output.data() + offset, transformed_font.data(), transformed_font.size() * sizeof(u32)); offset += transformed_font.size() * sizeof(u32); } +#endif void DecryptSharedFontToTTF(const std::vector& input, std::vector& output) { ASSERT_MSG(input[0] == EXPECTED_MAGIC, "Failed to derive key, unexpected magic number"); @@ -83,8 +85,10 @@ struct IPlatformServiceManager::Impl { // Automatically populated based on shared_fonts dump or system archives. // 6 builtin fonts + extra 2 for whatever may come after boost::container::static_vector shared_font_regions; +#ifndef __OPENORBIS__ /// Backing memory for the shared font data std::array shared_font; +#endif }; IPlatformServiceManager::IPlatformServiceManager(Core::System& system_, const char* service_name_) @@ -111,8 +115,8 @@ IPlatformServiceManager::IPlatformServiceManager(Core::System& system_, const ch // clang-format on RegisterHandlers(functions); +#ifndef __OPENORBIS__ auto& fsc = system.GetFileSystemController(); - // Attempt to load shared font data from disk const auto* nand = fsc.GetSystemNANDContents(); std::size_t offset = 0; @@ -144,6 +148,7 @@ IPlatformServiceManager::IPlatformServiceManager(Core::System& system_, const ch LOG_ERROR(Service_NS, "Failed to find or synthesize {:016X}! Skipping", font.first); } } +#endif } IPlatformServiceManager::~IPlatformServiceManager() = default; @@ -177,8 +182,10 @@ Result IPlatformServiceManager::GetSharedMemoryNativeHandle(OutCopyHandleshared_font.data(), impl->shared_font.size()); +#endif // FIXME: this shouldn't belong to the kernel *out_shared_memory_native_handle = &kernel.GetFontSharedMem(); diff --git a/src/hid_core/resource_manager.cpp b/src/hid_core/resource_manager.cpp index 62fec03b1a..2e1e9e3dfc 100644 --- a/src/hid_core/resource_manager.cpp +++ b/src/hid_core/resource_manager.cpp @@ -201,7 +201,7 @@ Result ResourceManager::CreateAppletResource(u64 aruid) { } Result ResourceManager::CreateAppletResourceImpl(u64 aruid) { - std::scoped_lock lock{shared_mutex}; + //std::scoped_lock lock{shared_mutex}; return applet_resource->CreateAppletResource(aruid); } @@ -291,17 +291,17 @@ void ResourceManager::InitializeAHidSampler() { } Result ResourceManager::RegisterCoreAppletResource() { - std::scoped_lock lock{shared_mutex}; + //std::scoped_lock lock{shared_mutex}; return applet_resource->RegisterCoreAppletResource(); } Result ResourceManager::UnregisterCoreAppletResource() { - std::scoped_lock lock{shared_mutex}; + //std::scoped_lock lock{shared_mutex}; return applet_resource->UnregisterCoreAppletResource(); } Result ResourceManager::RegisterAppletResourceUserId(u64 aruid, bool bool_value) { - std::scoped_lock lock{shared_mutex}; + //std::scoped_lock lock{shared_mutex}; auto result = applet_resource->RegisterAppletResourceUserId(aruid, bool_value); if (result.IsSuccess()) { result = npad->RegisterAppletResourceUserId(aruid); @@ -310,40 +310,40 @@ Result ResourceManager::RegisterAppletResourceUserId(u64 aruid, bool bool_value) } void ResourceManager::UnregisterAppletResourceUserId(u64 aruid) { - std::scoped_lock lock{shared_mutex}; + //std::scoped_lock lock{shared_mutex}; applet_resource->UnregisterAppletResourceUserId(aruid); npad->UnregisterAppletResourceUserId(aruid); // palma->UnregisterAppletResourceUserId(aruid); } Result ResourceManager::GetSharedMemoryHandle(Kernel::KSharedMemory** out_handle, u64 aruid) { - std::scoped_lock lock{shared_mutex}; + //std::scoped_lock lock{shared_mutex}; return applet_resource->GetSharedMemoryHandle(out_handle, aruid); } void ResourceManager::FreeAppletResourceId(u64 aruid) { - std::scoped_lock lock{shared_mutex}; + //std::scoped_lock lock{shared_mutex}; applet_resource->FreeAppletResourceId(aruid); npad->FreeAppletResourceId(aruid); } void ResourceManager::EnableInput(u64 aruid, bool is_enabled) { - std::scoped_lock lock{shared_mutex}; + //std::scoped_lock lock{shared_mutex}; applet_resource->EnableInput(aruid, is_enabled); } void ResourceManager::EnableSixAxisSensor(u64 aruid, bool is_enabled) { - std::scoped_lock lock{shared_mutex}; + //std::scoped_lock lock{shared_mutex}; applet_resource->EnableSixAxisSensor(aruid, is_enabled); } void ResourceManager::EnablePadInput(u64 aruid, bool is_enabled) { - std::scoped_lock lock{shared_mutex}; + //std::scoped_lock lock{shared_mutex}; applet_resource->EnablePadInput(aruid, is_enabled); } void ResourceManager::EnableTouchScreen(u64 aruid, bool is_enabled) { - std::scoped_lock lock{shared_mutex}; + //std::scoped_lock lock{shared_mutex}; applet_resource->EnableTouchScreen(aruid, is_enabled); } @@ -368,7 +368,7 @@ NpadGcVibrationDevice* ResourceManager::GetGcVibrationDevice( } Result ResourceManager::SetAruidValidForVibration(u64 aruid, bool is_enabled) { - std::scoped_lock lock{shared_mutex}; + //std::scoped_lock lock{shared_mutex}; const bool has_changed = applet_resource->SetAruidValidForVibration(aruid, is_enabled); if (has_changed) { @@ -391,7 +391,7 @@ void ResourceManager::SetForceHandheldStyleVibration(bool is_forced) { } Result ResourceManager::IsVibrationAruidActive(u64 aruid, bool& is_active) const { - std::scoped_lock lock{shared_mutex}; + //std::scoped_lock lock{shared_mutex}; is_active = applet_resource->IsVibrationAruidActive(aruid); return ResultSuccess; } diff --git a/src/hid_core/resources/abstracted_pad/abstract_pad.cpp b/src/hid_core/resources/abstracted_pad/abstract_pad.cpp index d7cf2bba9b..8ba67f131e 100644 --- a/src/hid_core/resources/abstracted_pad/abstract_pad.cpp +++ b/src/hid_core/resources/abstracted_pad/abstract_pad.cpp @@ -273,7 +273,7 @@ void AbstractPad::Update() { interface_type = properties_handler.GetInterfaceType(); - std::scoped_lock lock{*applet_resource_holder->shared_mutex}; + //std::scoped_lock lock{*applet_resource_holder->shared_mutex}; properties_handler.UpdateAllDeviceProperties(); battery_handler.UpdateCoreBatteryState(); button_handler.UpdateCoreBatteryState(); diff --git a/src/hid_core/resources/debug_pad/debug_pad.cpp b/src/hid_core/resources/debug_pad/debug_pad.cpp index 1102dad6c9..99c35d7687 100644 --- a/src/hid_core/resources/debug_pad/debug_pad.cpp +++ b/src/hid_core/resources/debug_pad/debug_pad.cpp @@ -23,7 +23,7 @@ void DebugPad::OnInit() {} void DebugPad::OnRelease() {} void DebugPad::OnUpdate(const Core::Timing::CoreTiming& core_timing) { - std::scoped_lock shared_lock{*shared_mutex}; + //std::scoped_lock shared_lock{*shared_mutex}; const u64 aruid = applet_resource->GetActiveAruid(); auto* data = applet_resource->GetAruidData(aruid); diff --git a/src/hid_core/resources/digitizer/digitizer.cpp b/src/hid_core/resources/digitizer/digitizer.cpp index 5d7dcadfe3..7bb5a43376 100644 --- a/src/hid_core/resources/digitizer/digitizer.cpp +++ b/src/hid_core/resources/digitizer/digitizer.cpp @@ -17,7 +17,7 @@ void Digitizer::OnInit() {} void Digitizer::OnRelease() {} void Digitizer::OnUpdate(const Core::Timing::CoreTiming& core_timing) { - std::scoped_lock shared_lock{*shared_mutex}; + //std::scoped_lock shared_lock{*shared_mutex}; const u64 aruid = applet_resource->GetActiveAruid(); auto* data = applet_resource->GetAruidData(aruid); diff --git a/src/hid_core/resources/keyboard/keyboard.cpp b/src/hid_core/resources/keyboard/keyboard.cpp index 340e8a65ce..96b6ad067f 100644 --- a/src/hid_core/resources/keyboard/keyboard.cpp +++ b/src/hid_core/resources/keyboard/keyboard.cpp @@ -22,7 +22,7 @@ void Keyboard::OnInit() {} void Keyboard::OnRelease() {} void Keyboard::OnUpdate(const Core::Timing::CoreTiming& core_timing) { - std::scoped_lock shared_lock{*shared_mutex}; + //std::scoped_lock shared_lock{*shared_mutex}; const u64 aruid = applet_resource->GetActiveAruid(); auto* data = applet_resource->GetAruidData(aruid); diff --git a/src/hid_core/resources/mouse/debug_mouse.cpp b/src/hid_core/resources/mouse/debug_mouse.cpp index 5f6f6e8e1a..313e8ef415 100644 --- a/src/hid_core/resources/mouse/debug_mouse.cpp +++ b/src/hid_core/resources/mouse/debug_mouse.cpp @@ -21,7 +21,7 @@ void DebugMouse::OnInit() {} void DebugMouse::OnRelease() {} void DebugMouse::OnUpdate(const Core::Timing::CoreTiming& core_timing) { - std::scoped_lock shared_lock{*shared_mutex}; + //std::scoped_lock shared_lock{*shared_mutex}; const u64 aruid = applet_resource->GetActiveAruid(); auto* data = applet_resource->GetAruidData(aruid); diff --git a/src/hid_core/resources/mouse/mouse.cpp b/src/hid_core/resources/mouse/mouse.cpp index 53a8938a1b..4531d8a6cd 100644 --- a/src/hid_core/resources/mouse/mouse.cpp +++ b/src/hid_core/resources/mouse/mouse.cpp @@ -21,7 +21,7 @@ void Mouse::OnInit() {} void Mouse::OnRelease() {} void Mouse::OnUpdate(const Core::Timing::CoreTiming& core_timing) { - std::scoped_lock shared_lock{*shared_mutex}; + //std::scoped_lock shared_lock{*shared_mutex}; const u64 aruid = applet_resource->GetActiveAruid(); auto* data = applet_resource->GetAruidData(aruid); diff --git a/src/hid_core/resources/npad/npad.cpp b/src/hid_core/resources/npad/npad.cpp index a0f72ab298..24e9b33b30 100644 --- a/src/hid_core/resources/npad/npad.cpp +++ b/src/hid_core/resources/npad/npad.cpp @@ -74,7 +74,7 @@ Result NPad::Activate() { Result NPad::Activate(u64 aruid) { std::scoped_lock lock{mutex}; - std::scoped_lock shared_lock{*applet_resource_holder.shared_mutex}; + //std::scoped_lock shared_lock{*applet_resource_holder.shared_mutex}; auto* data = applet_resource_holder.applet_resource->GetAruidData(aruid); const auto aruid_index = applet_resource_holder.applet_resource->GetIndexFromAruid(aruid); @@ -393,7 +393,7 @@ void NPad::WriteEmptyEntry(NpadInternalState* npad) { } void NPad::RequestPadStateUpdate(u64 aruid, Core::HID::NpadIdType npad_id) { - std::scoped_lock lock{*applet_resource_holder.shared_mutex}; + //std::scoped_lock lock{*applet_resource_holder.shared_mutex}; auto& controller = GetControllerFromNpadIdType(aruid, npad_id); const auto controller_type = controller.device->GetNpadStyleIndex(); @@ -466,7 +466,7 @@ void NPad::OnUpdate(const Core::Timing::CoreTiming& core_timing) { return; } - std::scoped_lock lock{*applet_resource_holder.shared_mutex}; + //std::scoped_lock lock{*applet_resource_holder.shared_mutex}; for (std::size_t aruid_index = 0; aruid_index < AruidIndexMax; ++aruid_index) { const auto* data = applet_resource_holder.applet_resource->GetAruidDataByIndex(aruid_index); @@ -1221,7 +1221,7 @@ Result NPad::SetNpadSystemExtStateEnabled(u64 aruid, bool is_enabled) { const auto result = npad_resource.SetNpadSystemExtStateEnabled(aruid, is_enabled); if (result.IsSuccess()) { - std::scoped_lock shared_lock{*applet_resource_holder.shared_mutex}; + //std::scoped_lock shared_lock{*applet_resource_holder.shared_mutex}; // TODO: abstracted_pad->EnableAppletToGetInput(aruid); } @@ -1339,8 +1339,7 @@ void NPad::UpdateHandheldAbstractState() { void NPad::EnableAppletToGetInput(u64 aruid) { std::scoped_lock lock{mutex}; - std::scoped_lock shared_lock{*applet_resource_holder.shared_mutex}; - + //std::scoped_lock shared_lock{*applet_resource_holder.shared_mutex}; for (auto& abstract_pad : abstracted_pads) { abstract_pad.EnableAppletToGetInput(aruid); } diff --git a/src/hid_core/resources/six_axis/console_six_axis.cpp b/src/hid_core/resources/six_axis/console_six_axis.cpp index 4f733cc76f..85c45a2d6d 100644 --- a/src/hid_core/resources/six_axis/console_six_axis.cpp +++ b/src/hid_core/resources/six_axis/console_six_axis.cpp @@ -20,7 +20,7 @@ void ConsoleSixAxis::OnInit() {} void ConsoleSixAxis::OnRelease() {} void ConsoleSixAxis::OnUpdate(const Core::Timing::CoreTiming& core_timing) { - std::scoped_lock shared_lock{*shared_mutex}; + //std::scoped_lock shared_lock{*shared_mutex}; const u64 aruid = applet_resource->GetActiveAruid(); auto* data = applet_resource->GetAruidData(aruid); diff --git a/src/hid_core/resources/six_axis/six_axis.cpp b/src/hid_core/resources/six_axis/six_axis.cpp index b407a5c76e..2624deaf6f 100644 --- a/src/hid_core/resources/six_axis/six_axis.cpp +++ b/src/hid_core/resources/six_axis/six_axis.cpp @@ -27,7 +27,7 @@ void SixAxis::OnInit() {} void SixAxis::OnRelease() {} void SixAxis::OnUpdate(const Core::Timing::CoreTiming& core_timing) { - std::scoped_lock shared_lock{*shared_mutex}; + //std::scoped_lock shared_lock{*shared_mutex}; for (std::size_t aruid_index = 0; aruid_index < AruidIndexMax; ++aruid_index) { const auto* data = applet_resource->GetAruidDataByIndex(aruid_index); diff --git a/src/hid_core/resources/system_buttons/capture_button.cpp b/src/hid_core/resources/system_buttons/capture_button.cpp index 95eb604241..411f4808a0 100644 --- a/src/hid_core/resources/system_buttons/capture_button.cpp +++ b/src/hid_core/resources/system_buttons/capture_button.cpp @@ -19,7 +19,7 @@ void CaptureButton::OnInit() {} void CaptureButton::OnRelease() {} void CaptureButton::OnUpdate(const Core::Timing::CoreTiming& core_timing) { - std::scoped_lock shared_lock{*shared_mutex}; + //std::scoped_lock shared_lock{*shared_mutex}; const u64 aruid = applet_resource->GetActiveAruid(); auto* data = applet_resource->GetAruidData(aruid); diff --git a/src/hid_core/resources/system_buttons/home_button.cpp b/src/hid_core/resources/system_buttons/home_button.cpp index f665338f32..cacfb221e2 100644 --- a/src/hid_core/resources/system_buttons/home_button.cpp +++ b/src/hid_core/resources/system_buttons/home_button.cpp @@ -19,7 +19,7 @@ void HomeButton::OnInit() {} void HomeButton::OnRelease() {} void HomeButton::OnUpdate(const Core::Timing::CoreTiming& core_timing) { - std::scoped_lock shared_lock{*shared_mutex}; + //std::scoped_lock shared_lock{*shared_mutex}; const u64 aruid = applet_resource->GetActiveAruid(); auto* data = applet_resource->GetAruidData(aruid); diff --git a/src/hid_core/resources/system_buttons/sleep_button.cpp b/src/hid_core/resources/system_buttons/sleep_button.cpp index 1596632465..6649594ef0 100644 --- a/src/hid_core/resources/system_buttons/sleep_button.cpp +++ b/src/hid_core/resources/system_buttons/sleep_button.cpp @@ -17,7 +17,7 @@ void SleepButton::OnInit() {} void SleepButton::OnRelease() {} void SleepButton::OnUpdate(const Core::Timing::CoreTiming& core_timing) { - std::scoped_lock shared_lock{*shared_mutex}; + //std::scoped_lock shared_lock{*shared_mutex}; const u64 aruid = applet_resource->GetActiveAruid(); auto* data = applet_resource->GetAruidData(aruid); diff --git a/src/hid_core/resources/touch_screen/touch_screen_resource.cpp b/src/hid_core/resources/touch_screen/touch_screen_resource.cpp index 5d45f861c6..dd0b71f448 100644 --- a/src/hid_core/resources/touch_screen/touch_screen_resource.cpp +++ b/src/hid_core/resources/touch_screen/touch_screen_resource.cpp @@ -34,7 +34,7 @@ Result TouchResource::ActivateTouch() { } if (global_ref_counter == 0) { - std::scoped_lock lock{*shared_mutex}; + //std::scoped_lock lock{*shared_mutex}; const auto result = touch_driver->StartTouchSensor(); if (result.IsError()) { @@ -60,7 +60,7 @@ Result TouchResource::ActivateTouch() { } Result TouchResource::ActivateTouch(u64 aruid) { - std::scoped_lock lock{*shared_mutex}; + //std::scoped_lock lock{*shared_mutex}; for (std::size_t aruid_index = 0; aruid_index < AruidIndexMax; aruid_index++) { auto* applet_data = applet_resource->GetAruidDataByIndex(aruid_index); @@ -121,7 +121,7 @@ Result TouchResource::ActivateGesture() { } Result TouchResource::ActivateGesture(u64 aruid, u32 basic_gesture_id) { - std::scoped_lock lock{*shared_mutex}; + //std::scoped_lock lock{*shared_mutex}; for (std::size_t aruid_index = 0; aruid_index < AruidIndexMax; aruid_index++) { auto* applet_data = applet_resource->GetAruidDataByIndex(aruid_index); @@ -300,7 +300,7 @@ void TouchResource::SetTouchScreenMagnification(f32 point1_x, f32 point1_y, f32 } Result TouchResource::SetTouchScreenResolution(u32 width, u32 height, u64 aruid) { - std::scoped_lock lock{*shared_mutex}; + //std::scoped_lock lock{*shared_mutex}; for (std::size_t aruid_index = 0; aruid_index < AruidIndexMax; aruid_index++) { const auto* applet_data = applet_resource->GetAruidDataByIndex(aruid_index); @@ -321,7 +321,7 @@ Result TouchResource::SetTouchScreenResolution(u32 width, u32 height, u64 aruid) Result TouchResource::SetTouchScreenConfiguration( const Core::HID::TouchScreenConfigurationForNx& touch_configuration, u64 aruid) { - std::scoped_lock lock{*shared_mutex}; + //std::scoped_lock lock{*shared_mutex}; for (std::size_t aruid_index = 0; aruid_index < AruidIndexMax; aruid_index++) { const auto* applet_data = applet_resource->GetAruidDataByIndex(aruid_index); @@ -341,7 +341,7 @@ Result TouchResource::SetTouchScreenConfiguration( Result TouchResource::GetTouchScreenConfiguration( Core::HID::TouchScreenConfigurationForNx& out_touch_configuration, u64 aruid) const { - std::scoped_lock lock{*shared_mutex}; + //std::scoped_lock lock{*shared_mutex}; for (std::size_t aruid_index = 0; aruid_index < AruidIndexMax; aruid_index++) { const auto* applet_data = applet_resource->GetAruidDataByIndex(aruid_index); @@ -518,7 +518,7 @@ void TouchResource::OnTouchUpdate(s64 timestamp) { gesture_handler.SetTouchState(current_touch_state.states, current_touch_state.entry_count, timestamp); - std::scoped_lock lock{*shared_mutex}; + //std::scoped_lock lock{*shared_mutex}; for (std::size_t aruid_index = 0; aruid_index < AruidIndexMax; aruid_index++) { const auto* applet_data = applet_resource->GetAruidDataByIndex(aruid_index); From cfffaf6d41c9c79aa9fe07acfb065f770d38baf7 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sun, 18 Jan 2026 16:45:05 +0000 Subject: [PATCH 44/78] fix eboot --- CMakeModules/OpenOrbis.cmake | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CMakeModules/OpenOrbis.cmake b/CMakeModules/OpenOrbis.cmake index 593c951e30..f5701ecc62 100644 --- a/CMakeModules/OpenOrbis.cmake +++ b/CMakeModules/OpenOrbis.cmake @@ -1,6 +1,19 @@ # SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later +function(create_ps4_eboot project target content_id) + set(sce_sys_dir sce_sys) + set(sce_sys_param ${sce_sys_dir}/param.sfo) + add_custom_command( + OUTPUT "${target}.pkg" + COMMAND ${CMAKE_SYSROOT}/bin/create-fself -in=bin/${target} -out=${target}.oelf --eboot eboot.bin + VERBATIM + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + DEPENDS ${project} + ) + add_custom_target(${project}_pkg ALL DEPENDS "${target}.pkg") +endfunction() + function(create_ps4_pkg project target content_id) set(sce_sys_dir sce_sys) set(sce_sys_param ${sce_sys_dir}/param.sfo) From 86a99ace4ce6600d5f059b2ce60ea7725c23ddac Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 20 Jan 2026 00:17:46 +0000 Subject: [PATCH 45/78] bs fix --- src/hid_core/resource_manager.cpp | 3 +++ src/hid_core/resources/debug_pad/debug_pad.cpp | 3 +++ src/hid_core/resources/digitizer/digitizer.cpp | 3 +++ src/hid_core/resources/keyboard/keyboard.cpp | 3 +++ src/hid_core/resources/mouse/debug_mouse.cpp | 3 +++ src/hid_core/resources/mouse/mouse.cpp | 3 +++ src/hid_core/resources/six_axis/console_six_axis.cpp | 3 +++ src/hid_core/resources/six_axis/six_axis.cpp | 3 +++ src/hid_core/resources/system_buttons/capture_button.cpp | 3 +++ src/hid_core/resources/system_buttons/home_button.cpp | 3 +++ src/hid_core/resources/system_buttons/sleep_button.cpp | 3 +++ 11 files changed, 33 insertions(+) diff --git a/src/hid_core/resource_manager.cpp b/src/hid_core/resource_manager.cpp index 2e1e9e3dfc..4fa1e9a6ae 100644 --- a/src/hid_core/resource_manager.cpp +++ b/src/hid_core/resource_manager.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/hid_core/resources/debug_pad/debug_pad.cpp b/src/hid_core/resources/debug_pad/debug_pad.cpp index 99c35d7687..89e5ce86e6 100644 --- a/src/hid_core/resources/debug_pad/debug_pad.cpp +++ b/src/hid_core/resources/debug_pad/debug_pad.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/hid_core/resources/digitizer/digitizer.cpp b/src/hid_core/resources/digitizer/digitizer.cpp index 7bb5a43376..4df72fd6d0 100644 --- a/src/hid_core/resources/digitizer/digitizer.cpp +++ b/src/hid_core/resources/digitizer/digitizer.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/hid_core/resources/keyboard/keyboard.cpp b/src/hid_core/resources/keyboard/keyboard.cpp index 96b6ad067f..d82062b3c6 100644 --- a/src/hid_core/resources/keyboard/keyboard.cpp +++ b/src/hid_core/resources/keyboard/keyboard.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/hid_core/resources/mouse/debug_mouse.cpp b/src/hid_core/resources/mouse/debug_mouse.cpp index 313e8ef415..28657ee2e4 100644 --- a/src/hid_core/resources/mouse/debug_mouse.cpp +++ b/src/hid_core/resources/mouse/debug_mouse.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/hid_core/resources/mouse/mouse.cpp b/src/hid_core/resources/mouse/mouse.cpp index 4531d8a6cd..05eff94093 100644 --- a/src/hid_core/resources/mouse/mouse.cpp +++ b/src/hid_core/resources/mouse/mouse.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/hid_core/resources/six_axis/console_six_axis.cpp b/src/hid_core/resources/six_axis/console_six_axis.cpp index 85c45a2d6d..f68f639bf4 100644 --- a/src/hid_core/resources/six_axis/console_six_axis.cpp +++ b/src/hid_core/resources/six_axis/console_six_axis.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/hid_core/resources/six_axis/six_axis.cpp b/src/hid_core/resources/six_axis/six_axis.cpp index 2624deaf6f..9eb06be856 100644 --- a/src/hid_core/resources/six_axis/six_axis.cpp +++ b/src/hid_core/resources/six_axis/six_axis.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/hid_core/resources/system_buttons/capture_button.cpp b/src/hid_core/resources/system_buttons/capture_button.cpp index 411f4808a0..d8afa70a58 100644 --- a/src/hid_core/resources/system_buttons/capture_button.cpp +++ b/src/hid_core/resources/system_buttons/capture_button.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/hid_core/resources/system_buttons/home_button.cpp b/src/hid_core/resources/system_buttons/home_button.cpp index cacfb221e2..084cc6ccec 100644 --- a/src/hid_core/resources/system_buttons/home_button.cpp +++ b/src/hid_core/resources/system_buttons/home_button.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/hid_core/resources/system_buttons/sleep_button.cpp b/src/hid_core/resources/system_buttons/sleep_button.cpp index 6649594ef0..5c5cc05ed5 100644 --- a/src/hid_core/resources/system_buttons/sleep_button.cpp +++ b/src/hid_core/resources/system_buttons/sleep_button.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later From 610003387cd794a1cb1fc3b1e1e16cebfb855217 Mon Sep 17 00:00:00 2001 From: lizzie Date: Thu, 22 Jan 2026 19:13:56 +0000 Subject: [PATCH 46/78] restore stupid lock, make ps4sup library --- CMakeModules/OpenOrbis.cmake | 6 ++--- externals/CMakeLists.txt | 3 +++ {src/yuzu_cmd => externals/ps4sup}/emutls.c | 0 externals/ps4sup/stub.cpp | 18 +++++++++++++ src/core/perf_stats.h | 3 +++ src/dynarmic/tests/CMakeLists.txt | 6 +++++ src/hid_core/resource_manager.cpp | 26 +++++++++---------- .../resources/abstracted_pad/abstract_pad.cpp | 2 +- .../resources/debug_pad/debug_pad.cpp | 2 +- .../resources/digitizer/digitizer.cpp | 2 +- src/hid_core/resources/keyboard/keyboard.cpp | 2 +- src/hid_core/resources/mouse/debug_mouse.cpp | 2 +- src/hid_core/resources/mouse/mouse.cpp | 2 +- src/hid_core/resources/npad/npad.cpp | 10 +++---- .../resources/six_axis/console_six_axis.cpp | 2 +- src/hid_core/resources/six_axis/six_axis.cpp | 2 +- .../system_buttons/capture_button.cpp | 2 +- .../resources/system_buttons/home_button.cpp | 2 +- .../resources/system_buttons/sleep_button.cpp | 2 +- .../touch_screen/touch_screen_resource.cpp | 14 +++++----- src/yuzu_cmd/CMakeLists.txt | 6 ++--- 21 files changed, 71 insertions(+), 43 deletions(-) rename {src/yuzu_cmd => externals/ps4sup}/emutls.c (100%) create mode 100644 externals/ps4sup/stub.cpp diff --git a/CMakeModules/OpenOrbis.cmake b/CMakeModules/OpenOrbis.cmake index f5701ecc62..af2e862a7e 100644 --- a/CMakeModules/OpenOrbis.cmake +++ b/CMakeModules/OpenOrbis.cmake @@ -6,7 +6,7 @@ function(create_ps4_eboot project target content_id) set(sce_sys_param ${sce_sys_dir}/param.sfo) add_custom_command( OUTPUT "${target}.pkg" - COMMAND ${CMAKE_SYSROOT}/bin/create-fself -in=bin/${target} -out=${target}.oelf --eboot eboot.bin + COMMAND ${CMAKE_SYSROOT}/bin/create-fself -in=bin/${target} -out=${target}.oelf --eboot ${target}_eboot.bin VERBATIM WORKING_DIRECTORY ${CMAKE_BINARY_DIR} DEPENDS ${project} @@ -19,7 +19,7 @@ function(create_ps4_pkg project target content_id) set(sce_sys_param ${sce_sys_dir}/param.sfo) add_custom_command( OUTPUT "${target}.pkg" - COMMAND ${CMAKE_SYSROOT}/bin/create-fself -in=bin/${target} -out=${target}.oelf --eboot eboot.bin + COMMAND ${CMAKE_SYSROOT}/bin/create-fself -in=bin/${target} -out=${target}.oelf --eboot ${target}_eboot.bin COMMAND mkdir -p ${sce_sys_dir} COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_new ${sce_sys_param} COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} APP_TYPE --type Integer --maxsize 4 --value 1 @@ -32,7 +32,7 @@ function(create_ps4_pkg project target content_id) COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} TITLE --type Utf8 --maxsize 128 --value ${target} COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} TITLE_ID --type Utf8 --maxsize 12 --value BREW00090 COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core sfo_setentry ${sce_sys_param} VERSION --type Utf8 --maxsize 8 --value 1.03 - COMMAND ${CMAKE_SYSROOT}/bin/create-gp4 -out ${target}.gp4 --content-id=${content_id} --files "eboot.bin ${sce_sys_param} sce_module/libc.prx sce_module/libSceFios2.prx" + COMMAND ${CMAKE_SYSROOT}/bin/create-gp4 -out ${target}.gp4 --content-id=${content_id} --files "${target}_eboot.bin ${sce_sys_param} sce_module/libc.prx sce_module/libSceFios2.prx" COMMAND ${CMAKE_SYSROOT}/bin/PkgTool.Core pkg_build ${target}.gp4 . VERBATIM WORKING_DIRECTORY ${CMAKE_BINARY_DIR} diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index 5ca90b2b23..428fc6f9f1 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -265,6 +265,9 @@ target_include_directories(tz PUBLIC ./tz) add_library(bc_decoder bc_decoder/bc_decoder.cpp) target_include_directories(bc_decoder PUBLIC ./bc_decoder) +add_library(ps4sup ps4sup/emutls.c ps4sup/stub.cpp) +target_include_directories(ps4sup PUBLIC ./ps4sup) + if (NOT TARGET RenderDoc::API) add_library(renderdoc INTERFACE) target_include_directories(renderdoc SYSTEM INTERFACE ./renderdoc) diff --git a/src/yuzu_cmd/emutls.c b/externals/ps4sup/emutls.c similarity index 100% rename from src/yuzu_cmd/emutls.c rename to externals/ps4sup/emutls.c diff --git a/externals/ps4sup/stub.cpp b/externals/ps4sup/stub.cpp new file mode 100644 index 0000000000..f422477f20 --- /dev/null +++ b/externals/ps4sup/stub.cpp @@ -0,0 +1,18 @@ +#include + +#define STUB_WEAK(name) \ + extern "C" void name() { \ + printf("called " #name); \ + asm volatile("ud2"); \ + } + +extern "C" void __cxa_thread_atexit_impl() {} + +STUB_WEAK(__assert) +STUB_WEAK(ZSTD_trace_compress_begin) +STUB_WEAK(ZSTD_trace_compress_end) +STUB_WEAK(ZSTD_trace_decompress_begin) +STUB_WEAK(ZSTD_trace_decompress_end) +FILE* __stderrp = stdout; + +#undef STUB_WEAK diff --git a/src/core/perf_stats.h b/src/core/perf_stats.h index 92910a959f..6fbf05671a 100644 --- a/src/core/perf_stats.h +++ b/src/core/perf_stats.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2017 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/dynarmic/tests/CMakeLists.txt b/src/dynarmic/tests/CMakeLists.txt index 395181efe3..a31d88dfd0 100644 --- a/src/dynarmic/tests/CMakeLists.txt +++ b/src/dynarmic/tests/CMakeLists.txt @@ -134,3 +134,9 @@ target_compile_options(dynarmic_tests PRIVATE ${DYNARMIC_CXX_FLAGS}) target_compile_definitions(dynarmic_tests PRIVATE FMT_USE_USER_DEFINED_LITERALS=1) add_test(NAME dynarmic_tests COMMAND dynarmic_tests --durations yes) + +if (PLATFORM_PS4) + target_link_libraries(dynarmic_tests PRIVATE SceVideoOut SceAudioOut ScePad SceSystemService) + target_link_libraries(dynarmic_tests PRIVATE ps4sup) + create_ps4_eboot(dynarmic_tests dynarmic_tests IV0000-BREW00090_00-DYNARMICTS000000) +endif() diff --git a/src/hid_core/resource_manager.cpp b/src/hid_core/resource_manager.cpp index 4fa1e9a6ae..cecadd84ed 100644 --- a/src/hid_core/resource_manager.cpp +++ b/src/hid_core/resource_manager.cpp @@ -204,7 +204,7 @@ Result ResourceManager::CreateAppletResource(u64 aruid) { } Result ResourceManager::CreateAppletResourceImpl(u64 aruid) { - //std::scoped_lock lock{shared_mutex}; + std::scoped_lock lock{shared_mutex}; return applet_resource->CreateAppletResource(aruid); } @@ -294,17 +294,17 @@ void ResourceManager::InitializeAHidSampler() { } Result ResourceManager::RegisterCoreAppletResource() { - //std::scoped_lock lock{shared_mutex}; + std::scoped_lock lock{shared_mutex}; return applet_resource->RegisterCoreAppletResource(); } Result ResourceManager::UnregisterCoreAppletResource() { - //std::scoped_lock lock{shared_mutex}; + std::scoped_lock lock{shared_mutex}; return applet_resource->UnregisterCoreAppletResource(); } Result ResourceManager::RegisterAppletResourceUserId(u64 aruid, bool bool_value) { - //std::scoped_lock lock{shared_mutex}; + std::scoped_lock lock{shared_mutex}; auto result = applet_resource->RegisterAppletResourceUserId(aruid, bool_value); if (result.IsSuccess()) { result = npad->RegisterAppletResourceUserId(aruid); @@ -313,40 +313,40 @@ Result ResourceManager::RegisterAppletResourceUserId(u64 aruid, bool bool_value) } void ResourceManager::UnregisterAppletResourceUserId(u64 aruid) { - //std::scoped_lock lock{shared_mutex}; + std::scoped_lock lock{shared_mutex}; applet_resource->UnregisterAppletResourceUserId(aruid); npad->UnregisterAppletResourceUserId(aruid); // palma->UnregisterAppletResourceUserId(aruid); } Result ResourceManager::GetSharedMemoryHandle(Kernel::KSharedMemory** out_handle, u64 aruid) { - //std::scoped_lock lock{shared_mutex}; + std::scoped_lock lock{shared_mutex}; return applet_resource->GetSharedMemoryHandle(out_handle, aruid); } void ResourceManager::FreeAppletResourceId(u64 aruid) { - //std::scoped_lock lock{shared_mutex}; + std::scoped_lock lock{shared_mutex}; applet_resource->FreeAppletResourceId(aruid); npad->FreeAppletResourceId(aruid); } void ResourceManager::EnableInput(u64 aruid, bool is_enabled) { - //std::scoped_lock lock{shared_mutex}; + std::scoped_lock lock{shared_mutex}; applet_resource->EnableInput(aruid, is_enabled); } void ResourceManager::EnableSixAxisSensor(u64 aruid, bool is_enabled) { - //std::scoped_lock lock{shared_mutex}; + std::scoped_lock lock{shared_mutex}; applet_resource->EnableSixAxisSensor(aruid, is_enabled); } void ResourceManager::EnablePadInput(u64 aruid, bool is_enabled) { - //std::scoped_lock lock{shared_mutex}; + std::scoped_lock lock{shared_mutex}; applet_resource->EnablePadInput(aruid, is_enabled); } void ResourceManager::EnableTouchScreen(u64 aruid, bool is_enabled) { - //std::scoped_lock lock{shared_mutex}; + std::scoped_lock lock{shared_mutex}; applet_resource->EnableTouchScreen(aruid, is_enabled); } @@ -371,7 +371,7 @@ NpadGcVibrationDevice* ResourceManager::GetGcVibrationDevice( } Result ResourceManager::SetAruidValidForVibration(u64 aruid, bool is_enabled) { - //std::scoped_lock lock{shared_mutex}; + std::scoped_lock lock{shared_mutex}; const bool has_changed = applet_resource->SetAruidValidForVibration(aruid, is_enabled); if (has_changed) { @@ -394,7 +394,7 @@ void ResourceManager::SetForceHandheldStyleVibration(bool is_forced) { } Result ResourceManager::IsVibrationAruidActive(u64 aruid, bool& is_active) const { - //std::scoped_lock lock{shared_mutex}; + std::scoped_lock lock{shared_mutex}; is_active = applet_resource->IsVibrationAruidActive(aruid); return ResultSuccess; } diff --git a/src/hid_core/resources/abstracted_pad/abstract_pad.cpp b/src/hid_core/resources/abstracted_pad/abstract_pad.cpp index 8ba67f131e..d7cf2bba9b 100644 --- a/src/hid_core/resources/abstracted_pad/abstract_pad.cpp +++ b/src/hid_core/resources/abstracted_pad/abstract_pad.cpp @@ -273,7 +273,7 @@ void AbstractPad::Update() { interface_type = properties_handler.GetInterfaceType(); - //std::scoped_lock lock{*applet_resource_holder->shared_mutex}; + std::scoped_lock lock{*applet_resource_holder->shared_mutex}; properties_handler.UpdateAllDeviceProperties(); battery_handler.UpdateCoreBatteryState(); button_handler.UpdateCoreBatteryState(); diff --git a/src/hid_core/resources/debug_pad/debug_pad.cpp b/src/hid_core/resources/debug_pad/debug_pad.cpp index 89e5ce86e6..831bbfdd22 100644 --- a/src/hid_core/resources/debug_pad/debug_pad.cpp +++ b/src/hid_core/resources/debug_pad/debug_pad.cpp @@ -26,7 +26,7 @@ void DebugPad::OnInit() {} void DebugPad::OnRelease() {} void DebugPad::OnUpdate(const Core::Timing::CoreTiming& core_timing) { - //std::scoped_lock shared_lock{*shared_mutex}; + std::scoped_lock shared_lock{*shared_mutex}; const u64 aruid = applet_resource->GetActiveAruid(); auto* data = applet_resource->GetAruidData(aruid); diff --git a/src/hid_core/resources/digitizer/digitizer.cpp b/src/hid_core/resources/digitizer/digitizer.cpp index 4df72fd6d0..87ba872dd7 100644 --- a/src/hid_core/resources/digitizer/digitizer.cpp +++ b/src/hid_core/resources/digitizer/digitizer.cpp @@ -20,7 +20,7 @@ void Digitizer::OnInit() {} void Digitizer::OnRelease() {} void Digitizer::OnUpdate(const Core::Timing::CoreTiming& core_timing) { - //std::scoped_lock shared_lock{*shared_mutex}; + std::scoped_lock shared_lock{*shared_mutex}; const u64 aruid = applet_resource->GetActiveAruid(); auto* data = applet_resource->GetAruidData(aruid); diff --git a/src/hid_core/resources/keyboard/keyboard.cpp b/src/hid_core/resources/keyboard/keyboard.cpp index d82062b3c6..5627d4b4aa 100644 --- a/src/hid_core/resources/keyboard/keyboard.cpp +++ b/src/hid_core/resources/keyboard/keyboard.cpp @@ -25,7 +25,7 @@ void Keyboard::OnInit() {} void Keyboard::OnRelease() {} void Keyboard::OnUpdate(const Core::Timing::CoreTiming& core_timing) { - //std::scoped_lock shared_lock{*shared_mutex}; + std::scoped_lock shared_lock{*shared_mutex}; const u64 aruid = applet_resource->GetActiveAruid(); auto* data = applet_resource->GetAruidData(aruid); diff --git a/src/hid_core/resources/mouse/debug_mouse.cpp b/src/hid_core/resources/mouse/debug_mouse.cpp index 28657ee2e4..eede909eea 100644 --- a/src/hid_core/resources/mouse/debug_mouse.cpp +++ b/src/hid_core/resources/mouse/debug_mouse.cpp @@ -24,7 +24,7 @@ void DebugMouse::OnInit() {} void DebugMouse::OnRelease() {} void DebugMouse::OnUpdate(const Core::Timing::CoreTiming& core_timing) { - //std::scoped_lock shared_lock{*shared_mutex}; + std::scoped_lock shared_lock{*shared_mutex}; const u64 aruid = applet_resource->GetActiveAruid(); auto* data = applet_resource->GetAruidData(aruid); diff --git a/src/hid_core/resources/mouse/mouse.cpp b/src/hid_core/resources/mouse/mouse.cpp index 05eff94093..8b9c6a7523 100644 --- a/src/hid_core/resources/mouse/mouse.cpp +++ b/src/hid_core/resources/mouse/mouse.cpp @@ -24,7 +24,7 @@ void Mouse::OnInit() {} void Mouse::OnRelease() {} void Mouse::OnUpdate(const Core::Timing::CoreTiming& core_timing) { - //std::scoped_lock shared_lock{*shared_mutex}; + std::scoped_lock shared_lock{*shared_mutex}; const u64 aruid = applet_resource->GetActiveAruid(); auto* data = applet_resource->GetAruidData(aruid); diff --git a/src/hid_core/resources/npad/npad.cpp b/src/hid_core/resources/npad/npad.cpp index 24e9b33b30..b4df235d7c 100644 --- a/src/hid_core/resources/npad/npad.cpp +++ b/src/hid_core/resources/npad/npad.cpp @@ -74,7 +74,7 @@ Result NPad::Activate() { Result NPad::Activate(u64 aruid) { std::scoped_lock lock{mutex}; - //std::scoped_lock shared_lock{*applet_resource_holder.shared_mutex}; + std::scoped_lock shared_lock{*applet_resource_holder.shared_mutex}; auto* data = applet_resource_holder.applet_resource->GetAruidData(aruid); const auto aruid_index = applet_resource_holder.applet_resource->GetIndexFromAruid(aruid); @@ -393,7 +393,7 @@ void NPad::WriteEmptyEntry(NpadInternalState* npad) { } void NPad::RequestPadStateUpdate(u64 aruid, Core::HID::NpadIdType npad_id) { - //std::scoped_lock lock{*applet_resource_holder.shared_mutex}; + std::scoped_lock lock{*applet_resource_holder.shared_mutex}; auto& controller = GetControllerFromNpadIdType(aruid, npad_id); const auto controller_type = controller.device->GetNpadStyleIndex(); @@ -466,7 +466,7 @@ void NPad::OnUpdate(const Core::Timing::CoreTiming& core_timing) { return; } - //std::scoped_lock lock{*applet_resource_holder.shared_mutex}; + std::scoped_lock lock{*applet_resource_holder.shared_mutex}; for (std::size_t aruid_index = 0; aruid_index < AruidIndexMax; ++aruid_index) { const auto* data = applet_resource_holder.applet_resource->GetAruidDataByIndex(aruid_index); @@ -1221,7 +1221,7 @@ Result NPad::SetNpadSystemExtStateEnabled(u64 aruid, bool is_enabled) { const auto result = npad_resource.SetNpadSystemExtStateEnabled(aruid, is_enabled); if (result.IsSuccess()) { - //std::scoped_lock shared_lock{*applet_resource_holder.shared_mutex}; + std::scoped_lock shared_lock{*applet_resource_holder.shared_mutex}; // TODO: abstracted_pad->EnableAppletToGetInput(aruid); } @@ -1339,7 +1339,7 @@ void NPad::UpdateHandheldAbstractState() { void NPad::EnableAppletToGetInput(u64 aruid) { std::scoped_lock lock{mutex}; - //std::scoped_lock shared_lock{*applet_resource_holder.shared_mutex}; + std::scoped_lock shared_lock{*applet_resource_holder.shared_mutex}; for (auto& abstract_pad : abstracted_pads) { abstract_pad.EnableAppletToGetInput(aruid); } diff --git a/src/hid_core/resources/six_axis/console_six_axis.cpp b/src/hid_core/resources/six_axis/console_six_axis.cpp index f68f639bf4..62d3b4ddc2 100644 --- a/src/hid_core/resources/six_axis/console_six_axis.cpp +++ b/src/hid_core/resources/six_axis/console_six_axis.cpp @@ -23,7 +23,7 @@ void ConsoleSixAxis::OnInit() {} void ConsoleSixAxis::OnRelease() {} void ConsoleSixAxis::OnUpdate(const Core::Timing::CoreTiming& core_timing) { - //std::scoped_lock shared_lock{*shared_mutex}; + std::scoped_lock shared_lock{*shared_mutex}; const u64 aruid = applet_resource->GetActiveAruid(); auto* data = applet_resource->GetAruidData(aruid); diff --git a/src/hid_core/resources/six_axis/six_axis.cpp b/src/hid_core/resources/six_axis/six_axis.cpp index 9eb06be856..f2aadd9ed1 100644 --- a/src/hid_core/resources/six_axis/six_axis.cpp +++ b/src/hid_core/resources/six_axis/six_axis.cpp @@ -30,7 +30,7 @@ void SixAxis::OnInit() {} void SixAxis::OnRelease() {} void SixAxis::OnUpdate(const Core::Timing::CoreTiming& core_timing) { - //std::scoped_lock shared_lock{*shared_mutex}; + std::scoped_lock shared_lock{*shared_mutex}; for (std::size_t aruid_index = 0; aruid_index < AruidIndexMax; ++aruid_index) { const auto* data = applet_resource->GetAruidDataByIndex(aruid_index); diff --git a/src/hid_core/resources/system_buttons/capture_button.cpp b/src/hid_core/resources/system_buttons/capture_button.cpp index d8afa70a58..79d75f423a 100644 --- a/src/hid_core/resources/system_buttons/capture_button.cpp +++ b/src/hid_core/resources/system_buttons/capture_button.cpp @@ -22,7 +22,7 @@ void CaptureButton::OnInit() {} void CaptureButton::OnRelease() {} void CaptureButton::OnUpdate(const Core::Timing::CoreTiming& core_timing) { - //std::scoped_lock shared_lock{*shared_mutex}; + std::scoped_lock shared_lock{*shared_mutex}; const u64 aruid = applet_resource->GetActiveAruid(); auto* data = applet_resource->GetAruidData(aruid); diff --git a/src/hid_core/resources/system_buttons/home_button.cpp b/src/hid_core/resources/system_buttons/home_button.cpp index 084cc6ccec..2edb4557c1 100644 --- a/src/hid_core/resources/system_buttons/home_button.cpp +++ b/src/hid_core/resources/system_buttons/home_button.cpp @@ -22,7 +22,7 @@ void HomeButton::OnInit() {} void HomeButton::OnRelease() {} void HomeButton::OnUpdate(const Core::Timing::CoreTiming& core_timing) { - //std::scoped_lock shared_lock{*shared_mutex}; + std::scoped_lock shared_lock{*shared_mutex}; const u64 aruid = applet_resource->GetActiveAruid(); auto* data = applet_resource->GetAruidData(aruid); diff --git a/src/hid_core/resources/system_buttons/sleep_button.cpp b/src/hid_core/resources/system_buttons/sleep_button.cpp index 5c5cc05ed5..3ae5883bfa 100644 --- a/src/hid_core/resources/system_buttons/sleep_button.cpp +++ b/src/hid_core/resources/system_buttons/sleep_button.cpp @@ -20,7 +20,7 @@ void SleepButton::OnInit() {} void SleepButton::OnRelease() {} void SleepButton::OnUpdate(const Core::Timing::CoreTiming& core_timing) { - //std::scoped_lock shared_lock{*shared_mutex}; + std::scoped_lock shared_lock{*shared_mutex}; const u64 aruid = applet_resource->GetActiveAruid(); auto* data = applet_resource->GetAruidData(aruid); diff --git a/src/hid_core/resources/touch_screen/touch_screen_resource.cpp b/src/hid_core/resources/touch_screen/touch_screen_resource.cpp index dd0b71f448..5d45f861c6 100644 --- a/src/hid_core/resources/touch_screen/touch_screen_resource.cpp +++ b/src/hid_core/resources/touch_screen/touch_screen_resource.cpp @@ -34,7 +34,7 @@ Result TouchResource::ActivateTouch() { } if (global_ref_counter == 0) { - //std::scoped_lock lock{*shared_mutex}; + std::scoped_lock lock{*shared_mutex}; const auto result = touch_driver->StartTouchSensor(); if (result.IsError()) { @@ -60,7 +60,7 @@ Result TouchResource::ActivateTouch() { } Result TouchResource::ActivateTouch(u64 aruid) { - //std::scoped_lock lock{*shared_mutex}; + std::scoped_lock lock{*shared_mutex}; for (std::size_t aruid_index = 0; aruid_index < AruidIndexMax; aruid_index++) { auto* applet_data = applet_resource->GetAruidDataByIndex(aruid_index); @@ -121,7 +121,7 @@ Result TouchResource::ActivateGesture() { } Result TouchResource::ActivateGesture(u64 aruid, u32 basic_gesture_id) { - //std::scoped_lock lock{*shared_mutex}; + std::scoped_lock lock{*shared_mutex}; for (std::size_t aruid_index = 0; aruid_index < AruidIndexMax; aruid_index++) { auto* applet_data = applet_resource->GetAruidDataByIndex(aruid_index); @@ -300,7 +300,7 @@ void TouchResource::SetTouchScreenMagnification(f32 point1_x, f32 point1_y, f32 } Result TouchResource::SetTouchScreenResolution(u32 width, u32 height, u64 aruid) { - //std::scoped_lock lock{*shared_mutex}; + std::scoped_lock lock{*shared_mutex}; for (std::size_t aruid_index = 0; aruid_index < AruidIndexMax; aruid_index++) { const auto* applet_data = applet_resource->GetAruidDataByIndex(aruid_index); @@ -321,7 +321,7 @@ Result TouchResource::SetTouchScreenResolution(u32 width, u32 height, u64 aruid) Result TouchResource::SetTouchScreenConfiguration( const Core::HID::TouchScreenConfigurationForNx& touch_configuration, u64 aruid) { - //std::scoped_lock lock{*shared_mutex}; + std::scoped_lock lock{*shared_mutex}; for (std::size_t aruid_index = 0; aruid_index < AruidIndexMax; aruid_index++) { const auto* applet_data = applet_resource->GetAruidDataByIndex(aruid_index); @@ -341,7 +341,7 @@ Result TouchResource::SetTouchScreenConfiguration( Result TouchResource::GetTouchScreenConfiguration( Core::HID::TouchScreenConfigurationForNx& out_touch_configuration, u64 aruid) const { - //std::scoped_lock lock{*shared_mutex}; + std::scoped_lock lock{*shared_mutex}; for (std::size_t aruid_index = 0; aruid_index < AruidIndexMax; aruid_index++) { const auto* applet_data = applet_resource->GetAruidDataByIndex(aruid_index); @@ -518,7 +518,7 @@ void TouchResource::OnTouchUpdate(s64 timestamp) { gesture_handler.SetTouchState(current_touch_state.states, current_touch_state.entry_count, timestamp); - //std::scoped_lock lock{*shared_mutex}; + std::scoped_lock lock{*shared_mutex}; for (std::size_t aruid_index = 0; aruid_index < AruidIndexMax; aruid_index++) { const auto* applet_data = applet_resource->GetAruidDataByIndex(aruid_index); diff --git a/src/yuzu_cmd/CMakeLists.txt b/src/yuzu_cmd/CMakeLists.txt index 720b7449c7..bc1a94082b 100644 --- a/src/yuzu_cmd/CMakeLists.txt +++ b/src/yuzu_cmd/CMakeLists.txt @@ -27,7 +27,6 @@ add_executable(yuzu-cmd sdl_config.cpp sdl_config.h yuzu.cpp - emutls.c yuzu.rc ) @@ -35,8 +34,6 @@ target_link_libraries(yuzu-cmd PRIVATE common core input_common frontend_common target_link_libraries(yuzu-cmd PRIVATE glad) if (MSVC) target_link_libraries(yuzu-cmd PRIVATE getopt) -elseif(PLATFORM_PS4) - target_link_libraries(yuzu-cmd PRIVATE SceVideoOut SceAudioOut ScePad SceSystemService) endif() target_link_libraries(yuzu-cmd PRIVATE ${PLATFORM_LIBRARIES} Threads::Threads) @@ -71,6 +68,7 @@ if (NOT MSVC) endif() if (PLATFORM_PS4) + target_link_libraries(yuzu-cmd PRIVATE SceVideoOut SceAudioOut ScePad SceSystemService) + target_link_libraries(yuzu-cmd PRIVATE ps4sup) create_ps4_eboot(yuzu-cmd eden-cli IV0000-BREW00090_00-EDENEMULAT000000) - #create_ps4_pkg(yuzu-cmd eden-cli IV0000-BREW00090_00-EDENEMULAT000000) endif() From 691e3786d6af62d83ef7027690b9588ee3012cd8 Mon Sep 17 00:00:00 2001 From: lizzie Date: Thu, 22 Jan 2026 19:16:13 +0000 Subject: [PATCH 47/78] update loicense --- .ci/ps4/build.sh | 1 + .ci/ps4/make-toolchain.sh | 2 +- CMakeModules/FindSDL2.cmake | 2 +- CMakeModules/OpenOrbis.cmake | 2 +- externals/ffmpeg/CMakeLists.txt | 2 +- externals/ps4sup/stub.cpp | 3 +++ src/common/fs/fs.cpp | 2 +- src/common/host_memory.h | 2 +- src/common/memory_detect.cpp | 2 +- src/common/virtual_buffer.cpp | 2 +- src/common/virtual_buffer.h | 2 +- src/core/device_memory.h | 2 +- src/core/hle/service/services.cpp | 2 +- src/dynarmic/src/dynarmic/backend/exception_handler_posix.cpp | 2 +- src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.h | 2 +- src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.h | 2 +- src/dynarmic/src/dynarmic/common/context.h | 2 +- src/hid_core/resource_manager.cpp | 2 +- src/hid_core/resources/debug_pad/debug_pad.cpp | 2 +- src/hid_core/resources/digitizer/digitizer.cpp | 2 +- src/hid_core/resources/keyboard/keyboard.cpp | 2 +- src/hid_core/resources/mouse/debug_mouse.cpp | 2 +- src/hid_core/resources/mouse/mouse.cpp | 2 +- src/hid_core/resources/npad/npad.cpp | 2 +- src/hid_core/resources/six_axis/console_six_axis.cpp | 2 +- src/hid_core/resources/six_axis/six_axis.cpp | 2 +- src/hid_core/resources/system_buttons/capture_button.cpp | 2 +- src/hid_core/resources/system_buttons/home_button.cpp | 2 +- src/hid_core/resources/system_buttons/sleep_button.cpp | 2 +- src/input_common/drivers/joycon.cpp | 2 +- src/input_common/drivers/joycon.h | 2 +- src/input_common/helpers/joycon_driver.cpp | 2 +- src/input_common/helpers/joycon_protocol/common_protocol.cpp | 2 +- src/input_common/helpers/joycon_protocol/joycon_types.h | 2 +- src/input_common/main.cpp | 2 +- src/yuzu_cmd/CMakeLists.txt | 2 +- src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp | 2 +- src/yuzu_cmd/yuzu.cpp | 2 +- 38 files changed, 40 insertions(+), 36 deletions(-) diff --git a/.ci/ps4/build.sh b/.ci/ps4/build.sh index a4bfc97540..2bba7e185d 100755 --- a/.ci/ps4/build.sh +++ b/.ci/ps4/build.sh @@ -52,5 +52,6 @@ cmake -S . -B build -G "Unix Makefiles" \ -DCPMUTIL_FORCE_BUNDLED=ON \ -DYUZU_USE_EXTERNAL_FFMPEG=ON \ -DYUZU_USE_CPM=ON \ + -DDYNARMIC_TESTS=ON \ "${EXTRA_CMAKE_FLAGS[@]}" || exit cmake --build build -t yuzu-cmd_pkg -- -j$NPROC diff --git a/.ci/ps4/make-toolchain.sh b/.ci/ps4/make-toolchain.sh index 7903a79169..2b4f994b79 100755 --- a/.ci/ps4/make-toolchain.sh +++ b/.ci/ps4/make-toolchain.sh @@ -1,6 +1,6 @@ #!/usr/local/bin/bash -ex -# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later # Define global vars diff --git a/CMakeModules/FindSDL2.cmake b/CMakeModules/FindSDL2.cmake index a7e7225dbb..b039031b4a 100644 --- a/CMakeModules/FindSDL2.cmake +++ b/CMakeModules/FindSDL2.cmake @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later # Distributed under the OSI-approved BSD 3-Clause License. See accompanying diff --git a/CMakeModules/OpenOrbis.cmake b/CMakeModules/OpenOrbis.cmake index af2e862a7e..6babccdd6d 100644 --- a/CMakeModules/OpenOrbis.cmake +++ b/CMakeModules/OpenOrbis.cmake @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later function(create_ps4_eboot project target content_id) diff --git a/externals/ffmpeg/CMakeLists.txt b/externals/ffmpeg/CMakeLists.txt index ab9d2d04cf..45697d23f4 100644 --- a/externals/ffmpeg/CMakeLists.txt +++ b/externals/ffmpeg/CMakeLists.txt @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later # SPDX-FileCopyrightText: 2021 yuzu Emulator Project diff --git a/externals/ps4sup/stub.cpp b/externals/ps4sup/stub.cpp index f422477f20..89dc983599 100644 --- a/externals/ps4sup/stub.cpp +++ b/externals/ps4sup/stub.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + #include #define STUB_WEAK(name) \ diff --git a/src/common/fs/fs.cpp b/src/common/fs/fs.cpp index 1c9c3b697a..bdeeae911d 100644 --- a/src/common/fs/fs.cpp +++ b/src/common/fs/fs.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project diff --git a/src/common/host_memory.h b/src/common/host_memory.h index f26804b55b..6095230154 100644 --- a/src/common/host_memory.h +++ b/src/common/host_memory.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project diff --git a/src/common/memory_detect.cpp b/src/common/memory_detect.cpp index b755c1a77e..5063b28b2d 100644 --- a/src/common/memory_detect.cpp +++ b/src/common/memory_detect.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project diff --git a/src/common/virtual_buffer.cpp b/src/common/virtual_buffer.cpp index f3a3a695e0..48f26ec298 100644 --- a/src/common/virtual_buffer.cpp +++ b/src/common/virtual_buffer.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project diff --git a/src/common/virtual_buffer.h b/src/common/virtual_buffer.h index c25b52a51a..8094df14c7 100644 --- a/src/common/virtual_buffer.h +++ b/src/common/virtual_buffer.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project diff --git a/src/core/device_memory.h b/src/core/device_memory.h index 17b585d67a..29d2ff7a2b 100644 --- a/src/core/device_memory.h +++ b/src/core/device_memory.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project diff --git a/src/core/hle/service/services.cpp b/src/core/hle/service/services.cpp index 7d9372e694..4d04b0fdf0 100644 --- a/src/core/hle/service/services.cpp +++ b/src/core/hle/service/services.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project diff --git a/src/dynarmic/src/dynarmic/backend/exception_handler_posix.cpp b/src/dynarmic/src/dynarmic/backend/exception_handler_posix.cpp index fc2d8d6284..cf56288a82 100644 --- a/src/dynarmic/src/dynarmic/backend/exception_handler_posix.cpp +++ b/src/dynarmic/src/dynarmic/backend/exception_handler_posix.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. diff --git a/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.h b/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.h index 7b794b9289..6f5a97a903 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.h +++ b/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. diff --git a/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.h b/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.h index b0c0db5f83..e8f46d0580 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.h +++ b/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. diff --git a/src/dynarmic/src/dynarmic/common/context.h b/src/dynarmic/src/dynarmic/common/context.h index 48c72cb5c9..cce77a6a97 100644 --- a/src/dynarmic/src/dynarmic/common/context.h +++ b/src/dynarmic/src/dynarmic/common/context.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #pragma once diff --git a/src/hid_core/resource_manager.cpp b/src/hid_core/resource_manager.cpp index cecadd84ed..d0cb098d85 100644 --- a/src/hid_core/resource_manager.cpp +++ b/src/hid_core/resource_manager.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project diff --git a/src/hid_core/resources/debug_pad/debug_pad.cpp b/src/hid_core/resources/debug_pad/debug_pad.cpp index 831bbfdd22..bab49b55f8 100644 --- a/src/hid_core/resources/debug_pad/debug_pad.cpp +++ b/src/hid_core/resources/debug_pad/debug_pad.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project diff --git a/src/hid_core/resources/digitizer/digitizer.cpp b/src/hid_core/resources/digitizer/digitizer.cpp index 87ba872dd7..e158e55e6c 100644 --- a/src/hid_core/resources/digitizer/digitizer.cpp +++ b/src/hid_core/resources/digitizer/digitizer.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project diff --git a/src/hid_core/resources/keyboard/keyboard.cpp b/src/hid_core/resources/keyboard/keyboard.cpp index 5627d4b4aa..4e929e1260 100644 --- a/src/hid_core/resources/keyboard/keyboard.cpp +++ b/src/hid_core/resources/keyboard/keyboard.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project diff --git a/src/hid_core/resources/mouse/debug_mouse.cpp b/src/hid_core/resources/mouse/debug_mouse.cpp index eede909eea..e56c1de656 100644 --- a/src/hid_core/resources/mouse/debug_mouse.cpp +++ b/src/hid_core/resources/mouse/debug_mouse.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project diff --git a/src/hid_core/resources/mouse/mouse.cpp b/src/hid_core/resources/mouse/mouse.cpp index 8b9c6a7523..80de81efe4 100644 --- a/src/hid_core/resources/mouse/mouse.cpp +++ b/src/hid_core/resources/mouse/mouse.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project diff --git a/src/hid_core/resources/npad/npad.cpp b/src/hid_core/resources/npad/npad.cpp index b4df235d7c..63ffd90d04 100644 --- a/src/hid_core/resources/npad/npad.cpp +++ b/src/hid_core/resources/npad/npad.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project diff --git a/src/hid_core/resources/six_axis/console_six_axis.cpp b/src/hid_core/resources/six_axis/console_six_axis.cpp index 62d3b4ddc2..c58c14e453 100644 --- a/src/hid_core/resources/six_axis/console_six_axis.cpp +++ b/src/hid_core/resources/six_axis/console_six_axis.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project diff --git a/src/hid_core/resources/six_axis/six_axis.cpp b/src/hid_core/resources/six_axis/six_axis.cpp index f2aadd9ed1..abda9e8e09 100644 --- a/src/hid_core/resources/six_axis/six_axis.cpp +++ b/src/hid_core/resources/six_axis/six_axis.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project diff --git a/src/hid_core/resources/system_buttons/capture_button.cpp b/src/hid_core/resources/system_buttons/capture_button.cpp index 79d75f423a..417d384e6b 100644 --- a/src/hid_core/resources/system_buttons/capture_button.cpp +++ b/src/hid_core/resources/system_buttons/capture_button.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project diff --git a/src/hid_core/resources/system_buttons/home_button.cpp b/src/hid_core/resources/system_buttons/home_button.cpp index 2edb4557c1..b0131767af 100644 --- a/src/hid_core/resources/system_buttons/home_button.cpp +++ b/src/hid_core/resources/system_buttons/home_button.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project diff --git a/src/hid_core/resources/system_buttons/sleep_button.cpp b/src/hid_core/resources/system_buttons/sleep_button.cpp index 3ae5883bfa..21e78e2d44 100644 --- a/src/hid_core/resources/system_buttons/sleep_button.cpp +++ b/src/hid_core/resources/system_buttons/sleep_button.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project diff --git a/src/input_common/drivers/joycon.cpp b/src/input_common/drivers/joycon.cpp index 83a57f96a7..ea95693a1c 100644 --- a/src/input_common/drivers/joycon.cpp +++ b/src/input_common/drivers/joycon.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project diff --git a/src/input_common/drivers/joycon.h b/src/input_common/drivers/joycon.h index fa8e32958d..189fe1b846 100644 --- a/src/input_common/drivers/joycon.h +++ b/src/input_common/drivers/joycon.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project diff --git a/src/input_common/helpers/joycon_driver.cpp b/src/input_common/helpers/joycon_driver.cpp index 2b70129bfc..867ecb7465 100644 --- a/src/input_common/helpers/joycon_driver.cpp +++ b/src/input_common/helpers/joycon_driver.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project diff --git a/src/input_common/helpers/joycon_protocol/common_protocol.cpp b/src/input_common/helpers/joycon_protocol/common_protocol.cpp index 1c9f1a690c..fc6281938a 100644 --- a/src/input_common/helpers/joycon_protocol/common_protocol.cpp +++ b/src/input_common/helpers/joycon_protocol/common_protocol.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project diff --git a/src/input_common/helpers/joycon_protocol/joycon_types.h b/src/input_common/helpers/joycon_protocol/joycon_types.h index e7c4867ff4..acac627097 100644 --- a/src/input_common/helpers/joycon_protocol/joycon_types.h +++ b/src/input_common/helpers/joycon_protocol/joycon_types.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project diff --git a/src/input_common/main.cpp b/src/input_common/main.cpp index 2fc8aa4e8a..3cbc6bbed5 100644 --- a/src/input_common/main.cpp +++ b/src/input_common/main.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2017 Citra Emulator Project diff --git a/src/yuzu_cmd/CMakeLists.txt b/src/yuzu_cmd/CMakeLists.txt index bc1a94082b..c153e9fb78 100644 --- a/src/yuzu_cmd/CMakeLists.txt +++ b/src/yuzu_cmd/CMakeLists.txt @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later # SPDX-FileCopyrightText: 2018 yuzu Emulator Project diff --git a/src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp b/src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp index 165dc5245f..735ef3c327 100644 --- a/src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp +++ b/src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project diff --git a/src/yuzu_cmd/yuzu.cpp b/src/yuzu_cmd/yuzu.cpp index 59ff32796f..baba1c1d0a 100644 --- a/src/yuzu_cmd/yuzu.cpp +++ b/src/yuzu_cmd/yuzu.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2014 Citra Emulator Project From 597080d4ff0158c698a4b450ed5cfec38ae44602 Mon Sep 17 00:00:00 2001 From: lizzie Date: Thu, 22 Jan 2026 19:20:22 +0000 Subject: [PATCH 48/78] ps4 icon --- dist/icon_variations/ps4.svg | 215 +++++++++++++++++++++++++++++++++++ 1 file changed, 215 insertions(+) create mode 100644 dist/icon_variations/ps4.svg diff --git a/dist/icon_variations/ps4.svg b/dist/icon_variations/ps4.svg new file mode 100644 index 0000000000..0ee32c660c --- /dev/null +++ b/dist/icon_variations/ps4.svg @@ -0,0 +1,215 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 834fa15ab7ec11fb3d4b74e55430bfba017e79e4 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 24 Jan 2026 06:48:07 +0000 Subject: [PATCH 49/78] stub add proper iostream init --- .ci/ps4/build.sh | 2 +- externals/ps4sup/stub.cpp | 4 ++++ src/core/perf_stats.h | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.ci/ps4/build.sh b/.ci/ps4/build.sh index 2bba7e185d..b792529ec7 100755 --- a/.ci/ps4/build.sh +++ b/.ci/ps4/build.sh @@ -1,6 +1,6 @@ #!/usr/local/bin/bash -ex -# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later [ -f "ps4-toolchain.cmake" ] || cat << EOF >"ps4-toolchain.cmake" diff --git a/externals/ps4sup/stub.cpp b/externals/ps4sup/stub.cpp index 89dc983599..bee5613486 100644 --- a/externals/ps4sup/stub.cpp +++ b/externals/ps4sup/stub.cpp @@ -19,3 +19,7 @@ STUB_WEAK(ZSTD_trace_decompress_end) FILE* __stderrp = stdout; #undef STUB_WEAK + +// THIS MAKES STD::COUT AND SUCH WORK :) +#include +std::ios_base::Init init; diff --git a/src/core/perf_stats.h b/src/core/perf_stats.h index 6fbf05671a..fef83b2d4b 100644 --- a/src/core/perf_stats.h +++ b/src/core/perf_stats.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2017 Citra Emulator Project From 3936f0e3b74b6bcd573725b275afe8531cc229f1 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 24 Jan 2026 18:34:49 +0000 Subject: [PATCH 50/78] revert input system to main --- src/hid_core/resource_manager.cpp | 3 - .../resources/debug_pad/debug_pad.cpp | 3 - .../resources/digitizer/digitizer.cpp | 3 - src/hid_core/resources/keyboard/keyboard.cpp | 3 - src/hid_core/resources/mouse/debug_mouse.cpp | 3 - src/hid_core/resources/mouse/mouse.cpp | 3 - .../resources/six_axis/console_six_axis.cpp | 3 - src/hid_core/resources/six_axis/six_axis.cpp | 3 - .../system_buttons/capture_button.cpp | 3 - .../resources/system_buttons/home_button.cpp | 3 - .../resources/system_buttons/sleep_button.cpp | 3 - src/input_common/drivers/joycon.cpp | 15 ++--- src/input_common/drivers/joycon.h | 12 +--- src/input_common/drivers/sdl_driver.cpp | 41 ++++++-------- src/input_common/helpers/joycon_driver.cpp | 38 +++++-------- .../joycon_protocol/common_protocol.cpp | 55 +++++++++---------- .../helpers/joycon_protocol/joycon_types.h | 12 +--- 17 files changed, 64 insertions(+), 142 deletions(-) diff --git a/src/hid_core/resource_manager.cpp b/src/hid_core/resource_manager.cpp index d0cb098d85..62fec03b1a 100644 --- a/src/hid_core/resource_manager.cpp +++ b/src/hid_core/resource_manager.cpp @@ -1,6 +1,3 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/hid_core/resources/debug_pad/debug_pad.cpp b/src/hid_core/resources/debug_pad/debug_pad.cpp index bab49b55f8..1102dad6c9 100644 --- a/src/hid_core/resources/debug_pad/debug_pad.cpp +++ b/src/hid_core/resources/debug_pad/debug_pad.cpp @@ -1,6 +1,3 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/hid_core/resources/digitizer/digitizer.cpp b/src/hid_core/resources/digitizer/digitizer.cpp index e158e55e6c..5d7dcadfe3 100644 --- a/src/hid_core/resources/digitizer/digitizer.cpp +++ b/src/hid_core/resources/digitizer/digitizer.cpp @@ -1,6 +1,3 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/hid_core/resources/keyboard/keyboard.cpp b/src/hid_core/resources/keyboard/keyboard.cpp index 4e929e1260..340e8a65ce 100644 --- a/src/hid_core/resources/keyboard/keyboard.cpp +++ b/src/hid_core/resources/keyboard/keyboard.cpp @@ -1,6 +1,3 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/hid_core/resources/mouse/debug_mouse.cpp b/src/hid_core/resources/mouse/debug_mouse.cpp index e56c1de656..5f6f6e8e1a 100644 --- a/src/hid_core/resources/mouse/debug_mouse.cpp +++ b/src/hid_core/resources/mouse/debug_mouse.cpp @@ -1,6 +1,3 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/hid_core/resources/mouse/mouse.cpp b/src/hid_core/resources/mouse/mouse.cpp index 80de81efe4..53a8938a1b 100644 --- a/src/hid_core/resources/mouse/mouse.cpp +++ b/src/hid_core/resources/mouse/mouse.cpp @@ -1,6 +1,3 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/hid_core/resources/six_axis/console_six_axis.cpp b/src/hid_core/resources/six_axis/console_six_axis.cpp index c58c14e453..4f733cc76f 100644 --- a/src/hid_core/resources/six_axis/console_six_axis.cpp +++ b/src/hid_core/resources/six_axis/console_six_axis.cpp @@ -1,6 +1,3 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/hid_core/resources/six_axis/six_axis.cpp b/src/hid_core/resources/six_axis/six_axis.cpp index abda9e8e09..b407a5c76e 100644 --- a/src/hid_core/resources/six_axis/six_axis.cpp +++ b/src/hid_core/resources/six_axis/six_axis.cpp @@ -1,6 +1,3 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/hid_core/resources/system_buttons/capture_button.cpp b/src/hid_core/resources/system_buttons/capture_button.cpp index 417d384e6b..95eb604241 100644 --- a/src/hid_core/resources/system_buttons/capture_button.cpp +++ b/src/hid_core/resources/system_buttons/capture_button.cpp @@ -1,6 +1,3 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/hid_core/resources/system_buttons/home_button.cpp b/src/hid_core/resources/system_buttons/home_button.cpp index b0131767af..f665338f32 100644 --- a/src/hid_core/resources/system_buttons/home_button.cpp +++ b/src/hid_core/resources/system_buttons/home_button.cpp @@ -1,6 +1,3 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/hid_core/resources/system_buttons/sleep_button.cpp b/src/hid_core/resources/system_buttons/sleep_button.cpp index 21e78e2d44..1596632465 100644 --- a/src/hid_core/resources/system_buttons/sleep_button.cpp +++ b/src/hid_core/resources/system_buttons/sleep_button.cpp @@ -1,6 +1,3 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/input_common/drivers/joycon.cpp b/src/input_common/drivers/joycon.cpp index ea95693a1c..fb2d75e384 100644 --- a/src/input_common/drivers/joycon.cpp +++ b/src/input_common/drivers/joycon.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project @@ -23,14 +23,12 @@ Joycons::Joycons(const std::string& input_engine_) : InputEngine(input_engine_) return; } LOG_INFO(Input, "Joycon driver Initialization started"); -#if SDL_VERSION_ATLEAST(2, 26, 4) - int const res = SDL_hid_init(); - if (res == 0) { + const int init_res = SDL_hid_init(); + if (init_res == 0) { Setup(); } else { - LOG_ERROR(Input, "Hidapi could not be initialized. failed with error = {}", res); + LOG_ERROR(Input, "Hidapi could not be initialized. failed with error = {}", init_res); } -#endif } Joycons::~Joycons() { @@ -57,9 +55,7 @@ void Joycons::Reset() { } device->Stop(); } -#if SDL_VERSION_ATLEAST(2, 26, 4) SDL_hid_exit(); -#endif } void Joycons::Setup() { @@ -84,9 +80,9 @@ void Joycons::Setup() { } void Joycons::ScanThread(std::stop_token stop_token) { -#if SDL_VERSION_ATLEAST(2, 26, 4) constexpr u16 nintendo_vendor_id = 0x057e; Common::SetCurrentThreadName("JoyconScanThread"); + do { SDL_hid_device_info* devs = SDL_hid_enumerate(nintendo_vendor_id, 0x0); SDL_hid_device_info* cur_dev = devs; @@ -102,7 +98,6 @@ void Joycons::ScanThread(std::stop_token stop_token) { SDL_hid_free_enumeration(devs); } while (Common::StoppableTimedWait(stop_token, std::chrono::seconds{5})); -#endif } bool Joycons::IsDeviceNew(SDL_hid_device_info* device_info) const { diff --git a/src/input_common/drivers/joycon.h b/src/input_common/drivers/joycon.h index 189fe1b846..112e970e15 100644 --- a/src/input_common/drivers/joycon.h +++ b/src/input_common/drivers/joycon.h @@ -1,6 +1,3 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -9,14 +6,7 @@ #include #include #include - -#include -#if SDL_VERSION_ATLEAST(2, 26, 4) -# include -#else -struct SDL_hid_device; -struct SDL_hid_device_info; -#endif +#include #include "input_common/input_engine.h" diff --git a/src/input_common/drivers/sdl_driver.cpp b/src/input_common/drivers/sdl_driver.cpp index 93f7d5c1ea..6fc2f47f6a 100644 --- a/src/input_common/drivers/sdl_driver.cpp +++ b/src/input_common/drivers/sdl_driver.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2018 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -42,7 +42,6 @@ public: } void EnableMotion() { -#if SDL_VERSION_ATLEAST(2, 26, 4) if (!sdl_controller) { return; } @@ -59,14 +58,12 @@ public: if (has_gyro) { SDL_GameControllerSetSensorEnabled(controller, SDL_SENSOR_GYRO, SDL_TRUE); } -#endif } bool HasMotion() const { return has_gyro || has_accel; } -#if SDL_VERSION_ATLEAST(2, 26, 4) bool UpdateMotion(SDL_ControllerSensorEvent event) { constexpr float gravity_constant = 9.80665f; std::scoped_lock lock{mutex}; @@ -108,7 +105,6 @@ public: motion.delta_timestamp = time_difference * 1000; return true; } -#endif const BasicMotion& GetMotion() const { return motion; @@ -153,15 +149,13 @@ public: } bool HasHDRumble() const { -#if SDL_VERSION_ATLEAST(2, 26, 4) if (sdl_controller) { - auto const type = SDL_GameControllerGetType(sdl_controller.get()); + const auto type = SDL_GameControllerGetType(sdl_controller.get()); return (type == SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO) || (type == SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_LEFT) || (type == SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT) || (type == SDL_CONTROLLER_TYPE_PS5); } -#endif return false; } @@ -258,21 +252,26 @@ public: } std::string GetControllerName() const { -#if SDL_VERSION_ATLEAST(2, 26, 4) if (sdl_controller) { switch (SDL_GameControllerGetType(sdl_controller.get())) { - case SDL_CONTROLLER_TYPE_XBOX360: return "Xbox 360 Controller"; - case SDL_CONTROLLER_TYPE_XBOXONE: return "Xbox One Controller"; - case SDL_CONTROLLER_TYPE_PS3: return "DualShock 3 Controller"; - case SDL_CONTROLLER_TYPE_PS4: return "DualShock 4 Controller"; - case SDL_CONTROLLER_TYPE_PS5: return "DualSense Controller"; + case SDL_CONTROLLER_TYPE_XBOX360: + return "Xbox 360 Controller"; + case SDL_CONTROLLER_TYPE_XBOXONE: + return "Xbox One Controller"; + case SDL_CONTROLLER_TYPE_PS3: + return "DualShock 3 Controller"; + case SDL_CONTROLLER_TYPE_PS4: + return "DualShock 4 Controller"; + case SDL_CONTROLLER_TYPE_PS5: + return "DualSense Controller"; default: - if (auto const name = SDL_GameControllerName(sdl_controller.get()); name) - return name; break; } + const auto name = SDL_GameControllerName(sdl_controller.get()); + if (name) { + return name; + } } -#endif if (sdl_joystick) { const auto name = SDL_JoystickName(sdl_joystick.get()); @@ -457,7 +456,6 @@ void SDLDriver::HandleGameControllerEvent(const SDL_Event& event) { } break; } -#if SDL_VERSION_ATLEAST(2, 26, 4) case SDL_CONTROLLERSENSORUPDATE: { if (auto joystick = GetSDLJoystickBySDLID(event.csensor.which)) { if (joystick->UpdateMotion(event.csensor)) { @@ -474,7 +472,6 @@ void SDLDriver::HandleGameControllerEvent(const SDL_Event& event) { } break; } -#endif case SDL_JOYDEVICEREMOVED: LOG_DEBUG(Input, "Controller removed with Instance_ID {}", event.jdevice.which); CloseJoystick(SDL_JoystickFromInstanceID(event.jdevice.which)); @@ -492,7 +489,6 @@ void SDLDriver::CloseJoysticks() { } SDLDriver::SDLDriver(std::string input_engine_) : InputEngine(std::move(input_engine_)) { -#if SDL_VERSION_ATLEAST(2, 26, 4) // Set our application name. Currently passed to DBus by SDL and visible to the user through // their desktop environment. SDL_SetHint(SDL_HINT_APP_NAME, "Eden"); @@ -533,7 +529,6 @@ SDLDriver::SDLDriver(std::string input_engine_) : InputEngine(std::move(input_en // Disable hidapi driver for xbox. Already default on Windows, this causes conflict with native // driver on Linux. SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_XBOX, "0"); -#endif // If the frontend is going to manage the event loop, then we don't start one here start_thread = SDL_WasInit(SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER) == 0; @@ -838,7 +833,6 @@ ButtonBindings SDLDriver::GetDefaultButtonBinding( auto slr_button = SDL_CONTROLLER_BUTTON_LEFTSHOULDER; auto srr_button = SDL_CONTROLLER_BUTTON_RIGHTSHOULDER; -#if SDL_VERSION_ATLEAST(2, 26, 4) if (joystick->IsJoyconLeft()) { sll_button = SDL_CONTROLLER_BUTTON_PADDLE2; srl_button = SDL_CONTROLLER_BUTTON_PADDLE4; @@ -847,7 +841,6 @@ ButtonBindings SDLDriver::GetDefaultButtonBinding( slr_button = SDL_CONTROLLER_BUTTON_PADDLE3; srr_button = SDL_CONTROLLER_BUTTON_PADDLE1; } -#endif return { std::pair{Settings::NativeButton::A, SDL_CONTROLLER_BUTTON_B}, @@ -869,9 +862,7 @@ ButtonBindings SDLDriver::GetDefaultButtonBinding( {Settings::NativeButton::SLRight, slr_button}, {Settings::NativeButton::SRRight, srr_button}, {Settings::NativeButton::Home, SDL_CONTROLLER_BUTTON_GUIDE}, -#if SDL_VERSION_ATLEAST(2, 26, 4) {Settings::NativeButton::Screenshot, SDL_CONTROLLER_BUTTON_MISC1}, -#endif }; } diff --git a/src/input_common/helpers/joycon_driver.cpp b/src/input_common/helpers/joycon_driver.cpp index 867ecb7465..0dd1c958a2 100644 --- a/src/input_common/helpers/joycon_driver.cpp +++ b/src/input_common/helpers/joycon_driver.cpp @@ -1,6 +1,3 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -41,8 +38,8 @@ Common::Input::DriverResult JoyconDriver::RequestDeviceAccess(SDL_hid_device_inf return Common::Input::DriverResult::UnsupportedControllerType; } -#if SDL_VERSION_ATLEAST(2, 26, 4) - hidapi_handle->handle = SDL_hid_open(device_info->vendor_id, device_info->product_id, device_info->serial_number); + hidapi_handle->handle = + SDL_hid_open(device_info->vendor_id, device_info->product_id, device_info->serial_number); std::memcpy(&handle_serial_number, device_info->serial_number, 15); if (!hidapi_handle->handle) { LOG_ERROR(Input, "Yuzu can't gain access to this device: ID {:04X}:{:04X}.", @@ -51,9 +48,6 @@ Common::Input::DriverResult JoyconDriver::RequestDeviceAccess(SDL_hid_device_inf } SDL_hid_set_nonblocking(hidapi_handle->handle, 1); return Common::Input::DriverResult::Success; -#else - return Common::Input::DriverResult::UnsupportedControllerType; -#endif } Common::Input::DriverResult JoyconDriver::InitializeDevice() { @@ -144,6 +138,8 @@ void JoyconDriver::InputThread(std::stop_token stop_token) { Common::SetCurrentThreadName("JoyconInput"); input_thread_running = true; + // Max update rate is 5ms, ensure we are always able to read a bit faster + constexpr int ThreadDelay = 3; std::vector buffer(MaxBufferSize); while (!stop_token.stop_requested()) { @@ -154,17 +150,14 @@ void JoyconDriver::InputThread(std::stop_token stop_token) { continue; } -#if SDL_VERSION_ATLEAST(2, 26, 4) - // Max update rate is 5ms, ensure we are always able to read a bit faster - int constexpr thread_delay = 3; // By disabling the input thread we can ensure custom commands will succeed as no package is // skipped if (!disable_input_thread) { - status = SDL_hid_read_timeout(hidapi_handle->handle, buffer.data(), buffer.size(), thread_delay); + status = SDL_hid_read_timeout(hidapi_handle->handle, buffer.data(), buffer.size(), + ThreadDelay); } else { - std::this_thread::sleep_for(std::chrono::milliseconds(thread_delay)); + std::this_thread::sleep_for(std::chrono::milliseconds(ThreadDelay)); } -#endif if (IsPayloadCorrect(status, buffer)) { OnNewData(buffer); @@ -697,18 +690,19 @@ void JoyconDriver::SetCallbacks(const JoyconCallbacks& callbacks) { joycon_poller->SetCallbacks(callbacks); } -Common::Input::DriverResult JoyconDriver::GetDeviceType(SDL_hid_device_info* device_info, ControllerType& controller_type) { -#if SDL_VERSION_ATLEAST(2, 26, 4) +Common::Input::DriverResult JoyconDriver::GetDeviceType(SDL_hid_device_info* device_info, + ControllerType& controller_type) { static constexpr std::array, 6> supported_devices{ std::pair{0x2006, ControllerType::Left}, {0x2007, ControllerType::Right}, {0x2009, ControllerType::Pro}, }; - constexpr u16 nintendo_vendor_id = 0x057e; + controller_type = ControllerType::None; - if (device_info->vendor_id != nintendo_vendor_id) + if (device_info->vendor_id != nintendo_vendor_id) { return Common::Input::DriverResult::UnsupportedControllerType; + } for (const auto& [product_id, type] : supported_devices) { if (device_info->product_id == static_cast(product_id)) { @@ -716,20 +710,16 @@ Common::Input::DriverResult JoyconDriver::GetDeviceType(SDL_hid_device_info* dev return Common::Input::DriverResult::Success; } } -#endif return Common::Input::DriverResult::UnsupportedControllerType; } -Common::Input::DriverResult JoyconDriver::GetSerialNumber(SDL_hid_device_info* device_info, SerialNumber& serial_number) { -#if SDL_VERSION_ATLEAST(2, 26, 4) +Common::Input::DriverResult JoyconDriver::GetSerialNumber(SDL_hid_device_info* device_info, + SerialNumber& serial_number) { if (device_info->serial_number == nullptr) { return Common::Input::DriverResult::Unknown; } std::memcpy(&serial_number, device_info->serial_number, 15); return Common::Input::DriverResult::Success; -#else - return Common::Input::DriverResult::Unknown; -#endif } } // namespace InputCommon::Joycon diff --git a/src/input_common/helpers/joycon_protocol/common_protocol.cpp b/src/input_common/helpers/joycon_protocol/common_protocol.cpp index fc6281938a..a6eecf9802 100644 --- a/src/input_common/helpers/joycon_protocol/common_protocol.cpp +++ b/src/input_common/helpers/joycon_protocol/common_protocol.cpp @@ -1,6 +1,3 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -18,15 +15,11 @@ u8 JoyconCommonProtocol::GetCounter() { } void JoyconCommonProtocol::SetBlocking() { -#if SDL_VERSION_ATLEAST(2, 26, 4) SDL_hid_set_nonblocking(hidapi_handle->handle, 0); -#endif } void JoyconCommonProtocol::SetNonBlocking() { -#if SDL_VERSION_ATLEAST(2, 26, 4) SDL_hid_set_nonblocking(hidapi_handle->handle, 1); -#endif } Common::Input::DriverResult JoyconCommonProtocol::GetDeviceType(ControllerType& controller_type) { @@ -42,23 +35,26 @@ Common::Input::DriverResult JoyconCommonProtocol::GetDeviceType(ControllerType& return result; } -Common::Input::DriverResult JoyconCommonProtocol::CheckDeviceAccess(SDL_hid_device_info* device_info) { +Common::Input::DriverResult JoyconCommonProtocol::CheckDeviceAccess( + SDL_hid_device_info* device_info) { ControllerType controller_type{ControllerType::None}; const auto result = GetDeviceType(controller_type); + if (result != Common::Input::DriverResult::Success || controller_type == ControllerType::None) { return Common::Input::DriverResult::UnsupportedControllerType; } -#if SDL_VERSION_ATLEAST(2, 26, 4) - hidapi_handle->handle = SDL_hid_open(device_info->vendor_id, device_info->product_id, device_info->serial_number); + + hidapi_handle->handle = + SDL_hid_open(device_info->vendor_id, device_info->product_id, device_info->serial_number); + if (!hidapi_handle->handle) { - LOG_ERROR(Input, "Yuzu can't gain access to this device: ID {:04X}:{:04X}.", device_info->vendor_id, device_info->product_id); + LOG_ERROR(Input, "Yuzu can't gain access to this device: ID {:04X}:{:04X}.", + device_info->vendor_id, device_info->product_id); return Common::Input::DriverResult::HandleInUse; } + SetNonBlocking(); return Common::Input::DriverResult::Success; -#else - return Common::Input::DriverResult::UnsupportedControllerType; -#endif } Common::Input::DriverResult JoyconCommonProtocol::SetReportMode(ReportMode report_mode) { @@ -67,21 +63,21 @@ Common::Input::DriverResult JoyconCommonProtocol::SetReportMode(ReportMode repor } Common::Input::DriverResult JoyconCommonProtocol::SendRawData(std::span buffer) { -#if SDL_VERSION_ATLEAST(2, 26, 4) - auto const result = SDL_hid_write(hidapi_handle->handle, buffer.data(), buffer.size()); - if (result == -1) + const auto result = SDL_hid_write(hidapi_handle->handle, buffer.data(), buffer.size()); + + if (result == -1) { return Common::Input::DriverResult::ErrorWritingData; + } + return Common::Input::DriverResult::Success; -#else - return Common::Input::DriverResult::ErrorWritingData; -#endif } -Common::Input::DriverResult JoyconCommonProtocol::GetSubCommandResponse(SubCommand sc, SubCommandResponse& output) { -#if SDL_VERSION_ATLEAST(2, 26, 4) +Common::Input::DriverResult JoyconCommonProtocol::GetSubCommandResponse( + SubCommand sc, SubCommandResponse& output) { constexpr int timeout_mili = 66; constexpr int MaxTries = 10; int tries = 0; + do { int result = SDL_hid_read_timeout(hidapi_handle->handle, reinterpret_cast(&output), sizeof(SubCommandResponse), timeout_mili); @@ -92,8 +88,9 @@ Common::Input::DriverResult JoyconCommonProtocol::GetSubCommandResponse(SubComma if (tries++ > MaxTries) { return Common::Input::DriverResult::Timeout; } - } while (output.input_report.report_mode != ReportMode::SUBCMD_REPLY && output.sub_command != sc); -#endif + } while (output.input_report.report_mode != ReportMode::SUBCMD_REPLY && + output.sub_command != sc); + return Common::Input::DriverResult::Success; } @@ -221,11 +218,12 @@ Common::Input::DriverResult JoyconCommonProtocol::ConfigureMCU(const MCUConfig& return result; } -Common::Input::DriverResult JoyconCommonProtocol::GetMCUDataResponse(ReportMode report_mode, MCUCommandResponse& output) { -#if SDL_VERSION_ATLEAST(2, 26, 4) +Common::Input::DriverResult JoyconCommonProtocol::GetMCUDataResponse(ReportMode report_mode, + MCUCommandResponse& output) { constexpr int TimeoutMili = 200; constexpr int MaxTries = 9; int tries = 0; + do { int result = SDL_hid_read_timeout(hidapi_handle->handle, reinterpret_cast(&output), sizeof(MCUCommandResponse), TimeoutMili); @@ -236,8 +234,9 @@ Common::Input::DriverResult JoyconCommonProtocol::GetMCUDataResponse(ReportMode if (tries++ > MaxTries) { return Common::Input::DriverResult::Timeout; } - } while (output.input_report.report_mode != report_mode || output.mcu_report == MCUReport::EmptyAwaitingCmd); -#endif + } while (output.input_report.report_mode != report_mode || + output.mcu_report == MCUReport::EmptyAwaitingCmd); + return Common::Input::DriverResult::Success; } diff --git a/src/input_common/helpers/joycon_protocol/joycon_types.h b/src/input_common/helpers/joycon_protocol/joycon_types.h index acac627097..792f124e14 100644 --- a/src/input_common/helpers/joycon_protocol/joycon_types.h +++ b/src/input_common/helpers/joycon_protocol/joycon_types.h @@ -1,6 +1,3 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -13,14 +10,7 @@ #include #include - -#include -#if SDL_VERSION_ATLEAST(2, 26, 4) -# include -#else -struct SDL_hid_device; -struct SDL_hid_device_info; -#endif +#include #include "common/bit_field.h" #include "common/common_funcs.h" From fa0d0a9ba0eedfb361ed263ab1b8701b4725dc40 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 24 Jan 2026 19:03:04 +0000 Subject: [PATCH 51/78] Use updated SDL2 --- .ci/ps4/build.sh | 1 + externals/CMakeLists.txt | 6 ++++++ externals/cpmfile.json | 8 ++++++++ 3 files changed, 15 insertions(+) diff --git a/.ci/ps4/build.sh b/.ci/ps4/build.sh index b792529ec7..b167b65ef5 100755 --- a/.ci/ps4/build.sh +++ b/.ci/ps4/build.sh @@ -53,5 +53,6 @@ cmake -S . -B build -G "Unix Makefiles" \ -DYUZU_USE_EXTERNAL_FFMPEG=ON \ -DYUZU_USE_CPM=ON \ -DDYNARMIC_TESTS=ON \ + -DYUZU_USE_EXTERNAL_SDL2=ON \ "${EXTRA_CMAKE_FLAGS[@]}" || exit cmake --build build -t yuzu-cmd_pkg -- -j$NPROC diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index 428fc6f9f1..f3a8e54450 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -159,6 +159,12 @@ if (NOT ANDROID) if ("${YUZU_SYSTEM_PROFILE}" STREQUAL "steamdeck") set(SDL_PIPEWIRE OFF) # build errors out with this on AddJsonPackage("sdl2_steamdeck") + elseif (PLATFORM_PS4) + set(PS4 ON) + set(ORBIS ON) + AddJsonPackage("sdl2_ps4") + unset(ORBIS) + unset(PS4) else() AddJsonPackage("sdl2_generic") endif() diff --git a/externals/cpmfile.json b/externals/cpmfile.json index 7e2a9c58a5..7569645e88 100644 --- a/externals/cpmfile.json +++ b/externals/cpmfile.json @@ -190,6 +190,14 @@ "bundled": true, "skip_updates": "true" }, + "sdl2_ps4": { + "package": "SDL2", + "repo": "xinitrcn1/SDL", + "sha": "f577141fc4", + "key": "ps4", + "bundled": true, + "skip_updates": true + }, "moltenvk": { "repo": "V380-Ori/Ryujinx.MoltenVK", "tag": "v%VERSION%-ryujinx", From d365a3050abd182802436480f2439e465a6ac63f Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 24 Jan 2026 20:02:12 +0000 Subject: [PATCH 52/78] make a bit more mergeable --- .ci/ps4/build.sh | 1 + src/audio_core/CMakeLists.txt | 2 +- src/hid_core/resources/npad/npad.cpp | 3 ++- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.ci/ps4/build.sh b/.ci/ps4/build.sh index b167b65ef5..2fdcd01c68 100755 --- a/.ci/ps4/build.sh +++ b/.ci/ps4/build.sh @@ -52,6 +52,7 @@ cmake -S . -B build -G "Unix Makefiles" \ -DCPMUTIL_FORCE_BUNDLED=ON \ -DYUZU_USE_EXTERNAL_FFMPEG=ON \ -DYUZU_USE_CPM=ON \ + -DDYNARMIC_ENABLE_NO_EXECUTE_SUPPORT=OFF \ -DDYNARMIC_TESTS=ON \ -DYUZU_USE_EXTERNAL_SDL2=ON \ "${EXTRA_CMAKE_FLAGS[@]}" || exit diff --git a/src/audio_core/CMakeLists.txt b/src/audio_core/CMakeLists.txt index 4f8cc7d1ca..22106fc74d 100644 --- a/src/audio_core/CMakeLists.txt +++ b/src/audio_core/CMakeLists.txt @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later # SPDX-FileCopyrightText: 2018 yuzu Emulator Project diff --git a/src/hid_core/resources/npad/npad.cpp b/src/hid_core/resources/npad/npad.cpp index 63ffd90d04..a0f72ab298 100644 --- a/src/hid_core/resources/npad/npad.cpp +++ b/src/hid_core/resources/npad/npad.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -1340,6 +1340,7 @@ void NPad::UpdateHandheldAbstractState() { void NPad::EnableAppletToGetInput(u64 aruid) { std::scoped_lock lock{mutex}; std::scoped_lock shared_lock{*applet_resource_holder.shared_mutex}; + for (auto& abstract_pad : abstracted_pads) { abstract_pad.EnableAppletToGetInput(aruid); } From 921c8d9406e780f3498218399df9dcf806639319 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 24 Jan 2026 20:37:16 +0000 Subject: [PATCH 53/78] fix2 --- CMakeModules/FindSDL2.cmake | 391 ------------------------------------ externals/CMakeLists.txt | 8 +- 2 files changed, 1 insertion(+), 398 deletions(-) delete mode 100644 CMakeModules/FindSDL2.cmake diff --git a/CMakeModules/FindSDL2.cmake b/CMakeModules/FindSDL2.cmake deleted file mode 100644 index b039031b4a..0000000000 --- a/CMakeModules/FindSDL2.cmake +++ /dev/null @@ -1,391 +0,0 @@ -# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -# SPDX-License-Identifier: GPL-3.0-or-later - -# Distributed under the OSI-approved BSD 3-Clause License. See accompanying -# file Copyright.txt or https://cmake.org/licensing for details. - -# Copyright 2019 Amine Ben Hassouna -# Copyright 2000-2019 Kitware, Inc. and Contributors -# All rights reserved. - -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: - -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. - -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. - -# * Neither the name of Kitware, Inc. nor the names of Contributors -# may be used to endorse or promote products derived from this -# software without specific prior written permission. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#[=======================================================================[.rst: -FindSDL2 --------- - -Locate SDL2 library - -This module defines the following 'IMPORTED' targets: - -:: - - SDL2::Core - The SDL2 library, if found. - Libraries should link to SDL2::Core - - SDL2::Main - The SDL2main library, if found. - Applications should link to SDL2::Main instead of SDL2::Core - - - -This module will set the following variables in your project: - -:: - - SDL2_LIBRARIES, the name of the library to link against - SDL2_INCLUDE_DIRS, where to find SDL.h - SDL2_FOUND, if false, do not try to link to SDL2 - SDL2MAIN_FOUND, if false, do not try to link to SDL2main - SDL2_VERSION_STRING, human-readable string containing the version of SDL2 - - - -This module responds to the following cache variables: - -:: - - SDL2_PATH - Set a custom SDL2 Library path (default: empty) - - SDL2_NO_DEFAULT_PATH - Disable search SDL2 Library in default path. - If SDL2_PATH (default: ON) - Else (default: OFF) - - SDL2_INCLUDE_DIR - SDL2 headers path. - - SDL2_LIBRARY - SDL2 Library (.dll, .so, .a, etc) path. - - SDL2MAIN_LIBRAY - SDL2main Library (.a) path. - - SDL2_BUILDING_LIBRARY - This flag is useful only when linking to SDL2_LIBRARIES insead of - SDL2::Main. It is required only when building a library that links to - SDL2_LIBRARIES, because only applications need main() (No need to also - link to SDL2main). - If this flag is defined, then no SDL2main will be added to SDL2_LIBRARIES - and no SDL2::Main target will be created. - - -Don't forget to include SDLmain.h and SDLmain.m in your project for the -OS X framework based version. (Other versions link to -lSDL2main which -this module will try to find on your behalf.) Also for OS X, this -module will automatically add the -framework Cocoa on your behalf. - - -Additional Note: If you see an empty SDL2_LIBRARY in your project -configuration, it means CMake did not find your SDL2 library -(SDL2.dll, libsdl2.so, SDL2.framework, etc). Set SDL2_LIBRARY to point -to your SDL2 library, and configure again. Similarly, if you see an -empty SDL2MAIN_LIBRARY, you should set this value as appropriate. These -values are used to generate the final SDL2_LIBRARIES variable and the -SDL2::Core and SDL2::Main targets, but when these values are unset, -SDL2_LIBRARIES, SDL2::Core and SDL2::Main does not get created. - - -$SDL2DIR is an environment variable that would correspond to the -./configure --prefix=$SDL2DIR used in building SDL2. l.e.galup 9-20-02 - - - -Created by Amine Ben Hassouna: - Adapt FindSDL.cmake to SDL2 (FindSDL2.cmake). - Add cache variables for more flexibility: - SDL2_PATH, SDL2_NO_DEFAULT_PATH (for details, see doc above). - Mark 'Threads' as a required dependency for non-OSX systems. - Modernize the FindSDL2.cmake module by creating specific targets: - SDL2::Core and SDL2::Main (for details, see doc above). - - -Original FindSDL.cmake module: - Modified by Eric Wing. Added code to assist with automated building - by using environmental variables and providing a more - controlled/consistent search behavior. Added new modifications to - recognize OS X frameworks and additional Unix paths (FreeBSD, etc). - Also corrected the header search path to follow "proper" SDL - guidelines. Added a search for SDLmain which is needed by some - platforms. Added a search for threads which is needed by some - platforms. Added needed compile switches for MinGW. - -On OSX, this will prefer the Framework version (if found) over others. -People will have to manually change the cache value of SDL2_LIBRARY to -override this selection or set the SDL2_PATH variable or the CMake -environment CMAKE_INCLUDE_PATH to modify the search paths. - -Note that the header path has changed from SDL/SDL.h to just SDL.h -This needed to change because "proper" SDL convention is #include -"SDL.h", not . This is done for portability reasons -because not all systems place things in SDL/ (see FreeBSD). -#]=======================================================================] - -# Define options for searching SDL2 Library in a custom path - -set(SDL2_PATH "" CACHE STRING "Custom SDL2 Library path") - -set(_SDL2_NO_DEFAULT_PATH OFF) -if(SDL2_PATH) - set(_SDL2_NO_DEFAULT_PATH ON) -endif() - -set(SDL2_NO_DEFAULT_PATH ${_SDL2_NO_DEFAULT_PATH} - CACHE BOOL "Disable search SDL2 Library in default path") -unset(_SDL2_NO_DEFAULT_PATH) - -set(SDL2_NO_DEFAULT_PATH_CMD) -if(SDL2_NO_DEFAULT_PATH) - set(SDL2_NO_DEFAULT_PATH_CMD NO_DEFAULT_PATH) -endif() - -# Search for the SDL2 include directory -find_path(SDL2_INCLUDE_DIR SDL.h - HINTS - ENV SDL2DIR - ${SDL2_NO_DEFAULT_PATH_CMD} - PATH_SUFFIXES SDL2 - # path suffixes to search inside ENV{SDL2DIR} - include/SDL2 include - PATHS ${SDL2_PATH} - DOC "Where the SDL2 headers can be found" -) - -set(SDL2_INCLUDE_DIRS "${SDL2_INCLUDE_DIR}") - -if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(VC_LIB_PATH_SUFFIX lib/x64) -else() - set(VC_LIB_PATH_SUFFIX lib/x86) -endif() - -# SDL-2.0 is the name used by FreeBSD ports... -# don't confuse it for the version number. -find_library(SDL2_LIBRARY - NAMES SDL2 SDL-2.0 - HINTS - ENV SDL2DIR - ${SDL2_NO_DEFAULT_PATH_CMD} - PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX} - PATHS ${SDL2_PATH} - DOC "Where the SDL2 Library can be found" -) - -set(SDL2_LIBRARIES "${SDL2_LIBRARY}") - -if(NOT SDL2_BUILDING_LIBRARY) - if(NOT SDL2_INCLUDE_DIR MATCHES ".framework") - # Non-OS X framework versions expect you to also dynamically link to - # SDL2main. This is mainly for Windows and OS X. Other (Unix) platforms - # seem to provide SDL2main for compatibility even though they don't - # necessarily need it. - - if(SDL2_PATH) - set(SDL2MAIN_LIBRARY_PATHS "${SDL2_PATH}") - endif() - - if(NOT SDL2_NO_DEFAULT_PATH) - set(SDL2MAIN_LIBRARY_PATHS - /sw - /opt/local - /opt/csw - /opt - "${SDL2MAIN_LIBRARY_PATHS}" - ) - endif() - - find_library(SDL2MAIN_LIBRARY - NAMES SDL2main - HINTS - ENV SDL2DIR - ${SDL2_NO_DEFAULT_PATH_CMD} - PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX} - PATHS ${SDL2MAIN_LIBRARY_PATHS} - DOC "Where the SDL2main library can be found" - ) - unset(SDL2MAIN_LIBRARY_PATHS) - endif() -endif() - -# SDL2 may require threads on your system. -# The Apple build may not need an explicit flag because one of the -# frameworks may already provide it. -# But for non-OSX systems, I will use the CMake Threads package. -if(NOT APPLE) - find_package(Threads QUIET) - if(NOT Threads_FOUND) - set(SDL2_THREADS_NOT_FOUND "Could NOT find Threads (Threads is required by SDL2).") - if(SDL2_FIND_REQUIRED) - message(FATAL_ERROR ${SDL2_THREADS_NOT_FOUND}) - else() - if(NOT SDL2_FIND_QUIETLY) - message(STATUS ${SDL2_THREADS_NOT_FOUND}) - endif() - return() - endif() - unset(SDL2_THREADS_NOT_FOUND) - endif() -endif() - -# MinGW needs an additional link flag, -mwindows -# It's total link flags should look like -lmingw32 -lSDL2main -lSDL2 -mwindows -if(MINGW) - set(MINGW32_LIBRARY mingw32 "-mwindows" CACHE STRING "link flags for MinGW") -endif() - -if(SDL2_LIBRARY) - # For SDL2main - if(SDL2MAIN_LIBRARY AND NOT SDL2_BUILDING_LIBRARY) - list(FIND SDL2_LIBRARIES "${SDL2MAIN_LIBRARY}" _SDL2_MAIN_INDEX) - if(_SDL2_MAIN_INDEX EQUAL -1) - set(SDL2_LIBRARIES "${SDL2MAIN_LIBRARY}" ${SDL2_LIBRARIES}) - endif() - unset(_SDL2_MAIN_INDEX) - endif() - - # For OS X, SDL2 uses Cocoa as a backend so it must link to Cocoa. - # CMake doesn't display the -framework Cocoa string in the UI even - # though it actually is there if I modify a pre-used variable. - # I think it has something to do with the CACHE STRING. - # So I use a temporary variable until the end so I can set the - # "real" variable in one-shot. - if(APPLE) - set(SDL2_LIBRARIES ${SDL2_LIBRARIES} -framework Cocoa) - endif() - - # For threads, as mentioned Apple doesn't need this. - # In fact, there seems to be a problem if I used the Threads package - # and try using this line, so I'm just skipping it entirely for OS X. - if(NOT APPLE) - set(SDL2_LIBRARIES ${SDL2_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) - endif() - - # For MinGW library - if(MINGW) - set(SDL2_LIBRARIES ${MINGW32_LIBRARY} ${SDL2_LIBRARIES}) - endif() - -endif() - -# Read SDL2 version -if(SDL2_INCLUDE_DIR AND EXISTS "${SDL2_INCLUDE_DIR}/SDL_version.h") - file(STRINGS "${SDL2_INCLUDE_DIR}/SDL_version.h" SDL2_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL_MAJOR_VERSION[ \t]+[0-9]+$") - file(STRINGS "${SDL2_INCLUDE_DIR}/SDL_version.h" SDL2_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL_MINOR_VERSION[ \t]+[0-9]+$") - file(STRINGS "${SDL2_INCLUDE_DIR}/SDL_version.h" SDL2_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL_PATCHLEVEL[ \t]+[0-9]+$") - string(REGEX REPLACE "^#define[ \t]+SDL_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_MAJOR "${SDL2_VERSION_MAJOR_LINE}") - string(REGEX REPLACE "^#define[ \t]+SDL_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_MINOR "${SDL2_VERSION_MINOR_LINE}") - string(REGEX REPLACE "^#define[ \t]+SDL_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_PATCH "${SDL2_VERSION_PATCH_LINE}") - set(SDL2_VERSION_STRING ${SDL2_VERSION_MAJOR}.${SDL2_VERSION_MINOR}.${SDL2_VERSION_PATCH}) - unset(SDL2_VERSION_MAJOR_LINE) - unset(SDL2_VERSION_MINOR_LINE) - unset(SDL2_VERSION_PATCH_LINE) - unset(SDL2_VERSION_MAJOR) - unset(SDL2_VERSION_MINOR) - unset(SDL2_VERSION_PATCH) -endif() - -include(FindPackageHandleStandardArgs) - -FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2 - REQUIRED_VARS SDL2_LIBRARY SDL2_INCLUDE_DIR - VERSION_VAR SDL2_VERSION_STRING) - -if(SDL2MAIN_LIBRARY) - FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2main - REQUIRED_VARS SDL2MAIN_LIBRARY SDL2_INCLUDE_DIR - VERSION_VAR SDL2_VERSION_STRING) -endif() - - -mark_as_advanced(SDL2_PATH - SDL2_NO_DEFAULT_PATH - SDL2_LIBRARY - SDL2MAIN_LIBRARY - SDL2_INCLUDE_DIR - SDL2_BUILDING_LIBRARY) - - -# SDL2:: targets (SDL2::Core and SDL2::Main) -if(SDL2_FOUND) - - # SDL2::Core target - if(SDL2_LIBRARY AND NOT TARGET SDL2::Core) - add_library(SDL2::Core UNKNOWN IMPORTED) - set_target_properties(SDL2::Core PROPERTIES - IMPORTED_LOCATION "${SDL2_LIBRARY}" - INTERFACE_INCLUDE_DIRECTORIES "${SDL2_INCLUDE_DIR}") - - if(APPLE) - # For OS X, SDL2 uses Cocoa as a backend so it must link to Cocoa. - # For more details, please see above. - set_property(TARGET SDL2::Core APPEND PROPERTY - INTERFACE_LINK_OPTIONS -framework Cocoa) - else() - # For threads, as mentioned Apple doesn't need this. - # For more details, please see above. - set_property(TARGET SDL2::Core APPEND PROPERTY - INTERFACE_LINK_LIBRARIES Threads::Threads) - endif() - endif() - - # SDL2::Main target - # Applications should link to SDL2::Main instead of SDL2::Core - # For more details, please see above. - if(NOT SDL2_BUILDING_LIBRARY AND NOT TARGET SDL2::Main) - - if(SDL2_INCLUDE_DIR MATCHES ".framework" OR NOT SDL2MAIN_LIBRARY) - add_library(SDL2::Main INTERFACE IMPORTED) - set_property(TARGET SDL2::Main PROPERTY - INTERFACE_LINK_LIBRARIES SDL2::Core) - elseif(SDL2MAIN_LIBRARY) - # MinGW requires that the mingw32 library is specified before the - # libSDL2main.a static library when linking. - # The SDL2::MainInternal target is used internally to make sure that - # CMake respects this condition. - add_library(SDL2::MainInternal UNKNOWN IMPORTED) - set_property(TARGET SDL2::MainInternal PROPERTY - IMPORTED_LOCATION "${SDL2MAIN_LIBRARY}") - set_property(TARGET SDL2::MainInternal PROPERTY - INTERFACE_LINK_LIBRARIES SDL2::Core) - - add_library(SDL2::Main INTERFACE IMPORTED) - - if(MINGW) - # MinGW needs an additional link flag '-mwindows' and link to mingw32 - set_property(TARGET SDL2::Main PROPERTY - INTERFACE_LINK_LIBRARIES "mingw32" "-mwindows") - endif() - - set_property(TARGET SDL2::Main APPEND PROPERTY - INTERFACE_LINK_LIBRARIES SDL2::MainInternal) - endif() - - endif() -endif() diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index f3a8e54450..4b20eb441b 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -176,13 +176,7 @@ if (NOT ANDROID) AddJsonPackage(sdl2) endif() - if (PLATFORM_PS4) - set(SDL2_LIBRARY ${CMAKE_SYSROOT}/lib/libSDL2.a) - set(SDL2_INCLUDE_DIR ${CMAKE_SYSROOT}/include/SDL2) - find_package(SDL2 REQUIRED) - else() - find_package(SDL2 2.26.4 REQUIRED) - endif() + find_package(SDL2 2.26.4 REQUIRED) endif() set(BUILD_SHARED_LIBS OFF) From b35a34e41c0f7aef623bf7f6cd7d185b249f6efe Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 24 Jan 2026 20:37:37 +0000 Subject: [PATCH 54/78] fix ps4/orbis --- externals/CMakeLists.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index 4b20eb441b..1c73f4671f 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -163,8 +163,6 @@ if (NOT ANDROID) set(PS4 ON) set(ORBIS ON) AddJsonPackage("sdl2_ps4") - unset(ORBIS) - unset(PS4) else() AddJsonPackage("sdl2_generic") endif() From d23fa2142d2497a0f7c9b94a2e6af1b6a720098e Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 28 Jan 2026 18:04:31 +0000 Subject: [PATCH 55/78] mark codeblocks as noexcept --- docs/Caveats.md | 6 +++++- externals/cpmfile.json | 2 +- .../src/dynarmic/backend/x64/block_of_code.cpp | 12 ++++++------ .../src/dynarmic/backend/x64/block_of_code.h | 4 ++-- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/docs/Caveats.md b/docs/Caveats.md index a4b5a2a351..a5203775e7 100644 --- a/docs/Caveats.md +++ b/docs/Caveats.md @@ -224,10 +224,14 @@ When CMake invokes certain file syscalls - it may sometimes cause crashes or cor ## PlayStation 4 ```sh -export OO_PS4_TOOLCHAIN="$HOME/OpenOrbis/PS4Toolchain" +export OO_PS4_TOOLCHAIN="$HOME/OpenOrbis/PS4Toolchain/prefix" export DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1 ``` +```sh +cp $OO_PS4_TOOLCHAIN/include/endian.h $OO_PS4_TOOLCHAIN/include/sys/endian.h +``` + ## Windows ### Windows 7, Windows 8 and Windows 8.1 diff --git a/externals/cpmfile.json b/externals/cpmfile.json index 7569645e88..34bf72f626 100644 --- a/externals/cpmfile.json +++ b/externals/cpmfile.json @@ -114,7 +114,7 @@ ], "patches": [ "0001-netbsd-fix.patch", - "0002-allow-static-only.patch" + "0002-allow-static-only.patch", "0003-openorbis.patch" ] }, diff --git a/src/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp b/src/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp index 28c821ab59..3388760024 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp @@ -239,12 +239,12 @@ static const auto default_cg_mode = Xbyak::DontSetProtectRWE; static const auto default_cg_mode = nullptr; //Allow RWE #endif -BlockOfCode::BlockOfCode(RunCodeCallbacks cb, JitStateInfo jsi, size_t total_code_size, std::function rcp) - : Xbyak::CodeGenerator(total_code_size, default_cg_mode, &s_allocator) - , cb(std::move(cb)) - , jsi(jsi) - , constant_pool(*this, CONSTANT_POOL_SIZE) - , host_features(GetHostFeatures()) { +BlockOfCode::BlockOfCode(RunCodeCallbacks cb, JitStateInfo jsi, size_t total_code_size, std::function rcp) noexcept + : Xbyak::CodeGenerator(total_code_size, default_cg_mode, &s_allocator) + , cb(std::move(cb)) + , jsi(jsi) + , constant_pool(*this, CONSTANT_POOL_SIZE) + , host_features(GetHostFeatures()) { EnableWriting(); EnsureMemoryCommitted(PRELUDE_COMMIT_SIZE); GenRunCode(rcp); diff --git a/src/dynarmic/src/dynarmic/backend/x64/block_of_code.h b/src/dynarmic/src/dynarmic/backend/x64/block_of_code.h index 5ccab7a3ed..315833645c 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/block_of_code.h +++ b/src/dynarmic/src/dynarmic/backend/x64/block_of_code.h @@ -38,8 +38,8 @@ struct RunCodeCallbacks { class BlockOfCode final : public Xbyak::CodeGenerator { public: - BlockOfCode(RunCodeCallbacks cb, JitStateInfo jsi, size_t total_code_size, std::function rcp); - BlockOfCode(const BlockOfCode&) = delete; + BlockOfCode(RunCodeCallbacks cb, JitStateInfo jsi, size_t total_code_size, std::function rcp) noexcept; + BlockOfCode(const BlockOfCode&) noexcept = delete; /// Call when external emitters have finished emitting their preludes. void PreludeComplete(); From cdb0e97239898260d3c145e5fb0adf5bc8439856 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 28 Jan 2026 19:03:55 +0000 Subject: [PATCH 56/78] use newer sdl2, make bigger stack --- externals/cpmfile.json | 9 ++++++--- src/common/fiber.cpp | 2 +- src/yuzu_cmd/CMakeLists.txt | 4 +--- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/externals/cpmfile.json b/externals/cpmfile.json index 34bf72f626..1071404e1c 100644 --- a/externals/cpmfile.json +++ b/externals/cpmfile.json @@ -192,11 +192,14 @@ }, "sdl2_ps4": { "package": "SDL2", - "repo": "xinitrcn1/SDL", - "sha": "f577141fc4", + "repo": "libsdl-org/SDL", + "sha": "0c7042477a", "key": "ps4", "bundled": true, - "skip_updates": true + "skip_updates": true, + "patches": [ + "0001-ps4.patch" + ] }, "moltenvk": { "repo": "V380-Ori/Ryujinx.MoltenVK", diff --git a/src/common/fiber.cpp b/src/common/fiber.cpp index 69eca732eb..0c9bd4fb4d 100644 --- a/src/common/fiber.cpp +++ b/src/common/fiber.cpp @@ -16,7 +16,7 @@ namespace Common { #ifdef __OPENORBIS__ -constexpr size_t DEFAULT_STACK_SIZE = 128 * 4096; +constexpr size_t DEFAULT_STACK_SIZE = 256 * 4096; #else constexpr size_t DEFAULT_STACK_SIZE = 512 * 4096; #endif diff --git a/src/yuzu_cmd/CMakeLists.txt b/src/yuzu_cmd/CMakeLists.txt index c153e9fb78..3b85bc1d28 100644 --- a/src/yuzu_cmd/CMakeLists.txt +++ b/src/yuzu_cmd/CMakeLists.txt @@ -39,9 +39,7 @@ target_link_libraries(yuzu-cmd PRIVATE ${PLATFORM_LIBRARIES} Threads::Threads) create_resource("../../dist/eden.bmp" "yuzu_cmd/yuzu_icon.h" "yuzu_icon") target_include_directories(yuzu-cmd PRIVATE ${RESOURCES_DIR}) - -target_include_directories(yuzu-cmd PRIVATE ${CMAKE_SYSROOT}/include/SDL2) -target_link_libraries(yuzu-cmd PRIVATE SDL2) +target_link_libraries(yuzu-cmd PRIVATE SDL2::SDL2) if(UNIX AND NOT APPLE) install(TARGETS yuzu-cmd) From 83173a21e5c290dc2e81095e578d8a6357b4d35c Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 28 Jan 2026 19:15:51 +0000 Subject: [PATCH 57/78] SDL2 PS4 patch --- .patch/sdl2_ps4/0001-ps4.patch | 359 +++++++++++++++++++++++++++++++++ 1 file changed, 359 insertions(+) create mode 100644 .patch/sdl2_ps4/0001-ps4.patch diff --git a/.patch/sdl2_ps4/0001-ps4.patch b/.patch/sdl2_ps4/0001-ps4.patch new file mode 100644 index 0000000000..cb5ed901cb --- /dev/null +++ b/.patch/sdl2_ps4/0001-ps4.patch @@ -0,0 +1,359 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 7c230473ac..b1275edb61 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -331,6 +331,13 @@ if(CYGWIN) + list(APPEND SDL_CFLAGS "-I/usr/include/mingw") + endif() + ++######### *FIXME* ++if(PS4 OR ORBIS) ++ set(USE_GENERATED_CONFIG Off) ++else() ++ set(USE_GENERATED_CONFIG On) ++endif() ++ + # General includes + target_compile_definitions(sdl-build-options INTERFACE "-DUSING_GENERATED_CONFIG_H") + target_include_directories(sdl-build-options BEFORE INTERFACE "${SDL2_BINARY_DIR}/include" "${SDL2_BINARY_DIR}/include-config-$>") +@@ -359,6 +366,15 @@ if(EMSCRIPTEN) + set(SDL_CPUINFO_ENABLED_BY_DEFAULT OFF) + endif() + ++if(PS4 OR ORBIS) ++ set(SDL_ATOMIC_ENABLED_BY_DEFAULT ON) ++ set(SDL_SHARED_ENABLED_BY_DEFAULT OFF) ++ set(SDL_THREADS_ENABLED_BY_DEFAULT ON) ++ set(SDL_PTHREADS_ENABLED_BY_DEFAULT ON) ++ set(SDL_LOADSO_ENABLED_BY_DEFAULT OFF) ++ set(SDL_DLOPEN_ENABLED_BY_DEFAULT OFF) ++endif() ++ + if(VITA OR PSP OR PS2 OR N3DS) + set(SDL_SHARED_ENABLED_BY_DEFAULT OFF) + set(SDL_LOADSO_ENABLED_BY_DEFAULT OFF) +@@ -1478,7 +1494,42 @@ elseif(EMSCRIPTEN) + + CheckPTHREAD() + CheckLibUnwind() ++elseif(PS4 OR ORBIS) ++ CheckPTHREAD() ++ if(SDL_AUDIO) ++ set(SDL_AUDIO_DRIVER_PS4 1) ++ file(GLOB PS4_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/ps4/*.c) ++ set(SOURCE_FILES ${SOURCE_FILES} ${PS4_AUDIO_SOURCES}) ++ set(HAVE_SDL_AUDIO TRUE) ++ endif() ++# if(SDL_FILESYSTEM) ++# set(SDL_FILESYSTEM_PS4 1) ++# file(GLOB PS4_FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/ps4/*.c) ++# set(SOURCE_FILES ${SOURCE_FILES} ${PS4_FILESYSTEM_SOURCES}) ++# set(HAVE_SDL_FILESYSTEM TRUE) ++# endif() ++ if(SDL_JOYSTICK) ++ set(SDL_JOYSTICK_PS4 1) ++ file(GLOB PS4_JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/ps4/*.c) ++ set(SOURCE_FILES ${SOURCE_FILES} ${PS4_JOYSTICK_SOURCES}) ++ set(HAVE_SDL_JOYSTICK TRUE) ++ endif() ++ if(SDL_TIMERS) ++ set(SDL_TIMER_UNIX 1) ++ file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c) ++ set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES}) ++ set(HAVE_SDL_TIMERS TRUE) + ++ if(CLOCK_GETTIME) ++ set(HAVE_CLOCK_GETTIME 1) ++ endif() ++ endif() ++ if(SDL_VIDEO) ++ set(SDL_VIDEO_DRIVER_PS4 1) ++ file(GLOB PS4_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/ps4/*.c) ++ set(SOURCE_FILES ${SOURCE_FILES} ${PS4_VIDEO_SOURCES}) ++ set(HAVE_SDL_VIDEO TRUE) ++ endif() + elseif(UNIX AND NOT APPLE AND NOT RISCOS AND NOT HAIKU) + if(SDL_AUDIO) + if(SYSV5 OR SOLARIS OR HPUX) +@@ -3039,7 +3090,7 @@ endif() + # We always need to have threads and timers around + if(NOT HAVE_SDL_THREADS) + # The emscripten platform has been carefully vetted to work without threads +- if (EMSCRIPTEN) ++ if (EMSCRIPTEN OR PS4 OR ORBIS) + set(SDL_THREADS_DISABLED 1) + file(GLOB THREADS_SOURCES ${SDL2_SOURCE_DIR}/src/thread/generic/*.c) + list(APPEND SOURCE_FILES ${THREADS_SOURCES}) +diff --git a/README.md b/README.md +index fa7f7ba0b5..8d5a375694 100644 +--- a/README.md ++++ b/README.md +@@ -1,5 +1,5 @@ + +-# Simple DirectMedia Layer (SDL) Version 2.0 ++# Simple DirectMedia Layer (SDL) Version 2.0 (For OpenOrbis PS4 SDK) + + https://www.libsdl.org/ + +diff --git a/include/SDL_config.h b/include/SDL_config.h +index a628d86252..a101532d16 100644 +--- a/include/SDL_config.h ++++ b/include/SDL_config.h +@@ -41,6 +41,10 @@ + #include "SDL_config_iphoneos.h" + #elif defined(__ANDROID__) + #include "SDL_config_android.h" ++#elif defined(__PSP__) ++#include "SDL_config_psp.h" ++#elif defined(__OPENORBIS__) ++#include "SDL_config_ps4.h" + #elif defined(__OS2__) + #include "SDL_config_os2.h" + #elif defined(__EMSCRIPTEN__) +diff --git a/include/SDL_platform.h b/include/SDL_platform.h +index 36df782a4e..0cc20dc4e2 100644 +--- a/include/SDL_platform.h ++++ b/include/SDL_platform.h +@@ -214,6 +214,10 @@ + #if defined(PS2) + #define __PS2__ 1 + #endif ++#if defined(__OPENORBIS__) ++#undef __PS4__ ++#define __PS4__ 1 ++#endif + + /* The NACL compiler defines __native_client__ and __pnacl__ + * Ref: http://www.chromium.org/nativeclient/pnacl/stability-of-the-pnacl-bitcode-abi +diff --git a/src/SDL.c b/src/SDL.c +index cfeea077e7..33fce965c0 100644 +--- a/src/SDL.c ++++ b/src/SDL.c +@@ -642,6 +642,8 @@ const char *SDL_GetPlatform(void) + return "Nokia N-Gage"; + #elif defined(__3DS__) + return "Nintendo 3DS"; ++#elif defined(__PS4__) ++ return "PlayStation4"; + #else + return "Unknown (see SDL_platform.h)"; + #endif +diff --git a/src/SDL_error.c b/src/SDL_error.c +index 993f5bac55..083ebf3027 100644 +--- a/src/SDL_error.c ++++ b/src/SDL_error.c +@@ -50,11 +50,14 @@ int SDL_SetError(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) + va_end(ap); + } + } +- ++#ifndef __OPENORBIS__ // Yeah this is stupid but whatever + if (SDL_LogGetPriority(SDL_LOG_CATEGORY_ERROR) <= SDL_LOG_PRIORITY_DEBUG) { ++#endif + /* If we are in debug mode, print out the error message */ + SDL_LogDebug(SDL_LOG_CATEGORY_ERROR, "%s", error->str); ++#ifndef __OPENORBIS__ // Yeah this is stupid but whatever + } ++#endif + } + + return -1; +diff --git a/src/SDL_log.c b/src/SDL_log.c +index 7a5f1dbc03..a7f3d85782 100644 +--- a/src/SDL_log.c ++++ b/src/SDL_log.c +@@ -390,10 +390,12 @@ void SDL_LogMessageV(int category, SDL_LogPriority priority, const char *fmt, va + int len; + va_list aq; + ++#ifndef __OPENORBIS__ + /* Nothing to do if we don't have an output function */ + if (!SDL_log_function) { + return; + } ++#endif + + /* Make sure we don't exceed array bounds */ + if ((int)priority < 0 || priority >= SDL_NUM_LOG_PRIORITIES) { +@@ -442,7 +444,11 @@ void SDL_LogMessageV(int category, SDL_LogPriority priority, const char *fmt, va + } + + SDL_LockMutex(log_function_mutex); ++#ifdef __OPENORBIS__ ++ printf("%s\n", message); // just fucking do it ++#else + SDL_log_function(SDL_log_userdata, category, priority, message); ++#endif + SDL_UnlockMutex(log_function_mutex); + + /* Free only if dynamically allocated */ +diff --git a/src/audio/SDL_audio.c b/src/audio/SDL_audio.c +index 421adbc76a..82d087a2f8 100644 +--- a/src/audio/SDL_audio.c ++++ b/src/audio/SDL_audio.c +@@ -114,7 +114,10 @@ static const AudioBootStrap *const bootstrap[] = { + #ifdef SDL_AUDIO_DRIVER_N3DS + &N3DSAUDIO_bootstrap, + #endif +-#ifdef SDL_AUDIO_DRIVER_EMSCRIPTEN ++#if SDL_AUDIO_DRIVER_PS4 ++ &PS4AUDIO_bootstrap, ++#endif ++#if SDL_AUDIO_DRIVER_EMSCRIPTEN + &EMSCRIPTENAUDIO_bootstrap, + #endif + #ifdef SDL_AUDIO_DRIVER_JACK +diff --git a/src/audio/SDL_sysaudio.h b/src/audio/SDL_sysaudio.h +index 87387692ce..b1c00ba9dc 100644 +--- a/src/audio/SDL_sysaudio.h ++++ b/src/audio/SDL_sysaudio.h +@@ -207,6 +207,7 @@ extern AudioBootStrap PS2AUDIO_bootstrap; + extern AudioBootStrap PSPAUDIO_bootstrap; + extern AudioBootStrap VITAAUD_bootstrap; + extern AudioBootStrap N3DSAUDIO_bootstrap; ++extern AudioBootStrap PS4AUDIO_bootstrap; + extern AudioBootStrap EMSCRIPTENAUDIO_bootstrap; + extern AudioBootStrap OS2AUDIO_bootstrap; + +diff --git a/src/dynapi/SDL_dynapi.h b/src/dynapi/SDL_dynapi.h +index 178218c053..a6e298a9fe 100644 +--- a/src/dynapi/SDL_dynapi.h ++++ b/src/dynapi/SDL_dynapi.h +@@ -69,6 +69,8 @@ + #define SDL_DYNAMIC_API 0 /* devkitARM doesn't support dynamic linking */ + #elif defined(DYNAPI_NEEDS_DLOPEN) && !defined(HAVE_DLOPEN) + #define SDL_DYNAMIC_API 0 /* we need dlopen(), but don't have it.... */ ++#elif defined(__OPENORBIS__) // Apparently __PS4__ getting defined is missed somewhere, I get broken static builds so force the issue ++#define SDL_DYNAMIC_API 0 + #endif + + /* everyone else. This is where we turn on the API if nothing forced it off. */ +diff --git a/src/joystick/SDL_joystick.c b/src/joystick/SDL_joystick.c +index 60b0daf790..34433166e8 100644 +--- a/src/joystick/SDL_joystick.c ++++ b/src/joystick/SDL_joystick.c +@@ -106,6 +106,9 @@ static SDL_JoystickDriver *SDL_joystick_drivers[] = { + #ifdef SDL_JOYSTICK_N3DS + &SDL_N3DS_JoystickDriver + #endif ++#ifdef SDL_JOYSTICK_PS4 ++ &SDL_PS4_JoystickDriver, ++#endif + #if defined(SDL_JOYSTICK_DUMMY) || defined(SDL_JOYSTICK_DISABLED) + &SDL_DUMMY_JoystickDriver + #endif +diff --git a/src/joystick/SDL_sysjoystick.h b/src/joystick/SDL_sysjoystick.h +index d36f784143..6671aff2fd 100644 +--- a/src/joystick/SDL_sysjoystick.h ++++ b/src/joystick/SDL_sysjoystick.h +@@ -243,6 +243,7 @@ extern SDL_JoystickDriver SDL_HAIKU_JoystickDriver; + extern SDL_JoystickDriver SDL_HIDAPI_JoystickDriver; + extern SDL_JoystickDriver SDL_RAWINPUT_JoystickDriver; + extern SDL_JoystickDriver SDL_IOS_JoystickDriver; ++extern SDL_JoystickDriver SDL_PS4_JoystickDriver; + extern SDL_JoystickDriver SDL_LINUX_JoystickDriver; + extern SDL_JoystickDriver SDL_VIRTUAL_JoystickDriver; + extern SDL_JoystickDriver SDL_WGI_JoystickDriver; +diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c +index 35f80664ab..cd8f9d3615 100644 +--- a/src/render/SDL_render.c ++++ b/src/render/SDL_render.c +@@ -137,6 +137,10 @@ static const SDL_RenderDriver *render_drivers[] = { + #if SDL_VIDEO_RENDER_VITA_GXM + &VITA_GXM_RenderDriver, + #endif ++#if SDL_VIDEO_RENDER_PS4 && 0 // *FIXME* PS4_RenderDriver Disabled, it's software anyhow lets not reinvent... ++#error Use SoftRender for PS4 currently! ++ &PS4_RenderDriver, ++#endif + #if SDL_VIDEO_RENDER_SW + &SW_RenderDriver + #endif +diff --git a/src/render/SDL_sysrender.h b/src/render/SDL_sysrender.h +index ac5426b676..d9b5bfbc39 100644 +--- a/src/render/SDL_sysrender.h ++++ b/src/render/SDL_sysrender.h +@@ -307,6 +307,7 @@ extern SDL_RenderDriver DirectFB_RenderDriver; + extern SDL_RenderDriver METAL_RenderDriver; + extern SDL_RenderDriver PS2_RenderDriver; + extern SDL_RenderDriver PSP_RenderDriver; ++extern SDL_RenderDriver PS4_RenderDriver; + extern SDL_RenderDriver SW_RenderDriver; + extern SDL_RenderDriver VITA_GXM_RenderDriver; + +diff --git a/src/thread/pthread/SDL_systhread.c b/src/thread/pthread/SDL_systhread.c +index 212fe9c000..a920afba0b 100644 +--- a/src/thread/pthread/SDL_systhread.c ++++ b/src/thread/pthread/SDL_systhread.c +@@ -29,8 +29,10 @@ + #include + #endif + ++#ifdef HAVE_SIGNAL_H + #include + #include ++#endif + + #ifdef __LINUX__ + #include +@@ -60,7 +62,7 @@ + #endif + + +-#ifndef __NACL__ ++#if !defined(__NACL__) && !defined(__OPENORBIS__) + /* List of signals to mask in the subthreads */ + static const int sig_list[] = { + SIGHUP, SIGINT, SIGQUIT, SIGPIPE, SIGALRM, SIGTERM, SIGCHLD, SIGWINCH, +@@ -162,7 +164,7 @@ void SDL_SYS_SetupThread(const char *name) + } + + /* NativeClient does not yet support signals.*/ +-#if !defined(__NACL__) ++#if !defined(__NACL__) && !defined(__OPENORBIS__) + /* Mask asynchronous signals for this thread */ + sigemptyset(&mask); + for (i = 0; sig_list[i]; ++i) { +diff --git a/src/video/SDL_sysvideo.h b/src/video/SDL_sysvideo.h +index badb1a3edc..e17beb9f5c 100644 +--- a/src/video/SDL_sysvideo.h ++++ b/src/video/SDL_sysvideo.h +@@ -471,6 +471,7 @@ extern VideoBootStrap PSP_bootstrap; + extern VideoBootStrap VITA_bootstrap; + extern VideoBootStrap RISCOS_bootstrap; + extern VideoBootStrap N3DS_bootstrap; ++extern VideoBootStrap PS4_bootstrap; + extern VideoBootStrap RPI_bootstrap; + extern VideoBootStrap KMSDRM_bootstrap; + extern VideoBootStrap KMSDRM_LEGACY_bootstrap; +diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c +index 134cc05e13..f40d6104e2 100644 +--- a/src/video/SDL_video.c ++++ b/src/video/SDL_video.c +@@ -121,6 +121,9 @@ static VideoBootStrap *bootstrap[] = { + #ifdef SDL_VIDEO_DRIVER_N3DS + &N3DS_bootstrap, + #endif ++#ifdef SDL_VIDEO_DRIVER_PS4 ++ &PS4_bootstrap, ++#endif + #ifdef SDL_VIDEO_DRIVER_KMSDRM + &KMSDRM_bootstrap, + #endif +@@ -241,6 +244,7 @@ static int SDL_CreateWindowTexture(SDL_VideoDevice *_this, SDL_Window *window, U + SDL_GetWindowSizeInPixels(window, &w, &h); + + if (!data) { ++ + SDL_Renderer *renderer = NULL; + const char *render_driver = NULL; + const char *hint; +@@ -297,7 +301,7 @@ static int SDL_CreateWindowTexture(SDL_VideoDevice *_this, SDL_Window *window, U + SDL_assert(renderer != NULL); /* should have explicitly checked this above. */ + + /* Create the data after we successfully create the renderer (bug #1116) */ +- data = (SDL_WindowTextureData *)SDL_calloc(1, sizeof(*data)); ++ data = (SDL_WindowTextureData *)SDL_calloc(1, sizeof(SDL_WindowTextureData)); + if (!data) { + SDL_DestroyRenderer(renderer); + return SDL_OutOfMemory(); From 33d140fa7b6d031d27470f80e90914d444d2050a Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 28 Jan 2026 19:51:50 +0000 Subject: [PATCH 58/78] fixup shit --- externals/CMakeLists.txt | 6 ++++-- src/core/device_memory.h | 16 +++++++++------- src/input_common/CMakeLists.txt | 2 +- src/yuzu_cmd/yuzu.cpp | 17 +---------------- 4 files changed, 15 insertions(+), 26 deletions(-) diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index 1c73f4671f..c324e35f73 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -263,8 +263,10 @@ target_include_directories(tz PUBLIC ./tz) add_library(bc_decoder bc_decoder/bc_decoder.cpp) target_include_directories(bc_decoder PUBLIC ./bc_decoder) -add_library(ps4sup ps4sup/emutls.c ps4sup/stub.cpp) -target_include_directories(ps4sup PUBLIC ./ps4sup) +if (PLATFORM_PS4) + add_library(ps4sup ps4sup/emutls.c ps4sup/stub.cpp) + target_include_directories(ps4sup PUBLIC ./ps4sup) +endif() if (NOT TARGET RenderDoc::API) add_library(renderdoc INTERFACE) diff --git a/src/core/device_memory.h b/src/core/device_memory.h index 29d2ff7a2b..11bf0e3268 100644 --- a/src/core/device_memory.h +++ b/src/core/device_memory.h @@ -1,6 +1,3 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -29,22 +26,27 @@ public: template Common::PhysicalAddress GetPhysicalAddr(const T* ptr) const { - return (uintptr_t(ptr) - uintptr_t(buffer.BackingBasePointer())) + DramMemoryMap::Base; + return (reinterpret_cast(ptr) - + reinterpret_cast(buffer.BackingBasePointer())) + + DramMemoryMap::Base; } template PAddr GetRawPhysicalAddr(const T* ptr) const { - return PAddr(uintptr_t(ptr) - uintptr_t(buffer.BackingBasePointer())); + return static_cast(reinterpret_cast(ptr) - + reinterpret_cast(buffer.BackingBasePointer())); } template T* GetPointer(Common::PhysicalAddress addr) { - return reinterpret_cast(buffer.BackingBasePointer() + (GetInteger(addr) - DramMemoryMap::Base)); + return reinterpret_cast(buffer.BackingBasePointer() + + (GetInteger(addr) - DramMemoryMap::Base)); } template const T* GetPointer(Common::PhysicalAddress addr) const { - return reinterpret_cast(buffer.BackingBasePointer() + (GetInteger(addr) - DramMemoryMap::Base)); + return reinterpret_cast(buffer.BackingBasePointer() + + (GetInteger(addr) - DramMemoryMap::Base)); } template diff --git a/src/input_common/CMakeLists.txt b/src/input_common/CMakeLists.txt index ef1308b1d0..c7c4b11800 100644 --- a/src/input_common/CMakeLists.txt +++ b/src/input_common/CMakeLists.txt @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later # SPDX-FileCopyrightText: 2018 yuzu Emulator Project diff --git a/src/yuzu_cmd/yuzu.cpp b/src/yuzu_cmd/yuzu.cpp index baba1c1d0a..368123d941 100644 --- a/src/yuzu_cmd/yuzu.cpp +++ b/src/yuzu_cmd/yuzu.cpp @@ -51,22 +51,7 @@ #include #endif -#ifdef __OPENORBIS__ -#include -#include -#include <__thread/support.h> -# define STUB_WEAK(name) extern "C" void name() { printf("called " #name); asm volatile("ud2"); } -extern "C" void __cxa_thread_atexit_impl() { - //printf("atexit called"); -} -STUB_WEAK(__assert) -STUB_WEAK(ZSTD_trace_compress_begin) -STUB_WEAK(ZSTD_trace_compress_end) -STUB_WEAK(ZSTD_trace_decompress_begin) -STUB_WEAK(ZSTD_trace_decompress_end) -FILE* __stderrp = stdout; -# undef STUB_WEAK -#elif defined(_WIN32) +#if defined(_WIN32) extern "C" { // tells Nvidia and AMD drivers to use the dedicated GPU by default on laptops with switchable // graphics From 1b429c4bbf8d5e76d24a878745759a646631f192 Mon Sep 17 00:00:00 2001 From: lizzie Date: Fri, 30 Jan 2026 10:01:26 +0000 Subject: [PATCH 59/78] fix --- .ci/ps4/build.sh | 2 ++ src/yuzu_cmd/yuzu.cpp | 4 ---- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.ci/ps4/build.sh b/.ci/ps4/build.sh index 2fdcd01c68..60e8359efd 100755 --- a/.ci/ps4/build.sh +++ b/.ci/ps4/build.sh @@ -3,6 +3,8 @@ # SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later +[ -z ${OO_PS4_TOOLCHAIN+x} ] && exit + [ -f "ps4-toolchain.cmake" ] || cat << EOF >"ps4-toolchain.cmake" set(CMAKE_SYSROOT "$OO_PS4_TOOLCHAIN") set(CMAKE_STAGING_PREFIX "$OO_PS4_TOOLCHAIN") diff --git a/src/yuzu_cmd/yuzu.cpp b/src/yuzu_cmd/yuzu.cpp index 368123d941..4d91a5d13d 100644 --- a/src/yuzu_cmd/yuzu.cpp +++ b/src/yuzu_cmd/yuzu.cpp @@ -435,10 +435,6 @@ int main(int argc, char** argv) { }; system.RegisterExitCallback(exit_fn); -#ifdef __linux__ - Common::Linux::StartGamemode(); -#endif - void(system.Run()); if (system.DebuggerEnabled()) { system.InitializeDebugger(); From 745a12b3d126e843ebf95216f715fb61e65fa1c4 Mon Sep 17 00:00:00 2001 From: lizzie Date: Fri, 30 Jan 2026 10:19:34 +0000 Subject: [PATCH 60/78] add hash --- externals/cpmfile.json | 1 + 1 file changed, 1 insertion(+) diff --git a/externals/cpmfile.json b/externals/cpmfile.json index 1071404e1c..a35a3db599 100644 --- a/externals/cpmfile.json +++ b/externals/cpmfile.json @@ -194,6 +194,7 @@ "package": "SDL2", "repo": "libsdl-org/SDL", "sha": "0c7042477a", + "hash": "91d897257fe1134e65234618a96bc8f4f9b61dd3ba42241a65c293cd406139e308a6c79eadfa7c3969271c88d73149e75c4310fff37c79387c80d9c982c1f322", "key": "ps4", "bundled": true, "skip_updates": true, From 58499f5fc12fae7763e043da2c723823dd5dd266 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 31 Jan 2026 12:34:57 +0000 Subject: [PATCH 61/78] force ankerl + fixup for OO with prelude commits --- .patch/xbyak/0001-macro-stl.patch | 21 +++++++++++++ .patch/xbyak_sun/0001-macro-stl.patch | 21 +++++++++++++ src/core/arm/dynarmic/arm_dynarmic_32.cpp | 2 +- src/core/arm/dynarmic/arm_dynarmic_64.cpp | 2 +- .../dynarmic/backend/x64/block_of_code.cpp | 31 ++++++++++++++----- 5 files changed, 68 insertions(+), 9 deletions(-) create mode 100644 .patch/xbyak/0001-macro-stl.patch create mode 100644 .patch/xbyak_sun/0001-macro-stl.patch diff --git a/.patch/xbyak/0001-macro-stl.patch b/.patch/xbyak/0001-macro-stl.patch new file mode 100644 index 0000000000..5cfb9eeec6 --- /dev/null +++ b/.patch/xbyak/0001-macro-stl.patch @@ -0,0 +1,21 @@ +diff --git a/xbyak/xbyak.h b/xbyak/xbyak.h +index ed7706a..51b520d 100644 +--- a/xbyak/xbyak.h ++++ b/xbyak/xbyak.h +@@ -37,6 +37,7 @@ + #define XBYAK_GNUC_PREREQ(major, minor) 0 + #endif + ++#if !defined(XBYAK_STD_UNORDERED_SET) + // This covers -std=(gnu|c)++(0x|11|1y), -stdlib=libc++, and modern Microsoft. + #if ((defined(_MSC_VER) && (_MSC_VER >= 1600)) || defined(_LIBCPP_VERSION) ||\ + ((__cplusplus >= 201103) || defined(__GXX_EXPERIMENTAL_CXX0X__))) +@@ -71,6 +72,8 @@ + #define XBYAK_STD_UNORDERED_MAP std::map + #define XBYAK_STD_UNORDERED_MULTIMAP std::multimap + #endif ++#endif ++ + #ifdef _WIN32 + #ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN diff --git a/.patch/xbyak_sun/0001-macro-stl.patch b/.patch/xbyak_sun/0001-macro-stl.patch new file mode 100644 index 0000000000..5cfb9eeec6 --- /dev/null +++ b/.patch/xbyak_sun/0001-macro-stl.patch @@ -0,0 +1,21 @@ +diff --git a/xbyak/xbyak.h b/xbyak/xbyak.h +index ed7706a..51b520d 100644 +--- a/xbyak/xbyak.h ++++ b/xbyak/xbyak.h +@@ -37,6 +37,7 @@ + #define XBYAK_GNUC_PREREQ(major, minor) 0 + #endif + ++#if !defined(XBYAK_STD_UNORDERED_SET) + // This covers -std=(gnu|c)++(0x|11|1y), -stdlib=libc++, and modern Microsoft. + #if ((defined(_MSC_VER) && (_MSC_VER >= 1600)) || defined(_LIBCPP_VERSION) ||\ + ((__cplusplus >= 201103) || defined(__GXX_EXPERIMENTAL_CXX0X__))) +@@ -71,6 +72,8 @@ + #define XBYAK_STD_UNORDERED_MAP std::map + #define XBYAK_STD_UNORDERED_MULTIMAP std::multimap + #endif ++#endif ++ + #ifdef _WIN32 + #ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index f41a2be482..a485ba9a78 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp @@ -203,7 +203,7 @@ void ArmDynarmic32::MakeJit(Common::PageTable* page_table) { // Code cache size #if defined(__OPENORBIS__) - config.code_cache_size = std::uint32_t(8_MiB); + config.code_cache_size = std::uint32_t(32_MiB); #elif defined(ARCHITECTURE_arm64) || defined(__sun__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) config.code_cache_size = std::uint32_t(128_MiB); #else diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index 4da2c2b211..bfd531dabc 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp @@ -255,7 +255,7 @@ void ArmDynarmic64::MakeJit(Common::PageTable* page_table, std::size_t address_s // Code cache size #if defined(__OPENORBIS__) - config.code_cache_size = std::uint32_t(8_MiB); + config.code_cache_size = std::uint32_t(32_MiB); #elif defined(ARCHITECTURE_arm64) || defined(__sun__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) config.code_cache_size = std::uint32_t(128_MiB); #else diff --git a/src/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp b/src/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp index 3388760024..39e39577e9 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp @@ -58,8 +58,13 @@ const std::array BlockOfCode::ABI_PARAMS = {Block namespace { +#ifdef __OPENORBIS__ +constexpr size_t CONSTANT_POOL_SIZE = 8 * 4096; +constexpr size_t PRELUDE_COMMIT_SIZE = 8 * 4096; +#else constexpr size_t CONSTANT_POOL_SIZE = 2 * 1024 * 1024; constexpr size_t PRELUDE_COMMIT_SIZE = 16 * 1024 * 1024; +#endif class CustomXbyakAllocator : public Xbyak::Allocator { public: @@ -67,8 +72,12 @@ public: uint8_t* alloc(size_t size) override { void* p = VirtualAlloc(nullptr, size, MEM_RESERVE, PAGE_READWRITE); if (p == nullptr) { +#ifndef XBYAK_NO_EXCEPTION using Xbyak::Error; XBYAK_THROW(Xbyak::ERR_CANT_ALLOC); +#else + std::abort(); +#endif } return static_cast(p); } @@ -106,8 +115,12 @@ public: #endif void* p = mmap(nullptr, size, prot, mode, -1, 0); if (p == MAP_FAILED) { +#ifndef XBYAK_NO_EXCEPTION using Xbyak::Error; XBYAK_THROW(Xbyak::ERR_CANT_ALLOC); +#else + std::abort(); +#endif } std::memcpy(p, &size, sizeof(size_t)); return static_cast(p) + DYNARMIC_PAGE_SIZE; @@ -233,14 +246,14 @@ bool IsUnderRosetta() { } // anonymous namespace -#ifdef DYNARMIC_ENABLE_NO_EXECUTE_SUPPORT -static const auto default_cg_mode = Xbyak::DontSetProtectRWE; -#else -static const auto default_cg_mode = nullptr; //Allow RWE -#endif - BlockOfCode::BlockOfCode(RunCodeCallbacks cb, JitStateInfo jsi, size_t total_code_size, std::function rcp) noexcept - : Xbyak::CodeGenerator(total_code_size, default_cg_mode, &s_allocator) +#ifdef __OPENORBIS__ + : Xbyak::CodeGenerator(total_code_size, Xbyak::AutoGrow, &s_allocator) +#elif defined(DYNARMIC_ENABLE_NO_EXECUTE_SUPPORT) + : Xbyak::CodeGenerator(total_code_size, Xbyak::DontSetProtectRWE, &s_allocator) +#else + : Xbyak::CodeGenerator(total_code_size, nullptr, &s_allocator) +#endif , cb(std::move(cb)) , jsi(jsi) , constant_pool(*this, CONSTANT_POOL_SIZE) @@ -533,8 +546,12 @@ size_t BlockOfCode::GetTotalCodeSize() const { void* BlockOfCode::AllocateFromCodeSpace(size_t alloc_size) { if (size_ + alloc_size >= maxSize_) { +#ifndef XBYAK_NO_EXCEPTION using Xbyak::Error; XBYAK_THROW(Xbyak::ERR_CODE_IS_TOO_BIG); +#else + std::abort(); +#endif } EnsureMemoryCommitted(alloc_size); From 75588f640627950e453fd466738b1acb3deaf414 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sun, 1 Feb 2026 03:39:22 +0000 Subject: [PATCH 62/78] use dmem for swap buffers, restore full jit sizes --- src/common/virtual_buffer.cpp | 12 +++++++++--- src/core/arm/dynarmic/arm_dynarmic_32.cpp | 2 +- src/core/arm/dynarmic/arm_dynarmic_64.cpp | 2 +- .../src/dynarmic/backend/x64/block_of_code.cpp | 9 +-------- 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/common/virtual_buffer.cpp b/src/common/virtual_buffer.cpp index 48f26ec298..bd647b0acf 100644 --- a/src/common/virtual_buffer.cpp +++ b/src/common/virtual_buffer.cpp @@ -16,6 +16,7 @@ #include #include #include +#include typedef void (*SceKernelExceptionHandler)(int32_t, void*); extern "C" int32_t sceKernelInstallExceptionHandler(int32_t signum, SceKernelExceptionHandler handler); #endif @@ -143,8 +144,13 @@ void* AllocateMemoryPages(std::size_t size) noexcept { #elif defined(__OPENORBIS__) void* addr; if (size <= 8192 * 4096) { - addr = malloc(size); - LOG_WARNING(HW_Memory, "Using DMem for {} bytes area @ {}", size, addr); + size_t align = 16384; + size_t len = (size + align - 1) / align * align; + off_t offset = 0; + ASSERT(sceKernelAllocateDirectMemory(0, ORBIS_KERNEL_MAIN_DMEM_SIZE, len, align, ORBIS_KERNEL_WB_ONION, &offset) == 0); + ASSERT(sceKernelMapDirectMemory(&addr, len, ORBIS_KERNEL_PROT_CPU_RW, 0, offset, len) == 0); + ASSERT(sceKernelMprotect(addr, len, VM_PROT_ALL) == 0); + LOG_WARNING(HW_Memory, "Using DMem for {} bytes area @ {}", len, addr); ASSERT(addr != nullptr); } else { addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_VOID | MAP_PRIVATE, -1, 0); @@ -166,7 +172,7 @@ void FreeMemoryPages(void* addr, [[maybe_unused]] std::size_t size) noexcept { VirtualFree(addr, 0, MEM_RELEASE); #elif defined(__OPENORBIS__) if (size <= 8192 * 4096) { - free(addr); + sceKernelCheckedReleaseDirectMemory(off_t(addr), size_t(size)); } else { int rc = munmap(addr, size); ASSERT(rc == 0); diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index a485ba9a78..679b733d77 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp @@ -203,7 +203,7 @@ void ArmDynarmic32::MakeJit(Common::PageTable* page_table) { // Code cache size #if defined(__OPENORBIS__) - config.code_cache_size = std::uint32_t(32_MiB); + config.code_cache_size = std::uint32_t(128_MiB); #elif defined(ARCHITECTURE_arm64) || defined(__sun__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) config.code_cache_size = std::uint32_t(128_MiB); #else diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index bfd531dabc..4c3cf62d54 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp @@ -255,7 +255,7 @@ void ArmDynarmic64::MakeJit(Common::PageTable* page_table, std::size_t address_s // Code cache size #if defined(__OPENORBIS__) - config.code_cache_size = std::uint32_t(32_MiB); + config.code_cache_size = std::uint32_t(128_MiB); #elif defined(ARCHITECTURE_arm64) || defined(__sun__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) config.code_cache_size = std::uint32_t(128_MiB); #else diff --git a/src/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp b/src/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp index 39e39577e9..9b0e44b19f 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp @@ -58,13 +58,8 @@ const std::array BlockOfCode::ABI_PARAMS = {Block namespace { -#ifdef __OPENORBIS__ -constexpr size_t CONSTANT_POOL_SIZE = 8 * 4096; -constexpr size_t PRELUDE_COMMIT_SIZE = 8 * 4096; -#else constexpr size_t CONSTANT_POOL_SIZE = 2 * 1024 * 1024; constexpr size_t PRELUDE_COMMIT_SIZE = 16 * 1024 * 1024; -#endif class CustomXbyakAllocator : public Xbyak::Allocator { public: @@ -247,9 +242,7 @@ bool IsUnderRosetta() { } // anonymous namespace BlockOfCode::BlockOfCode(RunCodeCallbacks cb, JitStateInfo jsi, size_t total_code_size, std::function rcp) noexcept -#ifdef __OPENORBIS__ - : Xbyak::CodeGenerator(total_code_size, Xbyak::AutoGrow, &s_allocator) -#elif defined(DYNARMIC_ENABLE_NO_EXECUTE_SUPPORT) +#if defined(DYNARMIC_ENABLE_NO_EXECUTE_SUPPORT) : Xbyak::CodeGenerator(total_code_size, Xbyak::DontSetProtectRWE, &s_allocator) #else : Xbyak::CodeGenerator(total_code_size, nullptr, &s_allocator) From b041c6824f0ca49ea2146283395f4a8c09e97235 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sun, 1 Feb 2026 03:39:53 +0000 Subject: [PATCH 63/78] fix yuzu cpp --- src/yuzu_cmd/yuzu.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/yuzu_cmd/yuzu.cpp b/src/yuzu_cmd/yuzu.cpp index 4d91a5d13d..ff6d36440c 100644 --- a/src/yuzu_cmd/yuzu.cpp +++ b/src/yuzu_cmd/yuzu.cpp @@ -51,7 +51,10 @@ #include #endif -#if defined(_WIN32) +#if defined(__OPENORBIS__) +#include +#include +#elif defined(_WIN32) extern "C" { // tells Nvidia and AMD drivers to use the dedicated GPU by default on laptops with switchable // graphics From 53c55ecc498968ae1447e2c8b40447ffa68b401e Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 2 Feb 2026 07:30:19 +0000 Subject: [PATCH 64/78] reduce fiber sizes --- src/common/fiber.cpp | 2 +- src/core/arm/dynarmic/arm_dynarmic_32.cpp | 2 +- src/core/arm/dynarmic/arm_dynarmic_64.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/common/fiber.cpp b/src/common/fiber.cpp index 0c9bd4fb4d..4f3dad7e88 100644 --- a/src/common/fiber.cpp +++ b/src/common/fiber.cpp @@ -16,7 +16,7 @@ namespace Common { #ifdef __OPENORBIS__ -constexpr size_t DEFAULT_STACK_SIZE = 256 * 4096; +constexpr size_t DEFAULT_STACK_SIZE = 32 * 4096; #else constexpr size_t DEFAULT_STACK_SIZE = 512 * 4096; #endif diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index 679b733d77..f41a2be482 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp @@ -203,7 +203,7 @@ void ArmDynarmic32::MakeJit(Common::PageTable* page_table) { // Code cache size #if defined(__OPENORBIS__) - config.code_cache_size = std::uint32_t(128_MiB); + config.code_cache_size = std::uint32_t(8_MiB); #elif defined(ARCHITECTURE_arm64) || defined(__sun__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) config.code_cache_size = std::uint32_t(128_MiB); #else diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index 4c3cf62d54..4da2c2b211 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp @@ -255,7 +255,7 @@ void ArmDynarmic64::MakeJit(Common::PageTable* page_table, std::size_t address_s // Code cache size #if defined(__OPENORBIS__) - config.code_cache_size = std::uint32_t(128_MiB); + config.code_cache_size = std::uint32_t(8_MiB); #elif defined(ARCHITECTURE_arm64) || defined(__sun__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) config.code_cache_size = std::uint32_t(128_MiB); #else From 1eb9404421ae759238777b1fba0638c58106595f Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 2 Feb 2026 11:43:45 +0000 Subject: [PATCH 65/78] use btver2 --- .ci/ps4/build.sh | 6 ++++-- src/common/host_memory.cpp | 4 +--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.ci/ps4/build.sh b/.ci/ps4/build.sh index 60e8359efd..cec9876dcd 100755 --- a/.ci/ps4/build.sh +++ b/.ci/ps4/build.sh @@ -10,8 +10,8 @@ set(CMAKE_SYSROOT "$OO_PS4_TOOLCHAIN") set(CMAKE_STAGING_PREFIX "$OO_PS4_TOOLCHAIN") set(CMAKE_SYSTEM_NAME "OpenOrbis") -set(CMAKE_C_FLAGS " -D__OPENORBIS__ -D_LIBCPP_HAS_MUSL_LIBC=1 -D_GNU_SOURCE=1 --target=x86_64-pc-freebsd12-elf -mtune=x86-64 -march=x86-64 -fPIC -funwind-tables") -set(CMAKE_CXX_FLAGS " -D__OPENORBIS__ -D_LIBCPP_HAS_MUSL_LIBC=1 -D_GNU_SOURCE=1 --target=x86_64-pc-freebsd12-elf -mtune=x86-64 -march=x86-64 -fPIC -funwind-tables") +set(CMAKE_C_FLAGS " -D__OPENORBIS__ -D_LIBCPP_HAS_MUSL_LIBC=1 -D_GNU_SOURCE=1 --target=x86_64-pc-freebsd12-elf -mtune=btver2 -march=btver2 -fPIC -funwind-tables") +set(CMAKE_CXX_FLAGS " -D__OPENORBIS__ -D_LIBCPP_HAS_MUSL_LIBC=1 -D_GNU_SOURCE=1 --target=x86_64-pc-freebsd12-elf -mtune=btver2 -march=btver2 -fPIC -funwind-tables") set(CMAKE_EXE_LINKER_FLAGS "-m elf_x86_64 -pie -T $OO_PS4_TOOLCHAIN/link.x --eh-frame-hdr -L$OO_PS4_TOOLCHAIN/lib") set(CMAKE_C_LINK_FLAGS "-m elf_x86_64 -pie -T $OO_PS4_TOOLCHAIN/link.x --eh-frame-hdr -L$OO_PS4_TOOLCHAIN/lib") @@ -59,3 +59,5 @@ cmake -S . -B build -G "Unix Makefiles" \ -DYUZU_USE_EXTERNAL_SDL2=ON \ "${EXTRA_CMAKE_FLAGS[@]}" || exit cmake --build build -t yuzu-cmd_pkg -- -j$NPROC +#cmake --build build -t dynarmic_tests_pkg -- -j$NPROC +#cmake --build build -t testps4_pkg -- -j$NPROC diff --git a/src/common/host_memory.cpp b/src/common/host_memory.cpp index ce28b36527..6de3e64474 100644 --- a/src/common/host_memory.cpp +++ b/src/common/host_memory.cpp @@ -499,9 +499,7 @@ class HostMemory::Impl { public: explicit Impl(size_t backing_size_, size_t virtual_size_) : backing_size{backing_size_}, virtual_size{virtual_size_} { -#ifdef __OPENORBIS__ - -#else +#if !defined(__OPENORBIS__) && !defined(__APPLE__) long page_size = sysconf(_SC_PAGESIZE); ASSERT_MSG(page_size == 0x1000, "page size {:#x} is incompatible with 4K paging", page_size); #endif From c6df1670a5a38b318ca3d44574e0ffaf5aba4932 Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 2 Feb 2026 12:55:01 +0000 Subject: [PATCH 66/78] immediately terminate in OO, use 2MB swap handler --- src/common/virtual_buffer.cpp | 3 +-- src/core/arm/dynarmic/arm_dynarmic_32.cpp | 4 ---- src/core/arm/dynarmic/arm_dynarmic_64.cpp | 4 ---- 3 files changed, 1 insertion(+), 10 deletions(-) diff --git a/src/common/virtual_buffer.cpp b/src/common/virtual_buffer.cpp index bd647b0acf..409f3efefa 100644 --- a/src/common/virtual_buffer.cpp +++ b/src/common/virtual_buffer.cpp @@ -114,7 +114,7 @@ static void SwapHandler(int sig, void* raw_context) { if (auto const it = std::ranges::find_if(swap_regions, [addr = mctx.mc_addr](auto const& e) { return uintptr_t(addr) >= uintptr_t(e.first) && uintptr_t(addr) < uintptr_t(e.first) + e.second; }); it != swap_regions.end()) { - size_t const page_size = 4096 * 8; //16K + size_t const page_size = 0x200000; //2M size_t const page_mask = ~(page_size - 1); // should replace the existing mapping... ugh void* aligned_addr = reinterpret_cast(uintptr_t(mctx.mc_addr) & page_mask); @@ -149,7 +149,6 @@ void* AllocateMemoryPages(std::size_t size) noexcept { off_t offset = 0; ASSERT(sceKernelAllocateDirectMemory(0, ORBIS_KERNEL_MAIN_DMEM_SIZE, len, align, ORBIS_KERNEL_WB_ONION, &offset) == 0); ASSERT(sceKernelMapDirectMemory(&addr, len, ORBIS_KERNEL_PROT_CPU_RW, 0, offset, len) == 0); - ASSERT(sceKernelMprotect(addr, len, VM_PROT_ALL) == 0); LOG_WARNING(HW_Memory, "Using DMem for {} bytes area @ {}", len, addr); ASSERT(addr != nullptr); } else { diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index f41a2be482..5f082e38bf 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp @@ -306,10 +306,6 @@ void ArmDynarmic32::MakeJit(Common::PageTable* page_table) { default: break; } -#ifdef __OPENORBIS__ - config.unsafe_optimizations = false; - config.optimizations = Dynarmic::no_optimizations; -#endif m_jit.emplace(config); } diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index 4da2c2b211..0842f439b8 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp @@ -357,10 +357,6 @@ void ArmDynarmic64::MakeJit(Common::PageTable* page_table, std::size_t address_s default: break; } -#ifdef __OPENORBIS__ - config.unsafe_optimizations = false; - config.optimizations = Dynarmic::no_optimizations; -#endif m_jit.emplace(config); } From d5af8b5072702414260bbe32c820eeac6060aa26 Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 2 Feb 2026 23:11:31 +0000 Subject: [PATCH 67/78] restore protection --- src/common/virtual_buffer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/common/virtual_buffer.cpp b/src/common/virtual_buffer.cpp index 409f3efefa..cd269cb997 100644 --- a/src/common/virtual_buffer.cpp +++ b/src/common/virtual_buffer.cpp @@ -149,6 +149,7 @@ void* AllocateMemoryPages(std::size_t size) noexcept { off_t offset = 0; ASSERT(sceKernelAllocateDirectMemory(0, ORBIS_KERNEL_MAIN_DMEM_SIZE, len, align, ORBIS_KERNEL_WB_ONION, &offset) == 0); ASSERT(sceKernelMapDirectMemory(&addr, len, ORBIS_KERNEL_PROT_CPU_RW, 0, offset, len) == 0); + ASSERT(sceKernelMprotect(addr, len, VM_PROT_ALL) == 0); LOG_WARNING(HW_Memory, "Using DMem for {} bytes area @ {}", len, addr); ASSERT(addr != nullptr); } else { From 95b05d1dcab42998e0a530d8b428dab420a27a4a Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 2 Feb 2026 23:12:17 +0000 Subject: [PATCH 68/78] leave pending param package stuff --- src/common/param_package.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/common/param_package.cpp b/src/common/param_package.cpp index 629babb811..972b1c1f5f 100644 --- a/src/common/param_package.cpp +++ b/src/common/param_package.cpp @@ -75,7 +75,9 @@ std::string ParamPackage::Serialize() const { std::string ParamPackage::Get(const std::string& key, const std::string& default_value) const { auto pair = data.find(key); if (pair == data.end()) { +#ifndef __OPENORBIS__ LOG_TRACE(Common, "key '{}' not found", key); +#endif return default_value; } @@ -85,7 +87,9 @@ std::string ParamPackage::Get(const std::string& key, const std::string& default int ParamPackage::Get(const std::string& key, int default_value) const { auto pair = data.find(key); if (pair == data.end()) { +#ifndef __OPENORBIS__ LOG_TRACE(Common, "key '{}' not found", key); +#endif return default_value; } @@ -100,7 +104,9 @@ int ParamPackage::Get(const std::string& key, int default_value) const { float ParamPackage::Get(const std::string& key, float default_value) const { auto pair = data.find(key); if (pair == data.end()) { +#ifndef __OPENORBIS__ LOG_TRACE(Common, "key {} not found", key); +#endif return default_value; } From 0d4a402bbe0077fa856a207aae001242d63d0711 Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 2 Feb 2026 23:14:39 +0000 Subject: [PATCH 69/78] let it rip --- src/common/param_package.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/common/param_package.cpp b/src/common/param_package.cpp index 972b1c1f5f..629babb811 100644 --- a/src/common/param_package.cpp +++ b/src/common/param_package.cpp @@ -75,9 +75,7 @@ std::string ParamPackage::Serialize() const { std::string ParamPackage::Get(const std::string& key, const std::string& default_value) const { auto pair = data.find(key); if (pair == data.end()) { -#ifndef __OPENORBIS__ LOG_TRACE(Common, "key '{}' not found", key); -#endif return default_value; } @@ -87,9 +85,7 @@ std::string ParamPackage::Get(const std::string& key, const std::string& default int ParamPackage::Get(const std::string& key, int default_value) const { auto pair = data.find(key); if (pair == data.end()) { -#ifndef __OPENORBIS__ LOG_TRACE(Common, "key '{}' not found", key); -#endif return default_value; } @@ -104,9 +100,7 @@ int ParamPackage::Get(const std::string& key, int default_value) const { float ParamPackage::Get(const std::string& key, float default_value) const { auto pair = data.find(key); if (pair == data.end()) { -#ifndef __OPENORBIS__ LOG_TRACE(Common, "key {} not found", key); -#endif return default_value; } From 1eb481975f294ffd63cd210d3a333aef0bfcd81d Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 18 Feb 2026 19:49:28 +0000 Subject: [PATCH 70/78] FX --- src/input_common/drivers/sdl_driver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/input_common/drivers/sdl_driver.cpp b/src/input_common/drivers/sdl_driver.cpp index 6fc2f47f6a..81b0a2313a 100644 --- a/src/input_common/drivers/sdl_driver.cpp +++ b/src/input_common/drivers/sdl_driver.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2018 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later From 79e0f98a0c6b37e2c101094149b57cf284db4982 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 25 Feb 2026 15:25:16 +0000 Subject: [PATCH 71/78] disable stdio buffering --- src/yuzu_cmd/yuzu.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/yuzu_cmd/yuzu.cpp b/src/yuzu_cmd/yuzu.cpp index ff6d36440c..d0bdd1078c 100644 --- a/src/yuzu_cmd/yuzu.cpp +++ b/src/yuzu_cmd/yuzu.cpp @@ -185,6 +185,11 @@ int main(int argc, char** argv) { freopen("CONOUT$", "wb", stderr); } #endif +#ifdef __OPENORBIS__ + // May prevent spurious crashes on swap handlers... + setvbuf(stdout, nullptr, _IONBF, 0); + setvbuf(stderr, nullptr, _IONBF, 0); +#endif Common::Log::Initialize(); Common::Log::SetColorConsoleBackendEnabled(true); From e962499d4d26ac4ff23011e75c5bef3ca6155b44 Mon Sep 17 00:00:00 2001 From: lizzie Date: Thu, 26 Feb 2026 01:07:06 +0000 Subject: [PATCH 72/78] fix openssl --- .ci/ps4/build.sh | 4 ++++ externals/ps4sup/stub.cpp | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/.ci/ps4/build.sh b/.ci/ps4/build.sh index cec9876dcd..c7bb54deaa 100755 --- a/.ci/ps4/build.sh +++ b/.ci/ps4/build.sh @@ -52,6 +52,10 @@ cmake -S . -B build -G "Unix Makefiles" \ -DENABLE_WEB_SERVICE=OFF \ -DUSE_DISCORD_PRESENCE=OFF \ -DCPMUTIL_FORCE_BUNDLED=ON \ + -DOPENSSL_ROOT_DIR="$OO_PS4_TOOLCHAIN" \ + -DOPENSSL_SSL_LIBRARY="$OO_PS4_TOOLCHAIN/lib/libssl.a" \ + -DOPENSSL_CRYPTO_LIBRARY="$OO_PS4_TOOLCHAIN/lib/libcrypto.a" \ + -DOPENSSL_INCLUDE_DIR="$OO_PS4_TOOLCHAIN/include/openssl" \ -DYUZU_USE_EXTERNAL_FFMPEG=ON \ -DYUZU_USE_CPM=ON \ -DDYNARMIC_ENABLE_NO_EXECUTE_SUPPORT=OFF \ diff --git a/externals/ps4sup/stub.cpp b/externals/ps4sup/stub.cpp index bee5613486..562fbd4a38 100644 --- a/externals/ps4sup/stub.cpp +++ b/externals/ps4sup/stub.cpp @@ -16,7 +16,17 @@ STUB_WEAK(ZSTD_trace_compress_begin) STUB_WEAK(ZSTD_trace_compress_end) STUB_WEAK(ZSTD_trace_decompress_begin) STUB_WEAK(ZSTD_trace_decompress_end) + FILE* __stderrp = stdout; +FILE* __stdinp = stdin; + +extern "C" { +struct _RuneLocale; +thread_local const _RuneLocale *_ThreadRuneLocale = NULL; +const _RuneLocale *_CurrentRuneLocale = NULL; +int __isthreaded = 0; +int __mb_sb_limit = 0; +} #undef STUB_WEAK From 0b77edc8b66c1694670f9548ca79a53613df19e3 Mon Sep 17 00:00:00 2001 From: lizzie Date: Thu, 5 Mar 2026 22:01:58 +0000 Subject: [PATCH 73/78] fix virtual buffers --- src/common/virtual_buffer.cpp | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/src/common/virtual_buffer.cpp b/src/common/virtual_buffer.cpp index cd269cb997..8acb75fc57 100644 --- a/src/common/virtual_buffer.cpp +++ b/src/common/virtual_buffer.cpp @@ -142,17 +142,32 @@ void* AllocateMemoryPages(std::size_t size) noexcept { void* addr = VirtualAlloc(nullptr, size, MEM_COMMIT, PAGE_READWRITE); ASSERT(addr != nullptr); #elif defined(__OPENORBIS__) - void* addr; + bool use_void_mem = true; + void* addr = nullptr; if (size <= 8192 * 4096) { size_t align = 16384; - size_t len = (size + align - 1) / align * align; - off_t offset = 0; - ASSERT(sceKernelAllocateDirectMemory(0, ORBIS_KERNEL_MAIN_DMEM_SIZE, len, align, ORBIS_KERNEL_WB_ONION, &offset) == 0); - ASSERT(sceKernelMapDirectMemory(&addr, len, ORBIS_KERNEL_PROT_CPU_RW, 0, offset, len) == 0); - ASSERT(sceKernelMprotect(addr, len, VM_PROT_ALL) == 0); - LOG_WARNING(HW_Memory, "Using DMem for {} bytes area @ {}", len, addr); - ASSERT(addr != nullptr); - } else { + off_t offset; + int32_t res; + size = (size + align - 1) / align * align; + if ((res = sceKernelAllocateDirectMemory(0, ORBIS_KERNEL_MAIN_DMEM_SIZE, size, align, ORBIS_KERNEL_WB_ONION, &offset)) == 0) { + if ((res = sceKernelMapDirectMemory(&addr, size, ORBIS_KERNEL_PROT_CPU_READ | ORBIS_KERNEL_PROT_CPU_WRITE, 0, offset, size)) == 0) { + if ((res = sceKernelMprotect(addr, size, VM_PROT_ALL)) == 0 && addr != nullptr) { + LOG_WARNING(HW_Memory, "Using DMem for {} bytes area @ {}", size, addr); + use_void_mem = false; //Memory properly mapped + } else { + sceKernelReleaseDirectMemory(offset, size); + LOG_ERROR(HW_Memory, "{} = sceKernelMprotect({}, {})", res, offset, size); + } + } else { + sceKernelReleaseDirectMemory(offset, size); + LOG_ERROR(HW_Memory, "{} = sceKernelMapDirectMemory({}, {})", res, offset, size); + } + } else { + sceKernelReleaseDirectMemory(offset, size); + LOG_ERROR(HW_Memory, "{} = sceKernelAllocateDirectMemory({}, {}, {})", res, size, align, offset); + } + } + if (use_void_mem) { addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_VOID | MAP_PRIVATE, -1, 0); LOG_WARNING(HW_Memory, "Using VoidMem for {} bytes area @ {}", size, addr); ASSERT(addr != MAP_FAILED); From 387c5431212e7b2a8543992dbd8dd0a5c70ef724 Mon Sep 17 00:00:00 2001 From: lizzie Date: Fri, 6 Mar 2026 20:22:37 +0000 Subject: [PATCH 74/78] init audio --- src/yuzu_cmd/yuzu.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/yuzu_cmd/yuzu.cpp b/src/yuzu_cmd/yuzu.cpp index d0bdd1078c..9e0f2bd57a 100644 --- a/src/yuzu_cmd/yuzu.cpp +++ b/src/yuzu_cmd/yuzu.cpp @@ -16,6 +16,7 @@ #include "common/logging/log.h" #include "common/scm_rev.h" #include "common/settings.h" +#include "common/settings_enums.h" #include "common/string_util.h" #include "core/core.h" #include "core/core_timing.h" @@ -54,6 +55,8 @@ #if defined(__OPENORBIS__) #include #include +#include +#include #elif defined(_WIN32) extern "C" { // tells Nvidia and AMD drivers to use the dedicated GPU by default on laptops with switchable From 8275903b65d2fc01fa9af554aba43d012ce16626 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 7 Mar 2026 18:51:58 +0000 Subject: [PATCH 75/78] fix invalid esc symbosl on logs --- src/common/logging/text_formatter.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/common/logging/text_formatter.cpp b/src/common/logging/text_formatter.cpp index dee1f770bc..3a0e69e79d 100644 --- a/src/common/logging/text_formatter.cpp +++ b/src/common/logging/text_formatter.cpp @@ -41,6 +41,9 @@ static void PrintMessage(const Entry& entry) noexcept { #ifdef _WIN32 auto const str = FormatLogMessage(entry).append(1, '\n'); fwrite(str.c_str(), 1, str.size(), stderr); +#elif defined(__OPENORBIS__) + auto const str = FormatLogMessage(entry).append(1, '\n'); + fwrite(str.c_str(), 1, str.size(), stderr); #else #define ESC "\x1b" auto const color_str = [&entry]() -> const char* { From ad8d6de8bca09585d8cbcdee37d9303574e95aa2 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 7 Mar 2026 21:07:14 +0000 Subject: [PATCH 76/78] native ps4 audio sink --- src/audio_core/CMakeLists.txt | 6 ++ src/audio_core/sink/ps4_sink.cpp | 156 +++++++++++++++++++++++++++ src/audio_core/sink/ps4_sink.h | 43 ++++++++ src/audio_core/sink/sink_details.cpp | 17 ++- src/common/settings_enums.h | 3 +- src/core/hle/service/services.cpp | 2 +- 6 files changed, 224 insertions(+), 3 deletions(-) create mode 100644 src/audio_core/sink/ps4_sink.cpp create mode 100644 src/audio_core/sink/ps4_sink.h diff --git a/src/audio_core/CMakeLists.txt b/src/audio_core/CMakeLists.txt index 22106fc74d..3a3f937107 100644 --- a/src/audio_core/CMakeLists.txt +++ b/src/audio_core/CMakeLists.txt @@ -256,4 +256,10 @@ else() target_compile_definitions(audio_core PRIVATE HAVE_SDL2) endif() +if(PLATFORM_PS4) + target_sources(audio_core PRIVATE + sink/ps4_sink.cpp + sink/ps4_sink.h) +endif() + create_target_directory_groups(audio_core) diff --git a/src/audio_core/sink/ps4_sink.cpp b/src/audio_core/sink/ps4_sink.cpp new file mode 100644 index 0000000000..42b151f49f --- /dev/null +++ b/src/audio_core/sink/ps4_sink.cpp @@ -0,0 +1,156 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include +#include +#include + +#include + +#include "audio_core/common/common.h" +#include "audio_core/sink/ps4_sink.h" +#include "audio_core/sink/sink_stream.h" +#include "common/logging/log.h" +#include "common/scope_exit.h" +#include "core/core.h" + +namespace AudioCore::Sink { + +/// @brief PS4 sink stream, responsible for sinking samples to hardware. +struct PS4SinkStream final : public SinkStream { + /// @brief Create a new sink stream. + /// @param device_channels_ - Number of channels supported by the hardware. + /// @param system_channels_ - Number of channels the audio systems expect. + /// @param output_device - Name of the output device to use for this stream. + /// @param input_device - Name of the input device to use for this stream. + /// @param type_ - Type of this stream. + /// @param system_ - Core system. + /// @param event - Event used only for audio renderer, signalled on buffer consume. + PS4SinkStream(u32 device_channels_, u32 system_channels_, const std::string& output_device, const std::string& input_device, StreamType type_, Core::System& system_) + : SinkStream{system_, type_} + { + system_channels = system_channels_; + device_channels = device_channels_; + + auto const length = 0x800; + auto const sample_rate = 48000; + auto const num_channels = this->GetDeviceChannels(); + output_buffer.resize(length * num_channels * sizeof(s16)); + + auto const param_type = num_channels == 1 ? ORBIS_AUDIO_OUT_PARAM_FORMAT_S16_MONO : ORBIS_AUDIO_OUT_PARAM_FORMAT_S16_STEREO; + audio_dev = sceAudioOutOpen(ORBIS_USER_SERVICE_USER_ID_SYSTEM, ORBIS_AUDIO_OUT_PORT_TYPE_MAIN, 0, length, sample_rate, param_type); + if (audio_dev > 0) { + audio_thread = std::jthread([=, this](std::stop_token stop_token) { + while (!stop_token.stop_requested()) { + if (this->type == StreamType::In) { + // this->ProcessAudioIn(input_buffer, length); + } else { + sceAudioOutOutput(audio_dev, nullptr); + this->ProcessAudioOutAndRender(output_buffer, length); + sceAudioOutOutput(audio_dev, output_buffer.data()); + } + } + }); + } else { + LOG_ERROR(Service_Audio, "Failed to create audio device! {:#x}", uint32_t(audio_dev)); + } + } + + ~PS4SinkStream() override { + LOG_DEBUG(Service_Audio, "Destroying PS4 stream {}", name); + sceAudioOutClose(audio_dev); + if (audio_thread.joinable()) { + audio_thread.request_stop(); + audio_thread.join(); + } + } + + void Finalize() override { + if (audio_dev > 0) { + Stop(); + sceAudioOutClose(audio_dev); + } + } + + void Start(bool resume = false) override { + if (audio_dev > 0 && paused) { + paused = false; + } + } + + void Stop() override { + if (audio_dev > 0 && !paused) { + + } + } + + std::vector output_buffer; + std::jthread audio_thread; + int32_t audio_dev{}; +}; + +PS4Sink::PS4Sink(std::string_view target_device_name) { + int32_t rc = sceAudioOutInit(); + if (rc == 0 || unsigned(rc) == ORBIS_AUDIO_OUT_ERROR_ALREADY_INIT) { + if (target_device_name != auto_device_name && !target_device_name.empty()) { + output_device = target_device_name; + } else { + output_device.clear(); + } + device_channels = 2; + } else { + LOG_ERROR(Service_Audio, "Unable to open audio out! {:#x}", uint32_t(rc)); + } +} + +PS4Sink::~PS4Sink() = default; + +/// @brief Create a new sink stream. +/// @param system - Core system. +/// @param system_channels - Number of channels the audio system expects. May differ from the device's channel count. +/// @param name - Name of this stream. +/// @param type - Type of this stream, render/in/out. +/// @return A pointer to the created SinkStream +SinkStream* PS4Sink::AcquireSinkStream(Core::System& system, u32 system_channels_, const std::string&, StreamType type) { + system_channels = system_channels_; + SinkStreamPtr& stream = sink_streams.emplace_back(std::make_unique(device_channels, system_channels, output_device, input_device, type, system)); + return stream.get(); +} + +void PS4Sink::CloseStream(SinkStream* stream) { + for (size_t i = 0; i < sink_streams.size(); i++) { + if (sink_streams[i].get() == stream) { + sink_streams[i].reset(); + sink_streams.erase(sink_streams.begin() + i); + break; + } + } +} + +void PS4Sink::CloseStreams() { + sink_streams.clear(); +} + +f32 PS4Sink::GetDeviceVolume() const { + return sink_streams.size() > 0 ? sink_streams[0]->GetDeviceVolume() : 1.f; +} + +void PS4Sink::SetDeviceVolume(f32 volume) { + for (auto& stream : sink_streams) + stream->SetDeviceVolume(volume); +} + +void PS4Sink::SetSystemVolume(f32 volume) { + for (auto& stream : sink_streams) + stream->SetSystemVolume(volume); +} + +std::vector ListPS4SinkDevices(bool capture) { + return {{"Default"}}; +} + +u32 GetPS4Latency() { + return TargetSampleCount * 2; +} + +} // namespace AudioCore::Sink diff --git a/src/audio_core/sink/ps4_sink.h b/src/audio_core/sink/ps4_sink.h new file mode 100644 index 0000000000..cfc8c293bb --- /dev/null +++ b/src/audio_core/sink/ps4_sink.h @@ -0,0 +1,43 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include + +#include "audio_core/sink/sink.h" + +namespace Core { +class System; +} + +namespace AudioCore::Sink { +class SinkStream; + +/// @brief PS4 backend sink, holds multiple output streams and is responsible for sinking samples to +/// hardware. Used by Audio Render, Audio In and Audio Out. +struct PS4Sink final : public Sink { + explicit PS4Sink(std::string_view device_id); + ~PS4Sink() override; + SinkStream* AcquireSinkStream(Core::System& system, u32 system_channels, const std::string& name, StreamType type) override; + void CloseStream(SinkStream* stream) override; + void CloseStreams() override; + f32 GetDeviceVolume() const override; + void SetDeviceVolume(f32 volume) override; + void SetSystemVolume(f32 volume) override; + /// Name of the output device used by streams + std::string output_device; + /// Name of the input device used by streams + std::string input_device; + /// Vector of streams managed by this sink + std::vector sink_streams; +}; + +std::vector ListPS4SinkDevices(bool capture); +u32 GetPS4Latency(); + +} // namespace AudioCore::Sink diff --git a/src/audio_core/sink/sink_details.cpp b/src/audio_core/sink/sink_details.cpp index 70bf75018b..d8a80b9319 100644 --- a/src/audio_core/sink/sink_details.cpp +++ b/src/audio_core/sink/sink_details.cpp @@ -19,6 +19,9 @@ #ifdef HAVE_SDL2 #include "audio_core/sink/sdl2_sink.h" #endif +#ifdef __OPENORBIS__ +#include "audio_core/sink/ps4_sink.h" +#endif #include "audio_core/sink/null_sink.h" #include "common/logging/log.h" #include "common/settings_enums.h" @@ -51,6 +54,16 @@ struct SinkDetails { // sink_details is ordered in terms of desirability, with the best choice at the top. constexpr SinkDetails sink_details[] = { +#ifdef __OPENORBIS__ + SinkDetails{ + Settings::AudioEngine::Ps4, + [](std::string_view device_id) -> std::unique_ptr { + return std::make_unique(device_id); + }, + &ListPS4SinkDevices, + &GetPS4Latency, + }, +#endif #ifdef HAVE_OBOE SinkDetails{ Settings::AudioEngine::Oboe, @@ -115,7 +128,9 @@ const SinkDetails& GetOutputSinkDetails(Settings::AudioEngine sink_id) { // BEGIN REINTRODUCED FROM 3833 - REPLACED CODE BLOCK ABOVE - DIABLO 3 FIX // Auto-select a backend. Prefer CubeB, but it may report a large minimum latency which // causes audio issues, in that case go with SDL. -#if defined(HAVE_CUBEB) && defined(HAVE_SDL2) +#if defined(__OPENORBIS__) + iter = find_backend(Settings::AudioEngine::Ps4); +#elif defined(HAVE_CUBEB) && defined(HAVE_SDL2) iter = find_backend(Settings::AudioEngine::Cubeb); if (iter->latency() > TargetSampleCount * 3) { iter = find_backend(Settings::AudioEngine::Sdl2); diff --git a/src/common/settings_enums.h b/src/common/settings_enums.h index 638be4127f..d82f4dc90a 100644 --- a/src/common/settings_enums.h +++ b/src/common/settings_enums.h @@ -92,12 +92,13 @@ struct EnumMetadata { // AudioEngine must be specified discretely due to having existing but slightly different // canonicalizations // TODO (lat9nq): Remove explicit definition of AudioEngine/sink_id -enum class AudioEngine : u32 { Auto, Cubeb, Sdl2, Null, Oboe, }; +enum class AudioEngine : u32 { Auto, Cubeb, Sdl2, Null, Oboe, Ps4 }; template<> inline std::vector> EnumMetadata::Canonicalizations() { return { {"auto", AudioEngine::Auto}, {"cubeb", AudioEngine::Cubeb}, {"sdl2", AudioEngine::Sdl2}, {"null", AudioEngine::Null}, {"oboe", AudioEngine::Oboe}, + {"ps4", AudioEngine::Ps4}, }; } /// @brief This is just a sufficiently large number that is more than the number of other enums declared here diff --git a/src/core/hle/service/services.cpp b/src/core/hle/service/services.cpp index 4d04b0fdf0..bf0a89dfef 100644 --- a/src/core/hle/service/services.cpp +++ b/src/core/hle/service/services.cpp @@ -100,7 +100,7 @@ Services::Services(std::shared_ptr& sm, Core::System& system {"nvservices", &Nvidia::LoopProcess}, {"bsdsocket", &Sockets::LoopProcess}, }) { - if (run_on_host) kernel.RunOnHostCoreProcess("vi", [&, token] { VI::LoopProcess(system, token); }).detach(); + if (run_on_host) kernel.RunOnHostCoreProcess(std::string(e.first), [&system, f = e.second] { f(system); }).detach(); else kernel.RunOnGuestCoreProcess(std::string(e.first), [&system, f = e.second] { f(system); }); } if (run_on_host) kernel.RunOnHostCoreProcess("vi", [&, token] { VI::LoopProcess(system, token); }).detach(); From 73e3f387cc5c6cf350547c569083415e22c7994a Mon Sep 17 00:00:00 2001 From: lizzie Date: Sun, 8 Mar 2026 23:07:56 +0000 Subject: [PATCH 77/78] try fix musl 2 --- externals/ps4sup/stub.cpp | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/externals/ps4sup/stub.cpp b/externals/ps4sup/stub.cpp index 562fbd4a38..ebaef27acc 100644 --- a/externals/ps4sup/stub.cpp +++ b/externals/ps4sup/stub.cpp @@ -9,7 +9,11 @@ asm volatile("ud2"); \ } -extern "C" void __cxa_thread_atexit_impl() {} +extern "C" int __pthread_cxa_finalize(); +extern "C" void __cxa_thread_atexit_impl() { + //printf("__cxa_thread_atexit_impl called!\n"); + //__pthread_cxa_finalize(); +} STUB_WEAK(__assert) STUB_WEAK(ZSTD_trace_compress_begin) @@ -20,14 +24,6 @@ STUB_WEAK(ZSTD_trace_decompress_end) FILE* __stderrp = stdout; FILE* __stdinp = stdin; -extern "C" { -struct _RuneLocale; -thread_local const _RuneLocale *_ThreadRuneLocale = NULL; -const _RuneLocale *_CurrentRuneLocale = NULL; -int __isthreaded = 0; -int __mb_sb_limit = 0; -} - #undef STUB_WEAK // THIS MAKES STD::COUT AND SUCH WORK :) From 5dbc9dac2ce1b85030b4165c02ede7fdaa3c10eb Mon Sep 17 00:00:00 2001 From: lizzie Date: Sun, 8 Mar 2026 23:08:18 +0000 Subject: [PATCH 78/78] needs libscienternal --- .ci/ps4/build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.ci/ps4/build.sh b/.ci/ps4/build.sh index c7bb54deaa..8a5a64c5ec 100755 --- a/.ci/ps4/build.sh +++ b/.ci/ps4/build.sh @@ -20,8 +20,8 @@ set(CMAKE_CXX_LINK_FLAGS "-m elf_x86_64 -pie -T $OO_PS4_TOOLCHAIN/link.x --eh-fr set(CMAKE_C_COMPILER clang) set(CMAKE_CXX_COMPILER clang++) set(CMAKE_LINKER ld.lld) -set(CMAKE_C_LINK_EXECUTABLE " -o -lc -lkernel -lSceUserService -lSceSysmodule -lSceNet $OO_PS4_TOOLCHAIN/lib/crt1.o ") -set(CMAKE_CXX_LINK_EXECUTABLE " -o -lc -lkernel -lc++ -lSceUserService -lSceSysmodule -lSceNet $OO_PS4_TOOLCHAIN/lib/crt1.o ") +set(CMAKE_C_LINK_EXECUTABLE " -o -lc -lkernel -lSceUserService -lSceSysmodule -lSceNet -lSceLibcInternal $OO_PS4_TOOLCHAIN/lib/crt1.o ") +set(CMAKE_CXX_LINK_EXECUTABLE " -o -lc -lkernel -lc++ -lSceUserService -lSceSysmodule -lSceNet -lSceLibcInternal $OO_PS4_TOOLCHAIN/lib/crt1.o ") set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)