Print swapper task details.
[virt-mem.git] / ps / virt_ps.ml
index 41e8af7..7d8534c 100644 (file)
@@ -24,9 +24,42 @@ open Virt_mem_utils
 open Virt_mem_types
 
 
+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 ({ mem = mem }, ksymmap, _) =
-  ()
+    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
+    );
+
+    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 "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 -> ()
 
 let summary = s_"list processes in virtual machine"
 let description = s_"\