mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-27 12:48:22 +00:00
syscalls: sysinfo
This commit is contained in:
@@ -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,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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user