From dbbf5bd758296553e48c2db5082c0b6acb4b86dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Garc=C3=ADa=20Garc=C3=ADa?= Date: Sun, 26 Apr 2026 09:04:46 +0200 Subject: [PATCH] stubs: return unique UIDs from stub allocators ksceKernelAllocRemoteProcessHeap returned 0 (invalid UID on Vita) and ksceKernelRegisterProcEventHandler returned the same hardcoded 0x40001 on every call. Use atomic counters to return distinct UIDs so callers that pass them back to the corresponding Free/Unregister don't collide. --- .../modules/SceProcessmgr/SceProcessmgrForDriver.cpp | 3 ++- vita3k/modules/SceSysmem/SceProcEventForDriver.cpp | 10 +++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/vita3k/modules/SceProcessmgr/SceProcessmgrForDriver.cpp b/vita3k/modules/SceProcessmgr/SceProcessmgrForDriver.cpp index 0c31eba4e..ae63d11c7 100644 --- a/vita3k/modules/SceProcessmgr/SceProcessmgrForDriver.cpp +++ b/vita3k/modules/SceProcessmgr/SceProcessmgrForDriver.cpp @@ -20,6 +20,7 @@ #include static std::atomic pls_key_counter{ 1 }; +static std::atomic stub_uid_counter{ 0x40001 }; EXPORT(int, ksceKernelCreateProcessLocalStorage, const char *name, SceSize size) { // Return a unique key for this PLS entry. @@ -70,7 +71,7 @@ EXPORT(int, ksceKernelIsGameBudget) { // kubridge-required stubs EXPORT(SceUID, ksceKernelAllocRemoteProcessHeap, SceUID pid, uint32_t size, Ptr opt) { STUBBED("ksceKernelAllocRemoteProcessHeap"); - return 0; + return stub_uid_counter.fetch_add(1); } EXPORT(int, ksceKernelFreeRemoteProcessHeap, SceUID pid, Ptr ptr) { diff --git a/vita3k/modules/SceSysmem/SceProcEventForDriver.cpp b/vita3k/modules/SceSysmem/SceProcEventForDriver.cpp index c9ca1d6f0..287bc52f5 100644 --- a/vita3k/modules/SceSysmem/SceProcEventForDriver.cpp +++ b/vita3k/modules/SceSysmem/SceProcEventForDriver.cpp @@ -17,14 +17,18 @@ #include +#include + +static std::atomic proc_event_uid_counter{ 0x40001 }; + EXPORT(int, ksceKernelInvokeProcEventHandler) { return UNIMPLEMENTED(); } EXPORT(SceUID, ksceKernelRegisterProcEventHandler, const char *name, Ptr handler, int priority) { - // Stub: return a fake UID. kubridge registers a process event handler - // for cleanup on process exit, but in the emulator we don't need it. - return 0x40001; + // Stub: return a unique UID per registration. kubridge registers a process + // event handler for cleanup on exit, but in the emulator we don't need it. + return proc_event_uid_counter.fetch_add(1); } EXPORT(int, ksceKernelUnregisterProcEventHandler) {