X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=lib%2Fvirt_mem_tasks.ml;h=b75a7113b6701b1697edde5966cdb3d8407bab72;hb=4b90a4d2fc09e7aabc40909aba93e06938aeec27;hp=c16e660c35dff58793ea8448d79a434fbccf0dc5;hpb=cf4669f31197abcfb14dee874a4b738c9c2e6483;p=virt-mem.git diff --git a/lib/virt_mem_tasks.ml b/lib/virt_mem_tasks.ml index c16e660..b75a711 100644 --- a/lib/virt_mem_tasks.ml +++ b/lib/virt_mem_tasks.ml @@ -25,6 +25,8 @@ 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 +36,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 +47,33 @@ 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 )