From a4fa36bd91f8d8e10b0802dae2d94ba25f991de2 Mon Sep 17 00:00:00 2001 From: raziel1000 Date: Tue, 11 Jun 2024 00:00:16 -0600 Subject: [PATCH] sceKernelUuidCreate(win), posix_pthread_create, posix_pthread_detach --- src/core/libraries/kernel/libkernel.cpp | 21 ++++++++++++++++++ src/core/libraries/kernel/libkernel.h | 9 ++++++++ .../libraries/kernel/thread_management.cpp | 22 +++++++++++++++++++ 3 files changed, 52 insertions(+) diff --git a/src/core/libraries/kernel/libkernel.cpp b/src/core/libraries/kernel/libkernel.cpp index aeb57e4f8..dacf3067f 100644 --- a/src/core/libraries/kernel/libkernel.cpp +++ b/src/core/libraries/kernel/libkernel.cpp @@ -21,6 +21,7 @@ #include "core/memory.h" #ifdef _WIN64 #include +#include #include #else #include @@ -225,6 +226,25 @@ s32 PS4_SYSV_ABI sceKernelDlsym(s32 handle, const char* symbol, void** addrp) { return ORBIS_OK; } +int PS4_SYSV_ABI sceKernelUuidCreate(OrbisKernelUuid* orbisUuid) { +#ifdef _WIN64 + UUID uuid; + UuidCreate(&uuid); + orbisUuid->timeLow = uuid.Data1; + orbisUuid->timeMid = uuid.Data2; + orbisUuid->timeHiAndVersion = uuid.Data3; + orbisUuid->clockSeqHiAndReserved = uuid.Data4[0]; + orbisUuid->clockSeqLow = uuid.Data4[1]; + for (int i = 0; i < 6; i++) { + orbisUuid->node[i] = uuid.Data4[2 + i]; + } +#else + LOG_INFO(Kernel, "sceKernelUuidCreate: Todo Linux"); +#endif + + return 0; +} + s64 PS4_SYSV_ABI posix_getpagesize() { return 4096; } @@ -252,6 +272,7 @@ void LibKernel_Register(Core::Loader::SymbolsResolver* sym) { _sceKernelRtldSetApplicationHeapAPI); LIB_FUNCTION("wzvqT4UqKX8", "libkernel", 1, "libkernel", 1, 1, sceKernelLoadStartModule); LIB_FUNCTION("LwG8g3niqwA", "libkernel", 1, "libkernel", 1, 1, sceKernelDlsym); + LIB_FUNCTION("Xjoosiw+XPI", "libkernel", 1, "libkernel", 1, 1, sceKernelUuidCreate); // equeue LIB_FUNCTION("D0OdFMjp46I", "libkernel", 1, "libkernel", 1, 1, sceKernelCreateEqueue); diff --git a/src/core/libraries/kernel/libkernel.h b/src/core/libraries/kernel/libkernel.h index 0cc757774..ccddf6104 100644 --- a/src/core/libraries/kernel/libkernel.h +++ b/src/core/libraries/kernel/libkernel.h @@ -18,6 +18,15 @@ struct OrbisTimesec { u32 dst_sec; }; +typedef struct { + u32 timeLow; + u16 timeMid; + u16 timeHiAndVersion; + u8 clockSeqHiAndReserved; + u8 clockSeqLow; + u8 node[6]; +} OrbisKernelUuid; + int* PS4_SYSV_ABI __Error(); void LibKernel_Register(Core::Loader::SymbolsResolver* sym); diff --git a/src/core/libraries/kernel/thread_management.cpp b/src/core/libraries/kernel/thread_management.cpp index 04287bed2..e014fdf87 100644 --- a/src/core/libraries/kernel/thread_management.cpp +++ b/src/core/libraries/kernel/thread_management.cpp @@ -801,6 +801,20 @@ int PS4_SYSV_ABI scePthreadCreate(ScePthread* thread, const ScePthreadAttr* attr } } +int PS4_SYSV_ABI posix_pthread_create(ScePthread* thread, const ScePthreadAttr* attr, + pthreadEntryFunc start_routine, void* arg) { + LOG_INFO(Kernel_Pthread, "posix pthread_create redirect to scePthreadCreate"); + + int result = scePthreadCreate(thread, attr, start_routine, arg, ""); + if (result != 0) { + int rt = result > SCE_KERNEL_ERROR_UNKNOWN && result <= SCE_KERNEL_ERROR_ESTOP + ? result + -SCE_KERNEL_ERROR_UNKNOWN + : POSIX_EOTHER; + return rt; + } + return result; +} + ScePthread PThreadPool::Create() { std::scoped_lock lock{m_mutex}; @@ -858,6 +872,12 @@ int PS4_SYSV_ABI scePthreadDetach(ScePthread thread) { return ORBIS_OK; } +int PS4_SYSV_ABI posix_pthread_detach(ScePthread thread) { + LOG_INFO(Kernel_Pthread, "thread create name = {}", thread->name); + thread->is_detached = true; + return ORBIS_OK; +} + ScePthread PS4_SYSV_ABI posix_pthread_self() { return g_pthread_self; } @@ -969,6 +989,8 @@ void pthreadSymbolsRegister(Core::Loader::SymbolsResolver* sym) { LIB_FUNCTION("3PtV6p3QNX4", "libkernel", 1, "libkernel", 1, 1, scePthreadEqual); LIB_FUNCTION("7Xl257M4VNI", "libScePosix", 1, "libkernel", 1, 1, posix_pthread_equal); LIB_FUNCTION("7Xl257M4VNI", "libScePosix", 1, "libkernel", 1, 1, posix_pthread_join); + LIB_FUNCTION("+U1R4WtXvoc", "libScePosix", 1, "libkernel", 1, 1, posix_pthread_detach); + LIB_FUNCTION("OxhIB8LB-PQ", "libScePosix", 1, "libkernel", 1, 1, posix_pthread_create); LIB_FUNCTION("aI+OeCz8xrQ", "libkernel", 1, "libkernel", 1, 1, scePthreadSelf); LIB_FUNCTION("EotR8a3ASf4", "libkernel", 1, "libkernel", 1, 1, posix_pthread_self);