diff --git a/Kernel/API/POSIX/sys/resource.h b/Kernel/API/POSIX/sys/resource.h new file mode 100644 index 00000000000000..09da0085019b83 --- /dev/null +++ b/Kernel/API/POSIX/sys/resource.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2022, Lucas Chollet + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct rusage { + struct timeval ru_utime; + struct timeval ru_stime; + long ru_maxrss; + long ru_ixrss; + long ru_idrss; + long ru_isrss; + long ru_minflt; + long ru_majflt; + long ru_nswap; + long ru_inblock; + long ru_oublock; + long ru_msgsnd; + long ru_msgrcv; + long ru_nsignals; + long ru_nvcsw; + long ru_nivcsw; +}; + +#define RUSAGE_SELF 1 +#define RUSAGE_CHILDREN 2 + +#ifdef __cplusplus +} +#endif diff --git a/Kernel/API/Syscall.h b/Kernel/API/Syscall.h index 1fbea5601a688e..4df48098ffcc0b 100644 --- a/Kernel/API/Syscall.h +++ b/Kernel/API/Syscall.h @@ -100,6 +100,7 @@ enum class NeedsBigProcessLock { S(getrandom, NeedsBigProcessLock::No) \ S(getresgid, NeedsBigProcessLock::Yes) \ S(getresuid, NeedsBigProcessLock::Yes) \ + S(getrusage, NeedsBigProcessLock::Yes) \ S(getsid, NeedsBigProcessLock::Yes) \ S(getsockname, NeedsBigProcessLock::Yes) \ S(getsockopt, NeedsBigProcessLock::Yes) \ diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index e834a3695ef7b3..768134cf1e847d 100644 --- a/Kernel/CMakeLists.txt +++ b/Kernel/CMakeLists.txt @@ -249,6 +249,7 @@ set(KERNEL_SOURCES Syscalls/readlink.cpp Syscalls/realpath.cpp Syscalls/rename.cpp + Syscalls/resource.cpp Syscalls/rmdir.cpp Syscalls/sched.cpp Syscalls/sendfd.cpp @@ -383,7 +384,7 @@ else() set(SOURCES ${SOURCES} ${AK_SOURCES} - + Arch/aarch64/dummy.cpp Arch/aarch64/SmapDisabler.cpp Arch/aarch64/ScopedCritical.cpp @@ -426,7 +427,7 @@ else() # Assume Clang # We need this in order to pick up the #define __serenity__, otherwise we end up including unistd.h into the linker script set(TARGET_STRING "--target=${CMAKE_CXX_COMPILER_TARGET}") - + add_link_options(LINKER:--build-id=none LINKER:--pack-dyn-relocs=relr) endif() diff --git a/Kernel/Process.h b/Kernel/Process.h index 0d3773224d959b..7a89ac9891fef8 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -286,6 +287,7 @@ class Process final ErrorOr sys$getppid(); ErrorOr sys$getresuid(Userspace, Userspace, Userspace); ErrorOr sys$getresgid(Userspace, Userspace, Userspace); + ErrorOr sys$getrusage(int, Userspace); ErrorOr sys$umask(mode_t); ErrorOr sys$open(Userspace); ErrorOr sys$close(int fd); diff --git a/Kernel/Syscalls/resource.cpp b/Kernel/Syscalls/resource.cpp new file mode 100644 index 00000000000000..0349ae804fd7f6 --- /dev/null +++ b/Kernel/Syscalls/resource.cpp @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2022, Lucas Chollet + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include + +namespace Kernel { + +ErrorOr Process::sys$getrusage(int who, Userspace user_usage) +{ + VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this) + + rusage usage {}; + + auto const ticks_per_second = TimeManagement::the().ticks_per_second(); + + switch (who) { + case RUSAGE_SELF: + usage.ru_utime = Time::from_ticks(m_ticks_in_user, ticks_per_second).to_timeval(); + usage.ru_stime = Time::from_ticks(m_ticks_in_kernel, ticks_per_second).to_timeval(); + break; + case RUSAGE_CHILDREN: + usage.ru_utime = Time::from_ticks(m_ticks_in_user_for_dead_children, ticks_per_second).to_timeval(); + usage.ru_stime = Time::from_ticks(m_ticks_in_kernel_for_dead_children, ticks_per_second).to_timeval(); + break; + default: + return EINVAL; + } + + TRY(copy_to_user(user_usage, &usage)); + + return 0; +} + +}