-let run debug { domname = domname; mem = mem }
- { utsname = utsname; tasks = tasks } =
- let utsname = Option.get utsname in
- let kernel_version = utsname.kernel_release in
- let init_task_addr = Option.get tasks in
-
- (* Starting at init_task, navigate through the linked list of
- * tasks (through tasks.next). The main program has already made
- * sure these are mapped into memory.
- *)
- let tasks =
- let rec loop acc task =
- let next = task.task_struct_tasks'next in
- if next <> init_task_addr then (
- let task = get_task_struct kernel_version mem next in
- let task = {
- task with
- task_struct_comm = truncate_c_string task.task_struct_comm
- } in
- let acc = task :: acc in
- loop acc task
- ) else
- acc
- in
- loop [] (get_task_struct kernel_version mem init_task_addr) in
+let run debug { addrmap = addrmap } =
+ (* Grab all the task_struct structures. *)
+ let tasks = AddrMap.fold (
+ fun _ v tasks ->
+ match v with
+ | _, Some (_, _, Task_struct task) -> task :: tasks
+ | _ -> tasks
+ ) addrmap [] in