From 8f6328242d8c19c5ffdfd45bb23d3db6a1e0b76d Mon Sep 17 00:00:00 2001 From: Merijn Date: Mon, 5 Oct 2026 18:41:52 +0200 Subject: [PATCH] feat(libs): add exports imported by PPSA12544 Implement scePthreadGetschedparam and scePthreadSetschedparam on top of the thread priority, POSIX utimes and fsync on top of sceKernelUtimes and sceKernelFsync, and sceUserServiceGetAccessibilityZoomFollowFocus like the other accessibility queries. Add the remaining imports of PPSA12544 as unimplemented exports and record unknown NIDs and signatures in the technical debt. Co-Authored-By: Claude Opus 5.5 --- core/libs/prx/libSceAgc/Unimplemented.cpp | 12 ++++++ .../libs/prx/libSceFont/src/Unimplemented.cpp | 10 +++++ core/libs/prx/libSceHttp2/Export.cpp | 20 +++++++++ core/libs/prx/libSceNet/Export.cpp | 6 +++ core/libs/prx/libScePad/Export.cpp | 6 +++ core/libs/prx/libSceSsl/Export.cpp | 30 +++++++++++++ core/libs/prx/libSceSystemService/Export.cpp | 25 +++++++++++ core/libs/prx/libSceUserService/Export.cpp | 8 ++++ core/libs/prx/libc/src/HeapDiagnostics.cpp | 18 ++++++++ core/libs/prx/libkernel/File/src/Stdio.cpp | 10 +++++ .../prx/libkernel/Pthread/Posix/Thread.cpp | 13 ++++++ core/libs/prx/libkernel/Unimplemented.cpp | 42 +++++++++++++++++++ docs/dev/TechnicalDebt.md | 5 +++ 13 files changed, 205 insertions(+) diff --git a/core/libs/prx/libSceAgc/Unimplemented.cpp b/core/libs/prx/libSceAgc/Unimplemented.cpp index e53a08cb3..3e405bd60 100644 --- a/core/libs/prx/libSceAgc/Unimplemented.cpp +++ b/core/libs/prx/libSceAgc/Unimplemented.cpp @@ -150,4 +150,16 @@ int APS5_VABI sceAgcUnknown_y5K5tPktiL8() { return 0; } +APS5_EXPORT("dbOlWdppb4o", sceAgcUnknown_dbOlWdppb4o); +int APS5_VABI sceAgcUnknown_dbOlWdppb4o(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("vieBRwlh1Lw", sceAgcUnknown_vieBRwlh1Lw); +int APS5_VABI sceAgcUnknown_vieBRwlh1Lw(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + } diff --git a/core/libs/prx/libSceFont/src/Unimplemented.cpp b/core/libs/prx/libSceFont/src/Unimplemented.cpp index c1b833af5..56e6eb21b 100644 --- a/core/libs/prx/libSceFont/src/Unimplemented.cpp +++ b/core/libs/prx/libSceFont/src/Unimplemented.cpp @@ -457,6 +457,16 @@ int APS5_VABI sceFontWritingLineWritesOrder() { return 0; } +int APS5_VABI sceFontGraphicsDrawupFillTextureImageObject(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceFontGraphicsDrawupFillTexturePatternObject(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + } #pragma GCC visibility pop diff --git a/core/libs/prx/libSceHttp2/Export.cpp b/core/libs/prx/libSceHttp2/Export.cpp index 911b65730..adaa00e78 100644 --- a/core/libs/prx/libSceHttp2/Export.cpp +++ b/core/libs/prx/libSceHttp2/Export.cpp @@ -214,4 +214,24 @@ int APS5_VABI sceHttp2GetMemoryPoolStats() { return 0; } +int APS5_VABI sceHttp2CookieFlush(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceHttp2CreateCookieBox(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceHttp2SetCookieBox(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceHttp2SetRequestNoContentLength(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + } diff --git a/core/libs/prx/libSceNet/Export.cpp b/core/libs/prx/libSceNet/Export.cpp index 19a4b22bd..456301ccf 100644 --- a/core/libs/prx/libSceNet/Export.cpp +++ b/core/libs/prx/libSceNet/Export.cpp @@ -911,4 +911,10 @@ int APS5_VABI sceNetResolverStartAton(int rid, const void* addr, char* hostname, } return 0; } + +int APS5_VABI sceNetResolverGetError(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + } diff --git a/core/libs/prx/libScePad/Export.cpp b/core/libs/prx/libScePad/Export.cpp index f2437a5a5..adc42a6b7 100644 --- a/core/libs/prx/libScePad/Export.cpp +++ b/core/libs/prx/libScePad/Export.cpp @@ -233,4 +233,10 @@ int APS5_VABI scePadSetVibrationTriggerEffectWeakWhileEmbeddedMicInUse(bool enab return PAD_OK; } +APS5_EXPORT("fCWdlnmB1Ks", scePadUnknown_fCWdlnmB1Ks); +int APS5_VABI scePadUnknown_fCWdlnmB1Ks(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + } diff --git a/core/libs/prx/libSceSsl/Export.cpp b/core/libs/prx/libSceSsl/Export.cpp index 4cca48fc7..5ef04eacb 100644 --- a/core/libs/prx/libSceSsl/Export.cpp +++ b/core/libs/prx/libSceSsl/Export.cpp @@ -73,4 +73,34 @@ int APS5_VABI sceSslGetMemoryPoolStats() { return 0; } +int APS5_VABI sceSslFreeSslCertName(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceSslGetIssuerName(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceSslGetNameEntryCount(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceSslGetNameEntryInfo(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceSslGetPem(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceSslGetSubjectName(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + } diff --git a/core/libs/prx/libSceSystemService/Export.cpp b/core/libs/prx/libSceSystemService/Export.cpp index 01a6365a5..faef48204 100644 --- a/core/libs/prx/libSceSystemService/Export.cpp +++ b/core/libs/prx/libSceSystemService/Export.cpp @@ -130,4 +130,29 @@ int APS5_VABI sceSystemServiceLaunchPlayerDialog(const void* param) { return SYSTEM_SERVICE_OK; } +int APS5_VABI sceSystemServiceDisableMusicPlayer(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceSystemServiceOpenChallengeActivity(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceSystemServiceOpenTournamentOccurrence(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceSystemServiceReenableMusicPlayer(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sceSystemServiceShowControllerSettings(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + } diff --git a/core/libs/prx/libSceUserService/Export.cpp b/core/libs/prx/libSceUserService/Export.cpp index 1695f4546..1ded3463e 100644 --- a/core/libs/prx/libSceUserService/Export.cpp +++ b/core/libs/prx/libSceUserService/Export.cpp @@ -48,6 +48,14 @@ int APS5_VABI sceUserServiceGetAccessibilityZoomEnabled(int user_id, int32_t* zo return USER_SERVICE_OK; } +int APS5_VABI sceUserServiceGetAccessibilityZoomFollowFocus(int user_id, int32_t* zoom_follow_focus) { + if (zoom_follow_focus == nullptr || user_id != USER_SERVICE_INITIAL_USER_ID) { + return USER_SERVICE_ERROR_INVALID_ARGUMENT; + } + *zoom_follow_focus = 0; + return USER_SERVICE_OK; +} + int APS5_VABI sceUserServiceGetAgeLevel(int user_id, uint32_t* age_level) { (void)user_id; (void)age_level; diff --git a/core/libs/prx/libc/src/HeapDiagnostics.cpp b/core/libs/prx/libc/src/HeapDiagnostics.cpp index 0288d5c0a..16910f8a1 100644 --- a/core/libs/prx/libc/src/HeapDiagnostics.cpp +++ b/core/libs/prx/libc/src/HeapDiagnostics.cpp @@ -48,4 +48,22 @@ int32_t APS5_VABI sceLibcUnknown_BnMAMrsfVWo(void) { return 0; } +APS5_EXPORT("OQ-dzhlnM28", sceLibcInternalExtUnknown_OQ_dzhlnM28); +int APS5_VABI sceLibcInternalExtUnknown_OQ_dzhlnM28(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("qBS714-Jr3g", sceLibcInternalExtUnknown_qBS714_Jr3g); +int APS5_VABI sceLibcInternalExtUnknown_qBS714_Jr3g(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +APS5_EXPORT("tB59hFLH3SA", sceLibcInternalExtUnknown_tB59hFLH3SA); +int APS5_VABI sceLibcInternalExtUnknown_tB59hFLH3SA(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + } diff --git a/core/libs/prx/libkernel/File/src/Stdio.cpp b/core/libs/prx/libkernel/File/src/Stdio.cpp index cf4c3a305..4d597c117 100644 --- a/core/libs/prx/libkernel/File/src/Stdio.cpp +++ b/core/libs/prx/libkernel/File/src/Stdio.cpp @@ -487,4 +487,14 @@ int APS5_VABI sceKernelUtimes_nid_postfix(const char* path, const KernelTimeval* return 0; } +int APS5_VABI utimes_nid_postfix(const char* path, const KernelTimeval* times) { + if (const int error = PathError(path)) return PosixFailure(error); + return PosixResult(sceKernelUtimes_nid_postfix(path, times)); +} + +int APS5_VABI fsync_nid_postfix(int fd) { + if (sceKernelFsync(fd) != 0) return PosixFailure(errno); + return 0; +} + } diff --git a/core/libs/prx/libkernel/Pthread/Posix/Thread.cpp b/core/libs/prx/libkernel/Pthread/Posix/Thread.cpp index fc9fd94d8..b2281ac47 100644 --- a/core/libs/prx/libkernel/Pthread/Posix/Thread.cpp +++ b/core/libs/prx/libkernel/Pthread/Posix/Thread.cpp @@ -5,6 +5,7 @@ #include "prx/libc/include/General.hpp" #include "../include/Pthread.hpp" #include "Common.hpp" +#include "prx/libkernel/KernelErrors.hpp" #include extern "C" { @@ -39,6 +40,18 @@ void APS5_VABI pthread_exit_nid_postfix(void* value) { scePthreadExit(value); } +int APS5_VABI scePthreadGetschedparam(Pthread thread, int* policy, KernelSchedParam* param) { + if (!policy || !param) return SCE_KERNEL_ERROR_EINVAL; + *policy = GUEST_SCHED_FIFO; + return scePthreadGetprio(thread, ¶m->sched_priority); +} + +int APS5_VABI scePthreadSetschedparam(Pthread thread, int policy, const KernelSchedParam* param) { + (void)policy; + if (!param) return SCE_KERNEL_ERROR_EINVAL; + return scePthreadSetprio(thread, param->sched_priority); +} + int APS5_VABI pthread_getschedparam_nid_postfix(Pthread thread, int* policy, KernelSchedParam* param) { if (!policy || !param) return PosixThread::GUEST_EINVAL; *policy = GUEST_SCHED_FIFO; diff --git a/core/libs/prx/libkernel/Unimplemented.cpp b/core/libs/prx/libkernel/Unimplemented.cpp index c969fc55e..025f33969 100644 --- a/core/libs/prx/libkernel/Unimplemented.cpp +++ b/core/libs/prx/libkernel/Unimplemented.cpp @@ -30,4 +30,46 @@ int APS5_VABI sceKernelUnknown02(void) { NotImplemented_nid_no_patch("0D4-FVvEikw"); return 0; } +APS5_EXPORT("B2n8aDorSH4", sceKernelUnknown_B2n8aDorSH4); +int APS5_VABI sceKernelUnknown_B2n8aDorSH4(void) { + NotImplemented_nid_no_patch("B2n8aDorSH4"); + return 0; +} + +APS5_EXPORT("NH6xARDOVv8", sceKernelUnknown_NH6xARDOVv8); +int APS5_VABI sceKernelUnknown_NH6xARDOVv8(void) { + NotImplemented_nid_no_patch("NH6xARDOVv8"); + return 0; +} + +APS5_EXPORT("PZQhiiLXRFs", sceKernelUnknown_PZQhiiLXRFs); +int APS5_VABI sceKernelUnknown_PZQhiiLXRFs(void) { + NotImplemented_nid_no_patch("PZQhiiLXRFs"); + return 0; +} + +int APS5_VABI sceKernelFchmod(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI fchmod_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI futimes_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI recvmsg_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} + +int APS5_VABI sendmsg_nid_postfix(void) { + NotImplemented_nid_no_patch(__func__); + return 0; +} } diff --git a/docs/dev/TechnicalDebt.md b/docs/dev/TechnicalDebt.md index 02ea84a84..058a342c8 100644 --- a/docs/dev/TechnicalDebt.md +++ b/docs/dev/TechnicalDebt.md @@ -60,6 +60,11 @@ Throughout the project, every function at every stage either **does exactly what - [BnMAMrsfVWo](../../core/libs/prx/libc/src/HeapDiagnostics.cpp) (libc) - unknown name, signature - [scePngEncEncode](../../core/libs/prx/libScePngEnc/Export.cpp) (libScePngEnc) - whether rows may stay unfiltered when `filter_type` names a subset of the filters is unknown; as in shadPS4, they may only for 0 and for the all-filters mask - AudioIn, NpSessionSignaling and PlayerInvitationDialog exports added without an implementation have assumed signatures +- [dbOlWdppb4o, vieBRwlh1Lw](../../core/libs/prx/libSceAgc/Unimplemented.cpp) (libSceAgc) - unknown name, signature +- [OQ-dzhlnM28, qBS714-Jr3g, tB59hFLH3SA](../../core/libs/prx/libc/src/HeapDiagnostics.cpp) (libSceLibcInternalExt, implemented in libc) - unknown name, signature +- [fCWdlnmB1Ks](../../core/libs/prx/libScePad/Export.cpp) (libScePad) - unknown name, signature +- [B2n8aDorSH4, NH6xARDOVv8, PZQhiiLXRFs](../../core/libs/prx/libkernel/Unimplemented.cpp) (libkernel) - unknown name, signature +- Font, Http2, Net, Ssl, SystemService and libkernel exports imported by PPSA12544 and added without an implementation have unknown signatures - [libSceAudioPropagation](../../core/libs/prx/libSceAudioPropagation/Export.cpp) (libSceAudioPropagation) - signatures and struct descriptors recovered from PPSA21567's calls (#481), not from documentation. The system options layout is unknown (only checked for non-null); the fourth argument of `sceAudioPropagationSourceCalculateAudioPaths` is unknown; `sceAudioPropagationSourceGetAudioPath` is assumed to output an 8-byte path handle. The meaning of the `RenderInfo` word at +0x28 is unknown (PPSA21567 and PPSA21564 pass 2); only 2 is accepted. Both titles pass one `RenderInfo` per call: a count of 0 throws, and larger counts are handled element by element without proof. No error code is known, so invalid input throws instead of returning one - [sceAvPlayerStartEx](../../core/libs/prx/libSceAvPlayer/Export.cpp) (libSceAvPlayer) - start info layout unknown; it is ignored and playback starts as with `sceAvPlayerStart` - [sceAvPlayerInit / sceAvPlayerInitEx](../../core/libs/prx/libSceAvPlayer/src/Player.cpp) (libSceAvPlayer) - behaviour without a memory replacement unknown; frame and sample buffers then come from the guest heap