diff --git a/src/core/libraries/kernel/kernel.cpp b/src/core/libraries/kernel/kernel.cpp index 6594bfab2..4d74e731b 100644 --- a/src/core/libraries/kernel/kernel.cpp +++ b/src/core/libraries/kernel/kernel.cpp @@ -298,6 +298,126 @@ s32 PS4_SYSV_ABI sceKernelGetAppInfo(s32 pid, OrbisKernelAppInfo* app_info) { return ORBIS_OK; } +// Nominally: long sysconf(int name); +u64 PS4_SYSV_ABI posix_sysconf(s32 name) { + switch (name) { + case 0: + return 0x20000; + case POSIX_SC_ARG_MAX: + return 0x588bc000; + case POSIX_SC_CHILD_MAX: + return 0x64; + case POSIX_SC_CLK_TCK: + return 0x20; + case POSIX_SC_NGROUPS_MAX: + return 0x644; + case POSIX_SC_OPEN_MAX: + return -0x1; + case POSIX_SC_JOB_CONTROL: + return 0x6; + case POSIX_SC_SAVED_IDS: + return 0x1; + case POSIX_SC_VERSION: + return 0x1; + case POSIX_SC_BC_BASE_MAX: + return 0x31069; + case POSIX_SC_BC_DIM_MAX: + return -0x1; + case POSIX_SC_BC_SCALE_MAX: + return 0x31069; + case POSIX_SC_BC_STRING_MAX: + return 0x31069; + case POSIX_SC_COLL_WEIGHTS_MAX: + return -0x1; + case POSIX_SC_EXPR_NEST_MAX: + return -0x1; + case POSIX_SC_LINE_MAX: + return 0x31069; + case POSIX_SC_RE_DUP_MAX: + return 0x31069; + case POSIX_SC_2_VERSION: + return 0x31069; + case POSIX_SC_2_C_BIND: + return 0x31069; + case POSIX_SC_2_C_DEV: + return 0x31069; + case POSIX_SC_2_CHAR_TERM: + return 0x31069; + case POSIX_SC_2_FORT_DEV: + return 0x31069; + case POSIX_SC_2_FORT_RUN: + return 0x31069; + case POSIX_SC_2_LOCALEDEF: + return -0x1; + case POSIX_SC_2_SW_DEV: + return -0x1; + case POSIX_SC_2_UPE: + return 0x0; + case POSIX_SC_STREAM_MAX: + return 0x7fffffff; + case POSIX_SC_TZNAME_MAX: + return -0x1; + case POSIX_SC_ASYNCHRONOUS_IO: + return 0x8000; + case POSIX_SC_MAPPED_FILES: + return 0x31069; + case POSIX_SC_MEMLOCK: + return 0x4000; + case POSIX_SC_MEMLOCK_RANGE: + return 0x1e; + case POSIX_SC_MEMORY_PROTECTION: + return 0x100; + case POSIX_SC_MESSAGE_PASSING: + return 0x7fffffff; + case POSIX_SC_PRIORITIZED_IO: + return -0x1; + case POSIX_SC_PRIORITY_SCHEDULING: + return -0x1; + case POSIX_SC_REALTIME_SIGNALS: + return 0x63; + case POSIX_SC_SEMAPHORES: + return 0x800; + case POSIX_SC_FSYNC: + return 0x63; + case POSIX_SC_SHARED_MEMORY_OBJECTS: + return 0x3e8; + case POSIX_SC_SYNCHRONIZED_IO: + return 0x2; + case POSIX_SC_THREAD_ATTR_STACKSIZE: + return 0x1; + case POSIX_SC_THREAD_CPUTIME: + return 0x1; + case POSIX_SC_THREAD_DESTRUCTOR_ITERATIONS: + return 0x48000; + case POSIX_SC_THREAD_KEYS_MAX: + return 0x1a078630b2dd7; + case POSIX_SC_THREAD_PRIO_INHERIT: + return -0x1; + case POSIX_SC_THREAD_PRIO_PROTECT: + return -0x1; + case POSIX_SC_THREAD_PRIORITY_SCHEDULING: + return 0x2bc; + case POSIX_SC_THREAD_PROCESS_SHARED: + return 0x2bc; + case POSIX_SC_THREAD_SAFE_FUNCTIONS: + return 0x1; + case POSIX_SC_THREAD_SPORADIC_SERVER: + return -0x1; + case POSIX_SC_THREAD_STACK_MIN: + return 0x1; + case POSIX_SC_THREAD_THREADS_MAX: + return 0x1; + case POSIX_SC_TIMEOUTS: + return -0x1; + // Manually specified + case POSIX_SC_PAGESIZE: + return posix_getpagesize(); + default: + LOG_ERROR(Lib_Kernel, "unhandled {}", name); + return 0; + } +} + void RegisterLib(Core::Loader::SymbolsResolver* sym) { service_thread = std::jthread{KernelServiceThread}; @@ -327,6 +447,10 @@ void RegisterLib(Core::Loader::SymbolsResolver* sym) { LIB_FUNCTION("9BcDykPmo1I", "libkernel", 1, "libkernel", __Error); LIB_FUNCTION("k+AXqu2-eBc", "libkernel", 1, "libkernel", posix_getpagesize); LIB_FUNCTION("k+AXqu2-eBc", "libScePosix", 1, "libkernel", posix_getpagesize); + + LIB_FUNCTION("mkawd0NA9ts", "libkernel", 1, "libkernel", posix_sysconf); + LIB_FUNCTION("mkawd0NA9ts", "libScePosix", 1, "libkernel", posix_sysconf); + LIB_FUNCTION("NWtTN10cJzE", "libSceLibcInternalExt", 1, "libSceLibcInternal", sceLibcHeapGetTraceInfo); diff --git a/src/core/libraries/kernel/kernel.h b/src/core/libraries/kernel/kernel.h index 315af6b06..ab5729f3b 100644 --- a/src/core/libraries/kernel/kernel.h +++ b/src/core/libraries/kernel/kernel.h @@ -80,4 +80,126 @@ struct OrbisKernelAppInfo { void RegisterLib(Core::Loader::SymbolsResolver* sym); +constexpr u32 POSIX_SC_ARG_MAX = 1; +constexpr u32 POSIX_SC_CHILD_MAX = 2; +constexpr u32 POSIX_SC_CLK_TCK = 3; +constexpr u32 POSIX_SC_NGROUPS_MAX = 4; +constexpr u32 POSIX_SC_OPEN_MAX = 5; +constexpr u32 POSIX_SC_JOB_CONTROL = 6; +constexpr u32 POSIX_SC_SAVED_IDS = 7; +constexpr u32 POSIX_SC_VERSION = 8; +constexpr u32 POSIX_SC_BC_BASE_MAX = 9; +constexpr u32 POSIX_SC_BC_DIM_MAX = 10; +constexpr u32 POSIX_SC_BC_SCALE_MAX = 11; +constexpr u32 POSIX_SC_BC_STRING_MAX = 12; +constexpr u32 POSIX_SC_COLL_WEIGHTS_MAX = 13; +constexpr u32 POSIX_SC_EXPR_NEST_MAX = 14; +constexpr u32 POSIX_SC_LINE_MAX = 15; +constexpr u32 POSIX_SC_RE_DUP_MAX = 16; +constexpr u32 POSIX_SC_2_VERSION = 17; +constexpr u32 POSIX_SC_2_C_BIND = 18; +constexpr u32 POSIX_SC_2_C_DEV = 19; +constexpr u32 POSIX_SC_2_CHAR_TERM = 20; +constexpr u32 POSIX_SC_2_FORT_DEV = 21; +constexpr u32 POSIX_SC_2_FORT_RUN = 22; +constexpr u32 POSIX_SC_2_LOCALEDEF = 23; +constexpr u32 POSIX_SC_2_SW_DEV = 24; +constexpr u32 POSIX_SC_2_UPE = 25; +constexpr u32 POSIX_SC_STREAM_MAX = 26; +constexpr u32 POSIX_SC_TZNAME_MAX = 27; +constexpr u32 POSIX_SC_ASYNCHRONOUS_IO = 28; +constexpr u32 POSIX_SC_MAPPED_FILES = 29; +constexpr u32 POSIX_SC_MEMLOCK = 30; +constexpr u32 POSIX_SC_MEMLOCK_RANGE = 31; +constexpr u32 POSIX_SC_MEMORY_PROTECTION = 32; +constexpr u32 POSIX_SC_MESSAGE_PASSING = 33; +constexpr u32 POSIX_SC_PRIORITIZED_IO = 34; +constexpr u32 POSIX_SC_PRIORITY_SCHEDULING = 35; +constexpr u32 POSIX_SC_REALTIME_SIGNALS = 36; +constexpr u32 POSIX_SC_SEMAPHORES = 37; +constexpr u32 POSIX_SC_FSYNC = 38; +constexpr u32 POSIX_SC_SHARED_MEMORY_OBJECTS = 39; +constexpr u32 POSIX_SC_SYNCHRONIZED_IO = 40; +constexpr u32 POSIX_SC_TIMERS = 41; +constexpr u32 POSIX_SC_AIO_LISTIO_MAX = 42; +constexpr u32 POSIX_SC_AIO_MAX = 43; +constexpr u32 POSIX_SC_AIO_PRIO_DELTA_MAX = 44; +constexpr u32 POSIX_SC_DELAYTIMER_MAX = 45; +constexpr u32 POSIX_SC_MQ_OPEN_MAX = 46; +constexpr u32 POSIX_SC_PAGESIZE = 47; +constexpr u32 POSIX_SC_RTSIG_MAX = 48; +constexpr u32 POSIX_SC_SEM_NSEMS_MAX = 49; +constexpr u32 POSIX_SC_SEM_VALUE_MAX = 50; +constexpr u32 POSIX_SC_SIGQUEUE_MAX = 51; +constexpr u32 POSIX_SC_TIMER_MAX = 52; +constexpr u32 POSIX_SC_2_PBS = 59; +constexpr u32 POSIX_SC_2_PBS_ACCOUNTING = 60; +constexpr u32 POSIX_SC_2_PBS_CHECKPOINT = 61; +constexpr u32 POSIX_SC_2_PBS_LOCATE = 62; +constexpr u32 POSIX_SC_2_PBS_MESSAGE = 63; +constexpr u32 POSIX_SC_2_PBS_TRACK = 64; +constexpr u32 POSIX_SC_ADVISORY_INFO = 65; +constexpr u32 POSIX_SC_BARRIERS = 66; +constexpr u32 POSIX_SC_CLOCK_SELECTION = 67; +constexpr u32 POSIX_SC_CPUTIME = 68; +constexpr u32 POSIX_SC_FILE_LOCKING = 69; +constexpr u32 POSIX_SC_GETGR_R_SIZE_MAX = 70; +constexpr u32 POSIX_SC_GETPW_R_SIZE_MAX = 71; +constexpr u32 POSIX_SC_HOST_NAME_MAX = 72; +constexpr u32 POSIX_SC_LOGIN_NAME_MAX = 73; +constexpr u32 POSIX_SC_MONOTONIC_CLOCK = 74; +constexpr u32 POSIX_SC_MQ_PRIO_MAX = 75; +constexpr u32 POSIX_SC_READER_WRITER_LOCKS = 76; +constexpr u32 POSIX_SC_REGEXP = 77; +constexpr u32 POSIX_SC_SHELL = 78; +constexpr u32 POSIX_SC_SPAWN = 79; +constexpr u32 POSIX_SC_SPIN_LOCKS = 80; +constexpr u32 POSIX_SC_SPORADIC_SERVER = 81; +constexpr u32 POSIX_SC_THREAD_ATTR_STACKADDR = 82; +constexpr u32 POSIX_SC_THREAD_ATTR_STACKSIZE = 83; +constexpr u32 POSIX_SC_THREAD_CPUTIME = 84; +constexpr u32 POSIX_SC_THREAD_DESTRUCTOR_ITERATIONS = 85; +constexpr u32 POSIX_SC_THREAD_KEYS_MAX = 86; +constexpr u32 POSIX_SC_THREAD_PRIO_INHERIT = 87; +constexpr u32 POSIX_SC_THREAD_PRIO_PROTECT = 88; +constexpr u32 POSIX_SC_THREAD_PRIORITY_SCHEDULING = 89; +constexpr u32 POSIX_SC_THREAD_PROCESS_SHARED = 90; +constexpr u32 POSIX_SC_THREAD_SAFE_FUNCTIONS = 91; +constexpr u32 POSIX_SC_THREAD_SPORADIC_SERVER = 92; +constexpr u32 POSIX_SC_THREAD_STACK_MIN = 93; +constexpr u32 POSIX_SC_THREAD_THREADS_MAX = 94; +constexpr u32 POSIX_SC_TIMEOUTS = 95; +constexpr u32 POSIX_SC_THREADS = 96; +constexpr u32 POSIX_SC_TRACE = 97; +constexpr u32 POSIX_SC_TRACE_EVENT_FILTER = 98; +constexpr u32 POSIX_SC_TRACE_INHERIT = 99; +constexpr u32 POSIX_SC_TRACE_LOG = 100; +constexpr u32 POSIX_SC_TTY_NAME_MAX = 101; +constexpr u32 POSIX_SC_TYPED_MEMORY_OBJECTS = 102; +constexpr u32 POSIX_SC_V6_ILP32_OFF32 = 103; +constexpr u32 POSIX_SC_V6_ILP32_OFFBIG = 104; +constexpr u32 POSIX_SC_V6_LP64_OFF64 = 105; +constexpr u32 POSIX_SC_V6_LPBIG_OFFBIG = 106; +constexpr u32 POSIX_SC_IPV6 = 118; +constexpr u32 POSIX_SC_RAW_SOCKETS = 119; +constexpr u32 POSIX_SC_SYMLOOP_MAX = 120; +constexpr u32 POSIX_SC_ATEXIT_MAX = 107; +constexpr u32 POSIX_SC_IOV_MAX = 56; +constexpr u32 POSIX_SC_XOPEN_CRYPT = 108; +constexpr u32 POSIX_SC_XOPEN_ENH_I18N = 109; +constexpr u32 POSIX_SC_XOPEN_LEGACY = 110; +constexpr u32 POSIX_SC_XOPEN_REALTIME = 111; +constexpr u32 POSIX_SC_XOPEN_REALTIME_THREADS = 112; +constexpr u32 POSIX_SC_XOPEN_SHM = 113; +constexpr u32 POSIX_SC_XOPEN_STREAMS = 114; +constexpr u32 POSIX_SC_XOPEN_UNIX = 115; +constexpr u32 POSIX_SC_XOPEN_VERSION = 116; +constexpr u32 POSIX_SC_XOPEN_XCU_VERSION = 117; +constexpr u32 POSIX_SC_NPROCESSORS_CONF = 57; +constexpr u32 POSIX_SC_NPROCESSORS_ONLN = 58; +constexpr u32 POSIX_SC_CPUSET_SIZE = 122; +constexpr u32 POSIX_SC_UEXTERR_MAXLEN = 123; +constexpr u32 POSIX_SC_NSIG = 124; +constexpr u32 POSIX_SC_PHYS_PAGES = 121; + } // namespace Libraries::Kernel diff --git a/src/core/libraries/kernel/threads/exception.cpp b/src/core/libraries/kernel/threads/exception.cpp index 3d855af3d..f9a062da7 100644 --- a/src/core/libraries/kernel/threads/exception.cpp +++ b/src/core/libraries/kernel/threads/exception.cpp @@ -308,6 +308,28 @@ bool PS4_SYSV_ABI posix_sigisemptyset(Sigset* s) { return s->bits[0] == 0 && s->bits[1] == 0; } +s32 PS4_SYSV_ABI posix_sigalstack(const OrbisKernelExceptionHandlerStack* ss, + OrbisKernelExceptionHandlerStack* old_ss) { +#ifdef __unix__ + stack_t native_ss{}; + if (ss) { + native_ss.ss_sp = ss->ss_sp; + native_ss.ss_flags = ss->ss_flags; + native_ss.ss_size = ss->ss_size; + } + stack_t native_old_ss{}; + sigaltstack(&native_ss, &native_old_ss); + if (old_ss) { + old_ss->ss_sp = native_old_ss.ss_sp; + old_ss->ss_flags = native_old_ss.ss_flags; + old_ss->ss_size = native_old_ss.ss_size; + } +#else + LOG_ERROR(Lib_Kernel, "(stubbed)"); +#endif + return ORBIS_OK; +} + s32 PS4_SYSV_ABI posix_sigaction(s32 sig, Sigaction* act, Sigaction* oact) { if (sig < 1 || sig > 128 || sig == POSIX_SIGTHR || sig == POSIX_SIGKILL || sig == POSIX_SIGSTOP) { @@ -495,9 +517,12 @@ void RegisterException(Core::Loader::SymbolsResolver* sym) { LIB_FUNCTION("KiJEPEWRyUY", "libkernel", 1, "libkernel", posix_sigaction); LIB_FUNCTION("+F7C-hdk7+E", "libkernel", 1, "libkernel", posix_sigemptyset); LIB_FUNCTION("yH-uQW3LbX0", "libkernel", 1, "libkernel", posix_pthread_kill); + LIB_FUNCTION("sHziAegVp74", "libkernel", 1, "libkernel", posix_sigalstack); + LIB_FUNCTION("KiJEPEWRyUY", "libScePosix", 1, "libkernel", posix_sigaction); LIB_FUNCTION("+F7C-hdk7+E", "libScePosix", 1, "libkernel", posix_sigemptyset); LIB_FUNCTION("yH-uQW3LbX0", "libScePosix", 1, "libkernel", posix_pthread_kill); + LIB_FUNCTION("sHziAegVp74", "libScePosix", 1, "libkernel", posix_sigalstack); } } // namespace Libraries::Kernel diff --git a/src/core/libraries/kernel/threads/exception.h b/src/core/libraries/kernel/threads/exception.h index f8cd06549..f9655404a 100644 --- a/src/core/libraries/kernel/threads/exception.h +++ b/src/core/libraries/kernel/threads/exception.h @@ -12,6 +12,11 @@ class SymbolsResolver; namespace Libraries::Kernel { using OrbisKernelExceptionHandler = PS4_SYSV_ABI void (*)(int, void*); +struct OrbisKernelExceptionHandlerStack { + void* ss_sp; + int ss_flags; + size_t ss_size; +}; constexpr s32 POSIX_SIGHUP = 1; constexpr s32 POSIX_SIGINT = 2;