Update kerneldb.
[virt-mem.git] / ps / virt_ps.ml
index 7d8534c..07e5e76 100644 (file)
@@ -23,47 +23,33 @@ open Virt_mem_gettext.Gettext
 open Virt_mem_utils
 open Virt_mem_types
 
+open Kernel
 
-let run debug ({ domname = domname; mem = mem }, ksymmap, utsname) =
-  try
-    let kernel_version =
-      match utsname with
-      | None ->
-         eprintf (f_"%s: could not guess kernel version\n") domname;
-         raise Exit
-      | Some { kernel_release = v } -> v in
+let run debug { addrmap = addrmap } =
+  (* Grab all the task_struct structures. *)
+  let tasks = AddrMap.fold (
+    fun _ v tasks ->
+      match v with
+      | _, Some (_, _, Task_struct task) -> task :: tasks
+      | _ -> tasks
+  ) addrmap [] in
 
-    if not (Kernel_task_struct.known kernel_version) then (
-      eprintf (f_"%s: %s: unknown kernel version
-Try a newer version of virt-mem, or if the guest is not from a
-supported Linux distribution, see this page about adding support:
-  http://et.redhat.com/~rjones/virt-mem/faq.html\n") domname kernel_version;
-      raise Exit
-    );
+  (* Sort tasks by PID. *)
+  let cmp { task_struct_pid = p1 } { task_struct_pid = p2 } = compare p1 p2 in
+  let tasks = List.sort cmp tasks in
 
-    let init_task =
-      let addr =
-       try Ksymmap.find "init_task" ksymmap
-       with Not_found ->
-         eprintf (f_"%s: could not find init_task in kernel image\n") domname;
-         raise Exit in
-      let addr =
-       (Virt_mem_mmap.unsafe_typed_addr_of_addr addr :
-          [ `task_struct ] Virt_mem_mmap.typed_addr) in
-      Kernel_task_struct.get kernel_version mem addr in
+  printf "  PID STAT COMMAND\n";
 
-    printf "comm = %S prio = %Ld state = %Ld static_prio = %Ld tasks'next = %Lx\n"
-      init_task.Kernel_task_struct.comm
-      init_task.Kernel_task_struct.prio
-      init_task.Kernel_task_struct.state
-      init_task.Kernel_task_struct.static_prio
-      (Virt_mem_mmap.unsafe_addr_of_typed_addr init_task.Kernel_task_struct.tasks'next);
-
-  with Exit -> ()
+  List.iter (
+    fun { task_struct_pid = pid; task_struct_comm = comm } ->
+      let comm = truncate_c_string comm in
+      printf "%5Ld      %s\n" pid comm
+  ) tasks
 
 let summary = s_"list processes in virtual machine"
 let description = s_"\
 virt-ps prints a process listing for virtual machines running under
 libvirt."
 
-let () = Virt_mem.register "ps" summary description ~run
+let () =
+  Virt_mem.register "ps" summary description ~needs_tasks:true ~run