- let rec loop i image acc addr =
- if i <= max_net_devices then (
- eprintf "map_dev_list: called at %Lx\n" addr;
- let mapped = Virt_mem_mmap.is_mapped_range image.mem addr size in
- let image =
- if not mapped then
- Virt_mem_types.load_memory image addr size
- else
- image in
- let dev = get_net_device kernel_version image.mem addr in
- eprintf "map_dev_list: %Lx %S\n" addr dev.net_device_name;
- let acc = f dev :: acc in
- let addr = Option.get dev.net_device_dev_list'next in
- if addr <> first_addr then
- loop (i+1) image acc addr
- else
- image, acc
- ) else
- failwith (sprintf (f_"%s: too many network devices") image.domname);
- in
- loop 0 image [] addr
+ let net_devices, _ =
+ Virt_mem_list_head.fold lh ([], 0) (
+ fun (net_devices, i) addr ->
+ if i > max_net_devices then
+ failwith (sprintf (f_"%s: too many network devices") image.domname);
+
+ let net_device = get_net_device kernel_version image.mem addr in
+ let net_devices = f net_device :: net_devices in
+ (net_devices, i+1)
+ ) in
+
+ image, net_devices