From 5dd4bb2bf86cdcee94d6815b5db7da51c85554fb Mon Sep 17 00:00:00 2001 From: Ashwin Naren Date: Mon, 30 Mar 2026 11:32:43 -0700 Subject: [PATCH 1/2] proc_pid_stat add processor and num_threads --- src/drivers/fs/proc/task/task_file.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/drivers/fs/proc/task/task_file.rs b/src/drivers/fs/proc/task/task_file.rs index e6c7e990..a62b4614 100644 --- a/src/drivers/fs/proc/task/task_file.rs +++ b/src/drivers/fs/proc/task/task_file.rs @@ -130,7 +130,7 @@ Threads:\t{tasks}\n", output.push_str(&format!("{} ", 0)); // cstime output.push_str(&format!("{} ", *task.process.priority.lock_save_irq())); // priority output.push_str(&format!("{} ", 0)); // nice - output.push_str(&format!("{} ", 0)); // num_threads + output.push_str(&format!("{} ", task.process.tasks.lock_save_irq().len())); // num_threads output.push_str(&format!("{} ", 0)); // itrealvalue output.push_str(&format!("{} ", 0)); // starttime output.push_str(&format!("{} ", 0)); // vsize @@ -149,7 +149,13 @@ Threads:\t{tasks}\n", output.push_str(&format!("{} ", 0)); // nswap output.push_str(&format!("{} ", 0)); // cnswap output.push_str(&format!("{} ", 0)); // exit_signal - output.push_str(&format!("{} ", 0)); // processor + output.push_str(&format!( + "{} ", + task.sched_data + .lock_save_irq() + .as_ref() + .map_or(0, |s| s.last_cpu) + )); // processor output.push_str(&format!("{} ", 0)); // rt_priority output.push_str(&format!("{} ", 0)); // policy output.push_str(&format!("{} ", 0)); // delayacct_blkio_ticks From 5da64ab419b3a99bb0e3b5c4dadb4e14d3c5246f Mon Sep 17 00:00:00 2001 From: Ashwin Naren Date: Mon, 30 Mar 2026 19:48:29 -0700 Subject: [PATCH 2/2] memory info in /proc/pid/stat --- libkernel/src/memory/proc_vm/mod.rs | 8 +++++ src/drivers/fs/proc/task/task_file.rs | 49 +++++++++++++++++++++++---- 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/libkernel/src/memory/proc_vm/mod.rs b/libkernel/src/memory/proc_vm/mod.rs index b8613e84..624d10f6 100644 --- a/libkernel/src/memory/proc_vm/mod.rs +++ b/libkernel/src/memory/proc_vm/mod.rs @@ -84,10 +84,18 @@ impl ProcessVM { } } + pub fn mm(&self) -> &MemoryMap { + &self.mm + } + pub fn mm_mut(&mut self) -> &mut MemoryMap { &mut self.mm } + pub fn start_brk(&self) -> VA { + self.brk.start_address() + } + pub fn current_brk(&self) -> VA { self.brk.end_address() } diff --git a/src/drivers/fs/proc/task/task_file.rs b/src/drivers/fs/proc/task/task_file.rs index a62b4614..2990026a 100644 --- a/src/drivers/fs/proc/task/task_file.rs +++ b/src/drivers/fs/proc/task/task_file.rs @@ -103,6 +103,41 @@ Threads:\t{tasks}\n", TaskFileType::Comm => format!("{name}\n", name = name.as_str()), TaskFileType::State => format!("{state}\n"), TaskFileType::Stat => { + let vm = task.vm.lock_save_irq(); + + let mut vsize = 0; + let mut startcode = 0; + let mut endcode = 0; + let mut startstack = 0; + let mut start_data = 0; + let mut end_data = 0; + + for vma in vm.mm().iter_vmas() { + let start = vma.region().start_address().value(); + let end = vma.region().end_address().value(); + vsize += vma.region().size(); + + if vma.name() == "[stack]" { + startstack = start; + } else if vma.permissions().execute { + if startcode == 0 || start < startcode { + startcode = start; + } + if end > endcode { + endcode = end; + } + } else if vma.permissions().write && !vma.name().starts_with('[') { + if start_data == 0 || start < start_data { + start_data = start; + } + if end > end_data { + end_data = end; + } + } + } + + let start_brk = vm.start_brk().value(); + let mut output = String::new(); output.push_str(&format!("{} ", task.process.tgid.value())); // pid output.push_str(&format!("({}) ", name.as_str())); // comm @@ -133,12 +168,12 @@ Threads:\t{tasks}\n", output.push_str(&format!("{} ", task.process.tasks.lock_save_irq().len())); // num_threads output.push_str(&format!("{} ", 0)); // itrealvalue output.push_str(&format!("{} ", 0)); // starttime - output.push_str(&format!("{} ", 0)); // vsize + output.push_str(&format!("{vsize} ")); // vsize output.push_str(&format!("{} ", 0)); // rss output.push_str(&format!("{} ", 0)); // rsslim - output.push_str(&format!("{} ", 0)); // startcode - output.push_str(&format!("{} ", 0)); // endcode - output.push_str(&format!("{} ", 0)); // startstack + output.push_str(&format!("{startcode} ")); // startcode + output.push_str(&format!("{endcode} ")); // endcode + output.push_str(&format!("{startstack} ")); // startstack output.push_str(&format!("{} ", 0)); // kstkesp output.push_str(&format!("{} ", 0)); // kstkeip output.push_str(&format!("{} ", 0)); // signal @@ -161,9 +196,9 @@ Threads:\t{tasks}\n", output.push_str(&format!("{} ", 0)); // delayacct_blkio_ticks output.push_str(&format!("{} ", 0)); // guest_time output.push_str(&format!("{} ", 0)); // cguest_time - output.push_str(&format!("{} ", 0)); // start_data - output.push_str(&format!("{} ", 0)); // end_data - output.push_str(&format!("{} ", 0)); // start_brk + output.push_str(&format!("{start_data} ")); // start_data + output.push_str(&format!("{end_data} ")); // end_data + output.push_str(&format!("{start_brk} ")); // start_brk output.push_str(&format!("{} ", 0)); // arg_start output.push_str(&format!("{} ", 0)); // arg_end output.push_str(&format!("{} ", 0)); // env_start