From 1a2962de80dbf8b98b33d8e8de0a3802bd2724aa Mon Sep 17 00:00:00 2001 From: kamkow1 Date: Thu, 16 Oct 2025 15:45:36 +0200 Subject: [PATCH] Track process uptime --- kernel/proc/proc.c | 3 +++ kernel/proc/proc.h | 3 +++ kernel/syscall/proc.c | 2 ++ kernel/time/time.c | 42 ++++++++++++++++++++++++++++++++++++++++++ share/sysdefs/proc.h | 3 +++ 5 files changed, 53 insertions(+) diff --git a/kernel/proc/proc.c b/kernel/proc/proc.c index 2f91f7f..7004043 100644 --- a/kernel/proc/proc.c +++ b/kernel/proc/proc.c @@ -15,6 +15,7 @@ #include "ipc/pipe/pipe.h" #include "sysdefs/proc.h" #include "sysdefs/fs.h" +#include "time/time.h" #define PROC_REAPER_FREQ 30 @@ -147,6 +148,8 @@ Proc *proc_spawnuser(char *mountpoint, char *path) { proc->pipes[1] = dlmalloc(sizeof(IpcPipe)); ipc_pipeinit(proc->pipes[1], proc->pid); + time_get(&proc->time); + return proc; } diff --git a/kernel/proc/proc.h b/kernel/proc/proc.h index 254bb33..8e188f1 100644 --- a/kernel/proc/proc.h +++ b/kernel/proc/proc.h @@ -8,6 +8,7 @@ #include "vfs/vfs.h" #include "ipc/pipe/pipe.h" #include "sysdefs/proc.h" +#include "sysdefs/time.h" #include "dev/dev.h" #define PROC_NAME_MAX 0x100 @@ -68,6 +69,8 @@ typedef struct Proc { } procargs; uint64_t mman_map_base; + + Time time; } Proc; typedef struct { diff --git a/kernel/syscall/proc.c b/kernel/syscall/proc.c index e29cfdc..50b413f 100644 --- a/kernel/syscall/proc.c +++ b/kernel/syscall/proc.c @@ -226,6 +226,8 @@ int32_t SYSCALL2(sys_proc_stat, pidx, pstat1) { LL_FOREACH_SAFE(p->vas, vas, vastmp) { stat->usemem += vas->size; } + + hal_memcpy(&stat->time, &p->time, sizeof(p->time)); break; } } diff --git a/kernel/time/time.c b/kernel/time/time.c index 4923dd5..5e2f91f 100644 --- a/kernel/time/time.c +++ b/kernel/time/time.c @@ -94,3 +94,45 @@ timeunix_t time_tounix(Time *time) { secs += time->second; return secs; } + +void timeunix_totime(timeunix_t unix, Time *time) { + uint64_t days = unix / 86400; + uint32_t rem = days % 86400; + + time->hour = rem / 3600; + time->minute = (rem % 3600) / 60; + time->second = rem % 60; + + uint32_t year = 1970; + for (;;) { + uint32_t ydays = time_isleap(year) ? 366 : 365; + if (days >= ydays) { + days -= ydays; + year++; + } else { + break; + } + } + time->year = year; + + bool leap = time_isleap(year); + uint32_t month = 0; + while (month < 11) { + uint32_t next = days_before_month[month + 1]; + if (leap && month + 1 > 1) { + next++; + } + if (days < next) { + break; + } + month++; + } + + uint32_t month_start = days_before_month[month]; + if (leap && month > 1) { + month_start++; + } + + time->month = month + 1; + time->day = (days - month_start) + 1; +} diff --git a/share/sysdefs/proc.h b/share/sysdefs/proc.h index 85782a9..46dd9e6 100644 --- a/share/sysdefs/proc.h +++ b/share/sysdefs/proc.h @@ -1,6 +1,8 @@ #ifndef SHARE_SYSDEFS_PROC_H_ #define SHARE_SYSDEFS_PROC_H_ +#include "time.h" + #define PROC_ARG_MAX 128 typedef struct { @@ -8,6 +10,7 @@ typedef struct { char name[0x100]; uint8_t state; size_t usemem; + Time time; } ProcStat; typedef uint64_t PID_t;