#include "Tests/LinuxSyscalls/Syscalls.h" #include "Tests/LinuxSyscalls/x32/Syscalls.h" #include #include #include namespace FEX::HLE::x32 { struct rlimit32 { uint32_t rlim_cur; uint32_t rlim_max; }; struct sysinfo32 { int32_t uptime; uint32_t loads[3]; uint32_t totalram; uint32_t freeram; uint32_t sharedram; uint32_t bufferram; uint32_t totalswap; uint32_t freeswap; uint16_t procs; uint32_t totalhigh; uint32_t mem_unit; char _pad[12]; }; static_assert(sizeof(sysinfo32) == 64, "Needs to be 64bytes"); void RegisterInfo() { REGISTER_SYSCALL_IMPL_X32(ugetrlimit, [](FEXCore::Core::InternalThreadState *Thread, int resource, rlimit32 *rlim) -> uint64_t { struct rlimit rlim64{}; uint64_t Result = ::getrlimit(resource, &rlim64); rlim->rlim_cur = rlim64.rlim_cur; rlim->rlim_max = rlim64.rlim_max; SYSCALL_ERRNO(); }); REGISTER_SYSCALL_IMPL_X32(sysinfo, [](FEXCore::Core::InternalThreadState *Thread, struct sysinfo32 *info) -> uint64_t { struct sysinfo Host{}; uint64_t Result = ::sysinfo(&Host); if (Result != -1) { #define Copy(x) info->x = static_castx)>(std::min(Host.x, static_cast(std::numeric_limitsx)>::max()))); Copy(uptime); info->loads[0] = std::min(Host.loads[0], static_cast(std::numeric_limits::max())); info->loads[1] = std::min(Host.loads[1], static_cast(std::numeric_limits::max())); info->loads[2] = std::min(Host.loads[2], static_cast(std::numeric_limits::max())); Copy(totalram); Copy(sharedram); Copy(bufferram); Copy(totalswap); Copy(freeswap); Copy(procs); Copy(totalhigh); Copy(mem_unit); } SYSCALL_ERRNO(); }); REGISTER_SYSCALL_IMPL_X32(getrusage, [](FEXCore::Core::InternalThreadState *Thread, int who, rusage_32 *usage) -> uint64_t { struct rusage usage64 = *usage; uint64_t Result = ::getrusage(who, &usage64); *usage = usage64; SYSCALL_ERRNO(); }); } }