Experimental automated 'follower' code.
[virt-mem.git] / lib / virt_mem.ml
index 32da18e..2ed0c5a 100644 (file)
@@ -569,10 +569,25 @@ Possibly the '-T' command line parameter was used inconsistently.");
        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.task_struct_follower kversion load 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
          | _, _ -> image, kdata
       ) images in
 
@@ -584,11 +599,42 @@ Possibly the '-T' command line parameter was used inconsistently.");
        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.net_device_follower kversion load dev_base in
+                 Some map
+               with Not_found ->
+                 try
+                   let dev_base_head = Ksymmap.find "dev_base_head" ksyms in
+                   (* XXX adjust to get offset of start of net_device *)
+                   assert false
+                 with Not_found ->
+                   try
+                     let init_net = Ksymmap.find "init_net" ksyms in
+                     let map =
+                       Kernel.net_follower kversion load init_net in
+                     Some map
+                   with Not_found ->
+                     eprintf (f_"%s: cannot find dev_base, dev_base_head or init_net symbols in kernel image.\n") !image.domname;
+                     None in
+(*
              let image, net_devices =
                Virt_mem_net_devices.find_net_devices debug
                  image ksyms kversion in
              let kdata = { kdata with net_devices = net_devices } in
-             image, kdata
+*)
+             !image, kdata
          | _, _ -> image, kdata
       ) images in