get_proc_info () syscall, CE procinfo command
All checks were successful
Build ISO image / build-and-deploy (push) Successful in 3m31s
Build documentation / build-and-deploy (push) Successful in 2m0s

This commit is contained in:
2026-03-26 20:21:43 +01:00
parent 9f2e6eef79
commit df730cec36
9 changed files with 131 additions and 0 deletions

View File

@@ -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;
}

View File

@@ -10,6 +10,7 @@
#include <proc/procgroup.h>
#include <proc/resource.h>
#include <proc/suspension_q.h>
#include <proc_info.h>
#include <sync/spin_lock.h>
#include <sys/mm.h>
@@ -48,6 +49,7 @@ struct proc {
size_t mail_recv_size;
char cwv[VOLUME_MAX];
struct proc_suspension_q done_sq;
char name[PATH_MAX + VOLUME_MAX];
};
void proc_sched (bool user);
@@ -75,6 +77,8 @@ void proc_wait_for (struct proc* proc, struct reschedule_ctx* rctx, struct proc*
void proc_irq_sched (void* arg, void* regs, bool user, struct reschedule_ctx* rctx);
size_t proc_populate_proc_infos (struct proc_info* proc_info, size_t count);
void proc_init (void);
struct proc* kproc_create (void);