From c9d401f488b404bf0f4c11e1402987cb49195660 Mon Sep 17 00:00:00 2001 From: Matheus Date: Sun, 2 Nov 2025 21:30:24 -0300 Subject: [PATCH] syscalls: sysinfo --- kernel-src/arch/x86-64/syscall.asm | 4 ++- kernel-src/arch/x86-64/syscalllog.c | 8 +++-- kernel-src/include/kernel/pmm.h | 1 + kernel-src/include/kernel/proc.h | 1 + kernel-src/mm/pmm.c | 5 +++ kernel-src/sys/proc.c | 10 ++++++ kernel-src/sys/syscalls/sysinfo.c | 52 +++++++++++++++++++++++++++++ 7 files changed, 77 insertions(+), 4 deletions(-) create mode 100644 kernel-src/sys/syscalls/sysinfo.c diff --git a/kernel-src/arch/x86-64/syscall.asm b/kernel-src/arch/x86-64/syscall.asm index ff7c651b..316a3cb3 100644 --- a/kernel-src/arch/x86-64/syscall.asm +++ b/kernel-src/arch/x86-64/syscall.asm @@ -95,6 +95,7 @@ extern syscall_shutdown extern syscall_nice extern syscall_flock extern syscall_getcpu +extern syscall_sysinfo syscalltab: dq syscall_print dq syscall_mmap @@ -192,7 +193,8 @@ dq syscall_shutdown dq syscall_nice dq syscall_flock dq syscall_getcpu -syscallcount equ 96 +dq syscall_sysinfo +syscallcount equ 97 section .text global arch_syscall_entry ; on entry: diff --git a/kernel-src/arch/x86-64/syscalllog.c b/kernel-src/arch/x86-64/syscalllog.c index 453e95c5..34ad4b1b 100644 --- a/kernel-src/arch/x86-64/syscalllog.c +++ b/kernel-src/arch/x86-64/syscalllog.c @@ -5,7 +5,7 @@ #ifdef SYSCALL_LOGGING -#define SYSCALL_COUNT 96 +#define SYSCALL_COUNT 97 #define LOGSTR(x) arch_e9_puts(x) static char *name[] = { @@ -104,7 +104,8 @@ static char *name[] = { "shutdown", "nice", "flock", - "getcpu" + "getcpu", + "sysinfo" }; static char *args[] = { @@ -203,7 +204,8 @@ static char *args[] = { "how %d", // shutdown "off %d", // nice "fd %d op %d", // flock - "N/A" // getcpu + "N/A", // getcpu + "ptr %p", // sysinfo }; #endif diff --git a/kernel-src/include/kernel/pmm.h b/kernel-src/include/kernel/pmm.h index 97ed11c7..fc5b9f6b 100644 --- a/kernel-src/include/kernel/pmm.h +++ b/kernel-src/include/kernel/pmm.h @@ -46,6 +46,7 @@ void pmm_makefree(void *address, size_t count); void *pmm_alloc(size_t size, int section); void pmm_free(void *addr, size_t size); void pmm_init(); +void pmm_getinfo(size_t *total_pages, size_t *free_pages); extern uintptr_t hhdmbase; diff --git a/kernel-src/include/kernel/proc.h b/kernel-src/include/kernel/proc.h index ac487fc7..bb34e23b 100644 --- a/kernel-src/include/kernel/proc.h +++ b/kernel-src/include/kernel/proc.h @@ -112,5 +112,6 @@ pid_t proc_allocate_pid(void); void proc_init(void); void proc_exit(void); void proc_run_init(); +size_t proc_get_count(void); #endif diff --git a/kernel-src/mm/pmm.c b/kernel-src/mm/pmm.c index 9d6ac48b..45fa9c64 100644 --- a/kernel-src/mm/pmm.c +++ b/kernel-src/mm/pmm.c @@ -323,3 +323,8 @@ void pmm_free(void *addr, size_t size) { for (int i = 0; i < size; ++i) pmm_release((void *)((uintptr_t)addr + PAGE_SIZE * i)); } + +void pmm_getinfo(size_t *total_pages, size_t *free_pages) { + *total_pages = pagecount; + *free_pages = freepagecount; +} diff --git a/kernel-src/sys/proc.c b/kernel-src/sys/proc.c index e28959c1..9973d907 100644 --- a/kernel-src/sys/proc.c +++ b/kernel-src/sys/proc.c @@ -23,6 +23,16 @@ pid_t proc_allocate_pid(void) { return __atomic_fetch_add(&currpid, 1, __ATOMIC_SEQ_CST); } +size_t proc_get_count(void) { + MUTEX_ACQUIRE(&proc_pid_table_mutex); + + size_t count = pid_table.entrycount; + + MUTEX_RELEASE(&proc_pid_table_mutex); + + return count; +} + proc_t *proc_get_from_pid(int pid) { MUTEX_ACQUIRE(&proc_pid_table_mutex); void *_proc = NULL; diff --git a/kernel-src/sys/syscalls/sysinfo.c b/kernel-src/sys/syscalls/sysinfo.c new file mode 100644 index 00000000..e1957f10 --- /dev/null +++ b/kernel-src/sys/syscalls/sysinfo.c @@ -0,0 +1,52 @@ +#include +#include +#include +#include +#include + +typedef struct { + long uptime; + unsigned long loads[3]; + unsigned long totalram; + unsigned long freeram; + unsigned long sharedram; + unsigned long bufferram; + unsigned long totalswap; + unsigned long freeswap; + unsigned short procs; + unsigned long totalhigh; + unsigned long freehigh; + unsigned int mem_unit; + char _f[20 - 2 * sizeof(long) - sizeof(int)]; +} sysinfo_t; + +syscallret_t syscall_sysinfo(context_t *, sysinfo_t *usysinfo) { + syscallret_t ret = { + .ret = -1 + }; + + size_t total_pages, free_pages; + pmm_getinfo(&total_pages, &free_pages); + + sysinfo_t sysinfo = { + .uptime = timekeeper_timefromboot().s, + .totalram = total_pages, + .freeram = free_pages, + .sharedram = 0, + .bufferram = vmmcache_cachedpages, + .totalswap = 0, + .freeswap = 0, + .procs = proc_get_count(), + .totalhigh = 0, + .freehigh = 0, + .mem_unit = PAGE_SIZE + }; + + memset(sysinfo.loads, 0, sizeof(sysinfo.loads)); + memset(sysinfo._f, 0, sizeof(sysinfo._f)); + + ret.errno = usercopy_touser(usysinfo, &sysinfo, sizeof(sysinfo)); + ret.ret = ret.errno ? -1 : 0; + + return ret; +}