posix: implement sysconf() and sigalstack() (#4201)

* posix: implement sysconf() and sigalstack()

Signed-off-by: lizzie <lizzie@eden-emu.dev>

* mark as stubbed

* oh clang format

---------

Signed-off-by: lizzie <lizzie@eden-emu.dev>
Co-authored-by: lizzie <lizzie@eden-emu.dev>
This commit is contained in:
Ploo 2026-04-01 05:58:54 +00:00 committed by GitHub
parent 969955b8a0
commit 5d489ff03d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 276 additions and 0 deletions

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -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;