open Virt_mem_utils
open Virt_mem_types
+(*
open Kernel_task_struct
let max_tasks = 10000
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)
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 (
image, Some tasks
)
+*)