diff --git a/src/core/libraries/kernel/libkernel.cpp b/src/core/libraries/kernel/libkernel.cpp index 8b47606ae..aeb57e4f8 100644 --- a/src/core/libraries/kernel/libkernel.cpp +++ b/src/core/libraries/kernel/libkernel.cpp @@ -225,6 +225,10 @@ s32 PS4_SYSV_ABI sceKernelDlsym(s32 handle, const char* symbol, void** addrp) { return ORBIS_OK; } +s64 PS4_SYSV_ABI posix_getpagesize() { + return 4096; +} + void LibKernel_Register(Core::Loader::SymbolsResolver* sym) { // obj LIB_OBJ("f7uOxY9mM1U", "libkernel", 1, "libkernel", 1, 1, &g_stack_chk_guard); @@ -268,6 +272,7 @@ void LibKernel_Register(Core::Loader::SymbolsResolver* sym) { LIB_FUNCTION("-o5uEDpN+oY", "libkernel", 1, "libkernel", 1, 1, sceKernelConvertUtcToLocaltime); LIB_FUNCTION("WB66evu8bsU", "libkernel", 1, "libkernel", 1, 1, sceKernelGetCompiledSdkVersion); LIB_FUNCTION("DRuBt2pvICk", "libkernel", 1, "libkernel", 1, 1, ps4__read); + LIB_FUNCTION("k+AXqu2-eBc", "libScePosix", 1, "libkernel", 1, 1, posix_getpagesize); Libraries::Kernel::fileSystemSymbolsRegister(sym); Libraries::Kernel::timeSymbolsRegister(sym); diff --git a/src/core/libraries/kernel/time_management.cpp b/src/core/libraries/kernel/time_management.cpp index 3f5f92eef..5de3d6bee 100644 --- a/src/core/libraries/kernel/time_management.cpp +++ b/src/core/libraries/kernel/time_management.cpp @@ -63,9 +63,7 @@ int PS4_SYSV_ABI sceKernelUsleep(u32 microseconds) { } int PS4_SYSV_ABI posix_usleep(u32 microseconds) { - ASSERT(microseconds >= 1000); - std::this_thread::sleep_for(std::chrono::microseconds(microseconds)); - return 0; + return sceKernelUsleep(microseconds); } u32 PS4_SYSV_ABI sceKernelSleep(u32 seconds) { @@ -79,11 +77,15 @@ int PS4_SYSV_ABI sceKernelClockGettime(s32 clock_id, OrbisKernelTimespec* tp) { } clockid_t pclock_id = CLOCK_REALTIME; switch (clock_id) { - case 0: + case ORBIS_CLOCK_REALTIME: + case ORBIS_CLOCK_REALTIME_PRECISE: + case ORBIS_CLOCK_REALTIME_FAST: pclock_id = CLOCK_REALTIME; break; - case 13: - case 4: + case ORBIS_CLOCK_SECOND: + case ORBIS_CLOCK_MONOTONIC: + case ORBIS_CLOCK_MONOTONIC_PRECISE: + case ORBIS_CLOCK_MONOTONIC_FAST: pclock_id = CLOCK_MONOTONIC; break; default: @@ -167,6 +169,7 @@ void timeSymbolsRegister(Core::Loader::SymbolsResolver* sym) { LIB_FUNCTION("QcteRwbsnV0", "libScePosix", 1, "libkernel", 1, 1, posix_usleep); LIB_FUNCTION("-ZR+hG7aDHw", "libkernel", 1, "libkernel", 1, 1, sceKernelSleep); LIB_FUNCTION("0wu33hunNdE", "libScePosix", 1, "libkernel", 1, 1, sceKernelSleep); + LIB_FUNCTION("QvsZxomvUHs", "libkernel", 1, "libkernel", 1, 1, sceKernelNanosleep); LIB_FUNCTION("yS8U2TGCe1A", "libkernel", 1, "libkernel", 1, 1, posix_nanosleep); LIB_FUNCTION("QBi7HCK03hw", "libkernel", 1, "libkernel", 1, 1, sceKernelClockGettime); LIB_FUNCTION("lLMT9vJAck0", "libkernel", 1, "libkernel", 1, 1, clock_gettime); diff --git a/src/core/libraries/kernel/time_management.h b/src/core/libraries/kernel/time_management.h index 64689bf67..51e8b9bdc 100644 --- a/src/core/libraries/kernel/time_management.h +++ b/src/core/libraries/kernel/time_management.h @@ -11,6 +11,25 @@ class SymbolsResolver; namespace Libraries::Kernel { +constexpr int ORBIS_CLOCK_REALTIME = 0; +constexpr int ORBIS_CLOCK_VIRTUAL = 1; +constexpr int ORBIS_CLOCK_PROF = 2; +constexpr int ORBIS_CLOCK_MONOTONIC = 4; +constexpr int ORBIS_CLOCK_UPTIME = 5; +constexpr int ORBIS_CLOCK_UPTIME_PRECISE = 7; +constexpr int ORBIS_CLOCK_UPTIME_FAST = 8; +constexpr int ORBIS_CLOCK_REALTIME_PRECISE = 9; +constexpr int ORBIS_CLOCK_REALTIME_FAST = 10; +constexpr int ORBIS_CLOCK_MONOTONIC_PRECISE = 11; +constexpr int ORBIS_CLOCK_MONOTONIC_FAST = 12; +constexpr int ORBIS_CLOCK_SECOND = 13; +constexpr int ORBIS_CLOCK_THREAD_CPUTIME_ID = 14; +constexpr int ORBIS_CLOCK_PROCTIME = 15; +constexpr int ORBIS_CLOCK_EXT_NETWORK = 16; +constexpr int ORBIS_CLOCK_EXT_DEBUG_NETWORK = 17; +constexpr int ORBIS_CLOCK_EXT_AD_NETWORK = 18; +constexpr int ORBIS_CLOCK_EXT_RAW_NETWORK = 19; + struct OrbisKernelTimeval { s64 tv_sec; s64 tv_usec;