Recompile with full set of kernels.
[virt-mem.git] / lib / virt_mem_tasks.ml
index c2ae54e..c7e5203 100644 (file)
@@ -23,6 +23,7 @@ open Virt_mem_gettext.Gettext
 open Virt_mem_utils
 open Virt_mem_types
 
+(*
 open Kernel_task_struct
 
 let max_tasks = 10000
@@ -36,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)
@@ -47,33 +48,22 @@ 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
 
-       (* Starting at init_task, navigate through the linked list of
-        * tasks (through tasks.next).  Map them into memory and load
-        * them into a list.
-        *)
-       let image, tasks =
-         let rec loop i image acc task =
-           if i <= max_tasks then (
-             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 (i+1) image (task :: acc) task
-             ) else
-               image, acc
-           ) else
-             failwith (sprintf (f_"%s: too many tasks") image.domname)
-         in
-         loop 0 image [] init_task 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
 
        (* Convert to the internal format. *)
        let tasks = List.rev_map (
@@ -88,3 +78,4 @@ supported Linux distribution, see this page about adding support:
 
        image, Some tasks
   )
+*)