#include "memory/MemoryManager.h" #include "sys/Syscall.h" #include "thread/Scheduler.h" #include static void ticks_to_rusage(struct rusage* ru, u64 sticks, u64 uticks) { ru->ru_stime.tv_sec = sticks / 1000; ru->ru_stime.tv_usec = (sticks % 1000) * 1000; ru->ru_utime.tv_sec = uticks / 1000; ru->ru_utime.tv_usec = (uticks % 1000) * 1000; } Result sys_getrusage(Registers*, SyscallArgs args) { int who = (int)args[0]; struct rusage* ru = (struct rusage*)args[1]; auto* current = Scheduler::current(); struct rusage kru; switch (who) { case RUSAGE_SELF: ticks_to_rusage(&kru, current->kernel_ticks_self, current->user_ticks_self); break; case RUSAGE_CHILDREN: ticks_to_rusage(&kru, current->kernel_ticks_children, current->user_ticks_children); break; default: return err(EINVAL); } if (!MemoryManager::copy_to_user_typed(ru, &kru)) return err(EFAULT); return 0; }