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