- eprintf (f_"%s: could not find dev_base symbol in kernel image\n") image.domname;
- None in
- (match dev_base with
- | None -> image, None
- | Some dev_base ->
- do_next image kernel_version dev_base size
- );
-
- | Some (DevList offset) ->
- printf "linkage = DevList %d\n%!" offset;
-
- (* Linkage through new-style list_head dev_list. *)
- let dev_base_head =
- try Some (Ksymmap.find "dev_base_head" ksymmap)
- with Not_found ->
- eprintf (f_"%s: could not find dev_base_head symbol in kernel image\n") image.domname;
- None in
- (match dev_base_head with
- | None -> image, None
- | Some dev_base_head ->
- let dev_base_head =
- Virt_mem_mmap.follow_pointer image.mem dev_base_head in
-
- do_dev_list image kernel_version dev_base_head offset size
- );
+ try
+ let addr = Ksymmap.find "dev_base_head" ksymmap in
+ let addr = Virt_mem_mmap.follow_pointer image.mem addr in
+ Some addr
+ with Not_found ->
+ try
+ let addr = Ksymmap.find "init_net" ksymmap in
+ if not (net_known kernel_version) then (
+ eprintf (f_"%s: struct net not available in this kernel version.\n") image.domname;
+ raise Not_found
+ );
+ let init_net = get_net kernel_version image.mem addr in
+ let addr = init_net.net_dev_base_head'next in
+ Some addr
+ 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
+
+ match addr with
+ | None -> image, None
+
+ | Some addr ->
+ (* Map over the structure using previously defined map function. *)
+ let image, netdevs =
+ map image kernel_version addr size (
+ fun netdev ->
+ { netdev_name = truncate_c_string netdev.net_device_name;
+ netdev_dev_addr = netdev.net_device_dev_addr }
+ ) in
+
+ image, Some netdevs