syscalls: sysinfo

This commit is contained in:
Matheus
2025-11-02 21:30:24 -03:00
parent d53d97d951
commit c9d401f488
7 changed files with 77 additions and 4 deletions
+3 -1
View File
@@ -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:
+5 -3
View File
@@ -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
+1
View File
@@ -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;
+1
View File
@@ -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
+5
View File
@@ -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;
}
+10
View File
@@ -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;
+52
View File
@@ -0,0 +1,52 @@
#include <kernel/syscalls.h>
#include <arch/cpu.h>
#include <kernel/pmm.h>
#include <kernel/vmmcache.h>
#include <kernel/proc.h>
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;
}