- (* Get the kernel version (utsname analysis). *)
- let images =
- if not needs_utsname then images
- else
- List.map (
- fun (image, ({ ksyms = ksyms } as kdata)) ->
- match ksyms with
- | None -> image, kdata
- | Some ksyms ->
- let image, utsname =
- Virt_mem_utsname.find_utsname debug image ksyms in
- let kdata = { kdata with utsname = utsname } in
- image, kdata
- ) images in
-
- (* Get the tasks. *)
- let images =
- if not needs_tasks then images
- else
- List.map (
- fun (image, ({ ksyms = ksyms; utsname = utsname } as kdata)) ->
- match ksyms, utsname with
- | Some ksyms, Some { uts_kernel_release = kversion } ->
- let image = ref image in
- let load struct_name addr size =
- printf "load for task, %s: %Lx %d ...\n" struct_name addr size;
- let mapped =
- Virt_mem_mmap.is_mapped_range !image.mem addr size in
- if not mapped then image := load_memory !image addr size;
- let bits = Virt_mem_mmap.get_bytes !image.mem addr size in
- Bitstring.bitstring_of_string bits
- in
- let init_task = Ksymmap.find "init_task" ksyms in
- let map = Kernel.AddrMap.empty in
- let map =
- Kernel.task_struct_follower kversion load map init_task in
-
- (*
- let image, tasks =
- Virt_mem_tasks.find_tasks debug image ksyms kversion in
- let kdata = { kdata with tasks = tasks } in
- *)
- !image, kdata
- | _, _ -> image, kdata
- ) images in
-
- (* Get the net devices. *)
- let images =
- if not needs_net_devices then images
- else
- List.map (
- fun (image, ({ ksyms = ksyms; utsname = utsname } as kdata)) ->
- match ksyms, utsname with
- | Some ksyms, Some { uts_kernel_release = kversion } ->
- let image = ref image in
- let load struct_name addr size =
- printf "load for net dev, %s: %Lx %d ...\n" struct_name addr size;
- let mapped =
- Virt_mem_mmap.is_mapped_range !image.mem addr size in
- if not mapped then image := load_memory !image addr size;
- let bits = Virt_mem_mmap.get_bytes !image.mem addr size in
- Bitstring.bitstring_of_string bits
- in
- let map =
- try
- let dev_base = Ksymmap.find "dev_base" ksyms in
- let map = Kernel.AddrMap.empty in
- let map =
- Kernel.net_device_follower kversion load map dev_base in
- Some map
- with Not_found ->
+ List.iter (
+ fun kimage ->
+ try
+ (* Do the kernel symbol analysis. *)
+ let kimage =
+ if not needs_ksyms then kimage
+ else (
+ (* Look for ordinary kernel symbols: *)
+ let kimage = Virt_mem_ksyms.find_kernel_symbols debug kimage in
+
+ if kimage.have_ksyms then
+ (* Look for kallsyms: *)
+ Virt_mem_kallsyms.find_kallsyms debug kimage
+ else kimage
+ ) in
+
+ (* Get the kernel version (utsname analysis). *)
+ let kimage =
+ if not needs_utsname then kimage
+ else (
+ if kimage.have_ksyms then
+ Virt_mem_utsname.find_utsname debug kimage
+ else
+ kimage
+ ) in
+
+ (* Get the tasks. *)
+ let kimage =
+ if not needs_tasks then kimage
+ else (
+ let { ksyms = ksyms; have_ksyms = have_ksyms; utsname = utsname;
+ addrmap = addrmap } = kimage in
+ match have_ksyms, utsname with
+ | true, Some { uts_kernel_release = kernel_version } ->
+ let kimage = ref kimage in
+ let load struct_name addr size =
+ if debug then
+ eprintf "load for task, %s: %Lx %d ...\n"
+ struct_name addr size;
+ let mapped =
+ Virt_mem_mmap.is_mapped_range !kimage.mem addr size in
+ if not mapped then kimage := load_memory !kimage addr size;
+ let bits = Virt_mem_mmap.get_bytes !kimage.mem addr size in
+ Bitstring.bitstring_of_string bits
+ in
+ let addrmap =