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 e6c7e990..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 @@ -130,15 +165,15 @@ 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 + 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 @@ -149,15 +184,21 @@ 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 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