get_proc_info () syscall, CE procinfo command
This commit is contained in:
@@ -6,6 +6,7 @@
|
||||
#include <irq/irq.h>
|
||||
#include <libk/align.h>
|
||||
#include <libk/list.h>
|
||||
#include <libk/printf.h>
|
||||
#include <libk/rbtree.h>
|
||||
#include <libk/std.h>
|
||||
#include <libk/string.h>
|
||||
@@ -16,6 +17,7 @@
|
||||
#include <proc/procgroup.h>
|
||||
#include <proc/reschedule.h>
|
||||
#include <proc/resource.h>
|
||||
#include <proc_info.h>
|
||||
#include <status.h>
|
||||
#include <sync/spin_lock.h>
|
||||
#include <sys/debug.h>
|
||||
@@ -51,6 +53,7 @@ struct proc* kproc_create (void) {
|
||||
kproc->flags |= PROC_KPROC;
|
||||
kproc->state = PROC_READY;
|
||||
kproc->pid = proc_alloc_pid ();
|
||||
snprintf (kproc->name, sizeof (kproc->name), "KPROC CPU %u", thiscpu->id);
|
||||
|
||||
kproc->procgroup = procgroup_create ();
|
||||
procgroup_attach (kproc->procgroup, kproc);
|
||||
@@ -64,6 +67,56 @@ struct proc* kproc_create (void) {
|
||||
return kproc;
|
||||
}
|
||||
|
||||
size_t proc_populate_proc_infos (struct proc_info* proc_info, size_t count) {
|
||||
uint64_t fpt, fp, fpg;
|
||||
|
||||
if (count > PIDS_MAX) {
|
||||
count = PIDS_MAX;
|
||||
}
|
||||
|
||||
spin_lock (&proc_tree_lock, &fpt);
|
||||
|
||||
struct rb_node_link* node;
|
||||
rbtree_first (&proc_tree, node);
|
||||
|
||||
size_t i = 0;
|
||||
|
||||
while (node != NULL && i < count) {
|
||||
struct rb_node_link* next;
|
||||
rbtree_next (node, next);
|
||||
|
||||
struct proc* proc = rbtree_entry (node, struct proc, proc_tree_link);
|
||||
|
||||
node = next;
|
||||
|
||||
spin_lock (&proc->lock, &fp);
|
||||
struct procgroup* procgroup = proc->procgroup;
|
||||
spin_unlock (&proc->lock, fp);
|
||||
|
||||
spin_lock (&procgroup->lock, &fpg);
|
||||
spin_lock (&proc->lock, &fp);
|
||||
|
||||
struct cpu* cpu = proc->cpu;
|
||||
|
||||
proc_info[i].cpu = cpu->id;
|
||||
proc_info[i].exec_pid = proc->exec_pid;
|
||||
proc_info[i].flags = proc->flags;
|
||||
proc_info[i].pid = proc->pid;
|
||||
proc_info[i].state = proc->state;
|
||||
proc_info[i].pgid = proc->procgroup->pgid;
|
||||
memcpy (proc_info[i].name, proc->name, sizeof (proc->name));
|
||||
|
||||
spin_unlock (&proc->lock, fp);
|
||||
spin_unlock (&procgroup->lock, fpg);
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
spin_unlock (&proc_tree_lock, fpt);
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
static bool proc_check_elf (uint8_t* elf) {
|
||||
if (!((elf[0] == 0x7F) && (elf[1] == 'E') && (elf[2] == 'L') && (elf[3] == 'F')))
|
||||
return false;
|
||||
@@ -173,6 +226,9 @@ struct proc* proc_from_file (struct proc* proc1, const char* volume, const char*
|
||||
struct proc* proc = proc_from_elf (temp_buffer);
|
||||
|
||||
free (temp_buffer);
|
||||
|
||||
snprintf (proc->name, sizeof (proc->name), "%s:%s", volume, path);
|
||||
|
||||
return proc;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user