mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2026-04-01 18:40:57 -06:00
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:
parent
969955b8a0
commit
5d489ff03d
@ -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);
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user