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/0001-aesni-fix.patch b/.patch/mbedtls/0001-aesni-fix.patch index b953bb4231..bd4b55cf46 100644 --- a/.patch/mbedtls/0001-aesni-fix.patch +++ b/.patch/mbedtls/0001-aesni-fix.patch @@ -25,7 +25,7 @@ index 2857068..3e104ab 100644 #pragma GCC target ("pclmul,sse2,aes") #define MBEDTLS_POP_TARGET_PRAGMA -#elif defined(__clang__) && (__clang_major__ >= 5) -+#elif defined(__clang__) && !defined(_LIBCPP_HAS_MUSL_LIBC) ++#elif defined(__clang__) && !defined(__OPENORBIS__) #pragma clang attribute push (__attribute__((target("pclmul,sse2,aes"))), apply_to=function) #define MBEDTLS_POP_TARGET_PRAGMA #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 d1d5175983..98aacc1976 100644 --- a/externals/ffmpeg/CMakeLists.txt +++ b/externals/ffmpeg/CMakeLists.txt @@ -148,6 +148,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) @@ -244,9 +251,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)