- (* 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