Recompile with full set of kernels.
[virt-mem.git] / lib / virt_mem_tasks.ml
index c16e660..c7e5203 100644 (file)
@@ -23,8 +23,11 @@ open Virt_mem_gettext.Gettext
 open Virt_mem_utils
 open Virt_mem_types
 
+(*
 open Kernel_task_struct
 
+let max_tasks = 10000
+
 let find_tasks debug image ksymmap kernel_version =
   if not (task_struct_known kernel_version) then (
     eprintf (f_"%s: %s: unknown kernel version
@@ -34,7 +37,7 @@ supported Linux distribution, see this page about adding support:
       image.domname kernel_version;
     image, None
   ) else (
-    let task_struct_size = task_struct_size kernel_version in
+    let size = task_struct_size kernel_version in
 
     let init_task_addr =
       try Some (Ksymmap.find "init_task" ksymmap)
@@ -45,30 +48,34 @@ supported Linux distribution, see this page about adding support:
     match init_task_addr with
     | None -> image, None
     | Some init_task_addr ->
-       let init_task =
-         get_task_struct kernel_version image.mem init_task_addr in
+       let { field_offset = offset } =
+         field_signature_of_task_struct_tasks'next kernel_version in
+
+       let lh = Virt_mem_list_head.create_base image init_task_addr offset in
+       let image, lh = Virt_mem_list_head.load_all lh size in
+
+       let tasks, _ =
+         Virt_mem_list_head.fold lh ([], 0) (
+           fun (tasks, i) addr ->
+             if i > max_tasks then
+               failwith (sprintf (f_"%s: too many tasks") image.domname);
+
+             let task = get_task_struct kernel_version image.mem addr in
+             let tasks = task :: tasks in
+             (tasks, i+1)
+         ) in
 
-       (* Starting at init_task, navigate through the linked list of
-        * tasks (through tasks.next).  Just make sure they are mapped
-        * into memory.
-        *)
-       let image =
-         let rec loop image task =
-           let next = task.task_struct_tasks'next in
-           if next <> init_task_addr then (
-             let mapped =
-               Virt_mem_mmap.is_mapped_range image.mem next task_struct_size in
-             let image =
-               if not mapped then
-                 Virt_mem_types.load_memory image next task_struct_size
-               else
-                 image in
-             let task = get_task_struct kernel_version image.mem next in
-             loop image task
-           ) else
-             image
-         in
-         loop image init_task in
+       (* Convert to the internal format. *)
+       let tasks = List.rev_map (
+         fun task ->
+           { task_state = task.task_struct_state;
+             task_prio = task.task_struct_prio;
+             task_normal_prio = task.task_struct_normal_prio;
+             task_static_prio = task.task_struct_static_prio;
+             task_comm = truncate_c_string task.task_struct_comm;
+             task_pid = task.task_struct_pid }
+       ) tasks in
 
-       image, Some init_task_addr
+       image, Some tasks
   )
+*)