mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-02 07:28:21 +00:00
syscalls: sysinfo
This commit is contained in:
@@ -95,6 +95,7 @@ extern syscall_shutdown
|
|||||||
extern syscall_nice
|
extern syscall_nice
|
||||||
extern syscall_flock
|
extern syscall_flock
|
||||||
extern syscall_getcpu
|
extern syscall_getcpu
|
||||||
|
extern syscall_sysinfo
|
||||||
syscalltab:
|
syscalltab:
|
||||||
dq syscall_print
|
dq syscall_print
|
||||||
dq syscall_mmap
|
dq syscall_mmap
|
||||||
@@ -192,7 +193,8 @@ dq syscall_shutdown
|
|||||||
dq syscall_nice
|
dq syscall_nice
|
||||||
dq syscall_flock
|
dq syscall_flock
|
||||||
dq syscall_getcpu
|
dq syscall_getcpu
|
||||||
syscallcount equ 96
|
dq syscall_sysinfo
|
||||||
|
syscallcount equ 97
|
||||||
section .text
|
section .text
|
||||||
global arch_syscall_entry
|
global arch_syscall_entry
|
||||||
; on entry:
|
; on entry:
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
#ifdef SYSCALL_LOGGING
|
#ifdef SYSCALL_LOGGING
|
||||||
|
|
||||||
#define SYSCALL_COUNT 96
|
#define SYSCALL_COUNT 97
|
||||||
#define LOGSTR(x) arch_e9_puts(x)
|
#define LOGSTR(x) arch_e9_puts(x)
|
||||||
|
|
||||||
static char *name[] = {
|
static char *name[] = {
|
||||||
@@ -104,7 +104,8 @@ static char *name[] = {
|
|||||||
"shutdown",
|
"shutdown",
|
||||||
"nice",
|
"nice",
|
||||||
"flock",
|
"flock",
|
||||||
"getcpu"
|
"getcpu",
|
||||||
|
"sysinfo"
|
||||||
};
|
};
|
||||||
|
|
||||||
static char *args[] = {
|
static char *args[] = {
|
||||||
@@ -203,7 +204,8 @@ static char *args[] = {
|
|||||||
"how %d", // shutdown
|
"how %d", // shutdown
|
||||||
"off %d", // nice
|
"off %d", // nice
|
||||||
"fd %d op %d", // flock
|
"fd %d op %d", // flock
|
||||||
"N/A" // getcpu
|
"N/A", // getcpu
|
||||||
|
"ptr %p", // sysinfo
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ void pmm_makefree(void *address, size_t count);
|
|||||||
void *pmm_alloc(size_t size, int section);
|
void *pmm_alloc(size_t size, int section);
|
||||||
void pmm_free(void *addr, size_t size);
|
void pmm_free(void *addr, size_t size);
|
||||||
void pmm_init();
|
void pmm_init();
|
||||||
|
void pmm_getinfo(size_t *total_pages, size_t *free_pages);
|
||||||
|
|
||||||
extern uintptr_t hhdmbase;
|
extern uintptr_t hhdmbase;
|
||||||
|
|
||||||
|
|||||||
@@ -112,5 +112,6 @@ pid_t proc_allocate_pid(void);
|
|||||||
void proc_init(void);
|
void proc_init(void);
|
||||||
void proc_exit(void);
|
void proc_exit(void);
|
||||||
void proc_run_init();
|
void proc_run_init();
|
||||||
|
size_t proc_get_count(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -323,3 +323,8 @@ void pmm_free(void *addr, size_t size) {
|
|||||||
for (int i = 0; i < size; ++i)
|
for (int i = 0; i < size; ++i)
|
||||||
pmm_release((void *)((uintptr_t)addr + PAGE_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);
|
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) {
|
proc_t *proc_get_from_pid(int pid) {
|
||||||
MUTEX_ACQUIRE(&proc_pid_table_mutex);
|
MUTEX_ACQUIRE(&proc_pid_table_mutex);
|
||||||
void *_proc = NULL;
|
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