diff --git a/options/posix/generic/unistd.cpp b/options/posix/generic/unistd.cpp index 9801d18fab..cb5f143e70 100644 --- a/options/posix/generic/unistd.cpp +++ b/options/posix/generic/unistd.cpp @@ -18,6 +18,10 @@ #include #include +#if __MLIBC_LINUX_OPTION +#include +#endif + namespace { constexpr bool logExecvpeTries = false; @@ -724,8 +728,25 @@ long sysconf(int number) { mlibc::infoLogger() << "\e[31mmlibc: sysconf(_SC_OPEN_MAX) returns fallback value 256\e[39m" << frg::endlog; return 256; case _SC_PHYS_PAGES: +#if __MLIBC_LINUX_OPTION + if(mlibc::sys_sysinfo) { + struct sysinfo info{}; + if(mlibc::sys_sysinfo(&info) == 0) + return info.totalram * info.mem_unit / mlibc::page_size; + } +#endif mlibc::infoLogger() << "\e[31mmlibc: sysconf(_SC_PHYS_PAGES) returns fallback value 1024\e[39m" << frg::endlog; return 1024; + case _SC_AVPHYS_PAGES: +#if __MLIBC_LINUX_OPTION + if(mlibc::sys_sysinfo) { + struct sysinfo info{}; + if(mlibc::sys_sysinfo(&info) == 0) + return info.freeram * info.mem_unit / mlibc::page_size; + } +#endif + mlibc::infoLogger() << "\e[31mmlibc: sysconf(_SC_AVPHYS_PAGES) returns fallback value 1024\e[39m" << frg::endlog; + return 1024; case _SC_NPROCESSORS_ONLN: mlibc::infoLogger() << "\e[31mmlibc: sysconf(_SC_NPROCESSORS_ONLN) returns fallback value 1\e[39m" << frg::endlog; return 1; diff --git a/sysdeps/managarm/generic/file.cpp b/sysdeps/managarm/generic/file.cpp index ce2bee8560..a1e97a5f89 100644 --- a/sysdeps/managarm/generic/file.cpp +++ b/sysdeps/managarm/generic/file.cpp @@ -2663,6 +2663,11 @@ int sys_sysconf(int num, long *ret) { *ret = (ru.rlim_cur == RLIM_INFINITY) ? -1 : ru.rlim_cur; break; } + case _SC_PHYS_PAGES: + case _SC_AVPHYS_PAGES: { + // defer these to the generic implementation. + return EINVAL; + } default: { SignalGuard sguard;