virt-ps working again.
[virt-mem.git] / lib / kernel.ml
index 95df51d..9b7d3bc 100644 (file)
@@ -10,7 +10,7 @@
 open Printf;;
 module StringMap = Map.Make(String);;
 module AddrMap = Map.Make(Int64);;
-type kernel_version = string;;
+exception ParseError of string * string * string;;
 let match_err = "failed to match kernel structure";;
 let unknown_kernel_version version struct_name =
   invalid_arg
@@ -22,6 +22,8 @@ supported Linux distribution, see this page about adding support:
   http://et.redhat.com/~rjones/virt-mem/faq.html
 "
        version struct_name);;
+type kernel_version = string;;
+type load_fn = string -> Virt_mem_mmap.addr -> int -> Bitstring.bitstring;;
 let zero = 0;;
 type task_struct =
   { task_struct_comm : string; task_struct_normal_prio : int64;
@@ -74,6 +76,8 @@ type kernel_struct =
   | Inet6_dev of inet6_dev
   | In_ifaddr of in_ifaddr
   | Inet6_ifaddr of inet6_ifaddr;;
+type addrmap =
+  (string * ((int * Bitstring.bitstring * kernel_struct) option)) AddrMap.t;;
 let offset_of_net_device_dev_list'next =
   let map =
     StringMap.add "2.6.25.14-69.fc8.i686" 48
@@ -115,7 +119,7 @@ let task_struct_parser_1 kernel_version bits =
           task_struct_tasks'next_adjustment = 480;
         task_struct_tasks'prev = tasks'prev }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("task_struct", "task_struct_parser_1", match_err));;
+      raise (ParseError ("task_struct", "task_struct_parser_1", match_err));;
 let task_struct_parser_2 kernel_version bits = 
   bitmatch bits with
   | { state : zero+64 : offset(0), bigendian;
@@ -141,7 +145,7 @@ let task_struct_parser_2 kernel_version bits =
           task_struct_tasks'next_adjustment = 480;
         task_struct_tasks'prev = tasks'prev }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("task_struct", "task_struct_parser_2", match_err));;
+      raise (ParseError ("task_struct", "task_struct_parser_2", match_err));;
 let task_struct_parser_3 kernel_version bits = 
   bitmatch bits with
   | { state : zero+32 : offset(0), littleendian;
@@ -167,7 +171,7 @@ let task_struct_parser_3 kernel_version bits =
           task_struct_tasks'next_adjustment = 400;
         task_struct_tasks'prev = tasks'prev }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("task_struct", "task_struct_parser_3", match_err));;
+      raise (ParseError ("task_struct", "task_struct_parser_3", match_err));;
 let task_struct_parser_4 kernel_version bits = 
   bitmatch bits with
   | { state : zero+32 : offset(0), littleendian;
@@ -193,7 +197,7 @@ let task_struct_parser_4 kernel_version bits =
           task_struct_tasks'next_adjustment = 404;
         task_struct_tasks'prev = tasks'prev }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("task_struct", "task_struct_parser_4", match_err));;
+      raise (ParseError ("task_struct", "task_struct_parser_4", match_err));;
 let task_struct_parser_5 kernel_version bits = 
   bitmatch bits with
   | { state : zero+32 : offset(0), bigendian;
@@ -219,7 +223,7 @@ let task_struct_parser_5 kernel_version bits =
           task_struct_tasks'next_adjustment = 416;
         task_struct_tasks'prev = tasks'prev }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("task_struct", "task_struct_parser_5", match_err));;
+      raise (ParseError ("task_struct", "task_struct_parser_5", match_err));;
 let task_struct_parser_6 kernel_version bits = 
   bitmatch bits with
   | { state : zero+32 : offset(0), bigendian;
@@ -247,7 +251,7 @@ let task_struct_parser_6 kernel_version bits =
           task_struct_tasks'next_adjustment = 128;
         task_struct_tasks'prev = tasks'prev }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("task_struct", "task_struct_parser_6", match_err));;
+      raise (ParseError ("task_struct", "task_struct_parser_6", match_err));;
 let task_struct_parser_7 kernel_version bits = 
   bitmatch bits with
   | { state : zero+64 : offset(0), littleendian;
@@ -275,7 +279,7 @@ let task_struct_parser_7 kernel_version bits =
           task_struct_tasks'next_adjustment = 192;
         task_struct_tasks'prev = tasks'prev }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("task_struct", "task_struct_parser_7", match_err));;
+      raise (ParseError ("task_struct", "task_struct_parser_7", match_err));;
 let task_struct_parser_8 kernel_version bits = 
   bitmatch bits with
   | { state : zero+32 : offset(0), littleendian;
@@ -303,7 +307,7 @@ let task_struct_parser_8 kernel_version bits =
           task_struct_tasks'next_adjustment = 124;
         task_struct_tasks'prev = tasks'prev }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("task_struct", "task_struct_parser_8", match_err));;
+      raise (ParseError ("task_struct", "task_struct_parser_8", match_err));;
 let task_struct_parser_9 kernel_version bits = 
   bitmatch bits with
   | { state : zero+64 : offset(0), bigendian;
@@ -331,7 +335,7 @@ let task_struct_parser_9 kernel_version bits =
           task_struct_tasks'next_adjustment = 200;
         task_struct_tasks'prev = tasks'prev }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("task_struct", "task_struct_parser_9", match_err));;
+      raise (ParseError ("task_struct", "task_struct_parser_9", match_err));;
 let net_device_parser_10 kernel_version bits = 
   bitmatch bits with
   | { name : 128 : offset(0), string;
@@ -358,7 +362,7 @@ let net_device_parser_10 kernel_version bits =
         net_device_operstate = operstate;
         net_device_perm_addr = perm_addr }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("net_device", "net_device_parser_10", match_err));;
+      raise (ParseError ("net_device", "net_device_parser_10", match_err));;
 let net_device_parser_11 kernel_version bits = 
   bitmatch bits with
   | { name : 128 : offset(0), string;
@@ -385,7 +389,7 @@ let net_device_parser_11 kernel_version bits =
         net_device_operstate = operstate;
         net_device_perm_addr = perm_addr }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("net_device", "net_device_parser_11", match_err));;
+      raise (ParseError ("net_device", "net_device_parser_11", match_err));;
 let net_device_parser_12 kernel_version bits = 
   bitmatch bits with
   | { name : 128 : offset(0), string;
@@ -412,7 +416,7 @@ let net_device_parser_12 kernel_version bits =
         net_device_operstate = operstate;
         net_device_perm_addr = perm_addr }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("net_device", "net_device_parser_12", match_err));;
+      raise (ParseError ("net_device", "net_device_parser_12", match_err));;
 let net_device_parser_13 kernel_version bits = 
   bitmatch bits with
   | { name : 128 : offset(0), string;
@@ -439,7 +443,7 @@ let net_device_parser_13 kernel_version bits =
         net_device_operstate = operstate;
         net_device_perm_addr = perm_addr }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("net_device", "net_device_parser_13", match_err));;
+      raise (ParseError ("net_device", "net_device_parser_13", match_err));;
 let net_device_parser_14 kernel_version bits = 
   bitmatch bits with
   | { name : 128 : offset(0), string;
@@ -465,7 +469,7 @@ let net_device_parser_14 kernel_version bits =
         net_device_operstate = operstate;
         net_device_perm_addr = perm_addr }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("net_device", "net_device_parser_14", match_err));;
+      raise (ParseError ("net_device", "net_device_parser_14", match_err));;
 let net_device_parser_15 kernel_version bits = 
   bitmatch bits with
   | { name : 128 : offset(0), string;
@@ -491,7 +495,7 @@ let net_device_parser_15 kernel_version bits =
         net_device_operstate = operstate;
         net_device_perm_addr = perm_addr }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("net_device", "net_device_parser_15", match_err));;
+      raise (ParseError ("net_device", "net_device_parser_15", match_err));;
 let net_device_parser_16 kernel_version bits = 
   bitmatch bits with
   | { name : 128 : offset(0), string;
@@ -517,7 +521,7 @@ let net_device_parser_16 kernel_version bits =
         net_device_operstate = operstate;
         net_device_perm_addr = perm_addr }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("net_device", "net_device_parser_16", match_err));;
+      raise (ParseError ("net_device", "net_device_parser_16", match_err));;
 let net_device_parser_17 kernel_version bits = 
   bitmatch bits with
   | { name : 128 : offset(0), string;
@@ -543,7 +547,7 @@ let net_device_parser_17 kernel_version bits =
         net_device_operstate = operstate;
         net_device_perm_addr = perm_addr }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("net_device", "net_device_parser_17", match_err));;
+      raise (ParseError ("net_device", "net_device_parser_17", match_err));;
 let net_parser_20 kernel_version bits = 
   bitmatch bits with
   | { dev_base_head'next : zero+32 : offset(416), littleendian;
@@ -555,7 +559,7 @@ let net_parser_20 kernel_version bits =
           net_dev_base_head'prev_offset = 56;
           net_dev_base_head'prev_adjustment = offset_of_net_device_dev_list'next kernel_version }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("net", "net_parser_20", match_err));;
+      raise (ParseError ("net", "net_parser_20", match_err));;
 let net_parser_21 kernel_version bits = 
   bitmatch bits with
   | { dev_base_head'next : zero+32 : offset(416), bigendian;
@@ -567,7 +571,7 @@ let net_parser_21 kernel_version bits =
           net_dev_base_head'prev_offset = 56;
           net_dev_base_head'prev_adjustment = offset_of_net_device_dev_list'next kernel_version }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("net", "net_parser_21", match_err));;
+      raise (ParseError ("net", "net_parser_21", match_err));;
 let net_parser_18 kernel_version bits = 
   bitmatch bits with
   | { dev_base_head'next : zero+64 : offset(768), littleendian;
@@ -579,7 +583,7 @@ let net_parser_18 kernel_version bits =
           net_dev_base_head'prev_offset = 104;
           net_dev_base_head'prev_adjustment = offset_of_net_device_dev_list'next kernel_version }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("net", "net_parser_18", match_err));;
+      raise (ParseError ("net", "net_parser_18", match_err));;
 let net_parser_19 kernel_version bits = 
   bitmatch bits with
   | { dev_base_head'next : zero+64 : offset(768), bigendian;
@@ -591,55 +595,55 @@ let net_parser_19 kernel_version bits =
           net_dev_base_head'prev_offset = 104;
           net_dev_base_head'prev_adjustment = offset_of_net_device_dev_list'next kernel_version }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("net", "net_parser_19", match_err));;
+      raise (ParseError ("net", "net_parser_19", match_err));;
 let in_device_parser_24 kernel_version bits = 
   bitmatch bits with
   | { ifa_list : zero+32 : offset(96), littleendian } ->
       { in_device_ifa_list = ifa_list }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("in_device", "in_device_parser_24", match_err));;
+      raise (ParseError ("in_device", "in_device_parser_24", match_err));;
 let in_device_parser_25 kernel_version bits = 
   bitmatch bits with
   | { ifa_list : zero+32 : offset(96), bigendian } ->
       { in_device_ifa_list = ifa_list }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("in_device", "in_device_parser_25", match_err));;
+      raise (ParseError ("in_device", "in_device_parser_25", match_err));;
 let in_device_parser_22 kernel_version bits = 
   bitmatch bits with
   | { ifa_list : zero+64 : offset(128), littleendian } ->
       { in_device_ifa_list = ifa_list }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("in_device", "in_device_parser_22", match_err));;
+      raise (ParseError ("in_device", "in_device_parser_22", match_err));;
 let in_device_parser_23 kernel_version bits = 
   bitmatch bits with
   | { ifa_list : zero+64 : offset(128), bigendian } ->
       { in_device_ifa_list = ifa_list }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("in_device", "in_device_parser_23", match_err));;
+      raise (ParseError ("in_device", "in_device_parser_23", match_err));;
 let inet6_dev_parser_28 kernel_version bits = 
   bitmatch bits with
   | { addr_list : zero+32 : offset(32), littleendian } ->
       { inet6_dev_addr_list = addr_list }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("inet6_dev", "inet6_dev_parser_28", match_err));;
+      raise (ParseError ("inet6_dev", "inet6_dev_parser_28", match_err));;
 let inet6_dev_parser_29 kernel_version bits = 
   bitmatch bits with
   | { addr_list : zero+32 : offset(32), bigendian } ->
       { inet6_dev_addr_list = addr_list }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("inet6_dev", "inet6_dev_parser_29", match_err));;
+      raise (ParseError ("inet6_dev", "inet6_dev_parser_29", match_err));;
 let inet6_dev_parser_26 kernel_version bits = 
   bitmatch bits with
   | { addr_list : zero+64 : offset(64), littleendian } ->
       { inet6_dev_addr_list = addr_list }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("inet6_dev", "inet6_dev_parser_26", match_err));;
+      raise (ParseError ("inet6_dev", "inet6_dev_parser_26", match_err));;
 let inet6_dev_parser_27 kernel_version bits = 
   bitmatch bits with
   | { addr_list : zero+64 : offset(64), bigendian } ->
       { inet6_dev_addr_list = addr_list }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("inet6_dev", "inet6_dev_parser_27", match_err));;
+      raise (ParseError ("inet6_dev", "inet6_dev_parser_27", match_err));;
 let in_ifaddr_parser_32 kernel_version bits = 
   bitmatch bits with
   | { ifa_next : zero+32 : offset(0), littleendian;
@@ -653,7 +657,7 @@ let in_ifaddr_parser_32 kernel_version bits =
         in_ifaddr_ifa_mask = ifa_mask;
         in_ifaddr_ifa_next = ifa_next }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("in_ifaddr", "in_ifaddr_parser_32", match_err));;
+      raise (ParseError ("in_ifaddr", "in_ifaddr_parser_32", match_err));;
 let in_ifaddr_parser_33 kernel_version bits = 
   bitmatch bits with
   | { ifa_next : zero+32 : offset(0), bigendian;
@@ -667,7 +671,7 @@ let in_ifaddr_parser_33 kernel_version bits =
         in_ifaddr_ifa_mask = ifa_mask;
         in_ifaddr_ifa_next = ifa_next }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("in_ifaddr", "in_ifaddr_parser_33", match_err));;
+      raise (ParseError ("in_ifaddr", "in_ifaddr_parser_33", match_err));;
 let in_ifaddr_parser_30 kernel_version bits = 
   bitmatch bits with
   | { ifa_next : zero+64 : offset(0), littleendian;
@@ -681,7 +685,7 @@ let in_ifaddr_parser_30 kernel_version bits =
         in_ifaddr_ifa_mask = ifa_mask;
         in_ifaddr_ifa_next = ifa_next }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("in_ifaddr", "in_ifaddr_parser_30", match_err));;
+      raise (ParseError ("in_ifaddr", "in_ifaddr_parser_30", match_err));;
 let in_ifaddr_parser_31 kernel_version bits = 
   bitmatch bits with
   | { ifa_next : zero+64 : offset(0), bigendian;
@@ -695,7 +699,7 @@ let in_ifaddr_parser_31 kernel_version bits =
         in_ifaddr_ifa_mask = ifa_mask;
         in_ifaddr_ifa_next = ifa_next }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("in_ifaddr", "in_ifaddr_parser_31", match_err));;
+      raise (ParseError ("in_ifaddr", "in_ifaddr_parser_31", match_err));;
 let inet6_ifaddr_parser_36 kernel_version bits = 
   bitmatch bits with
   | { prefix_len : zero+32 : offset(128), littleendian;
@@ -703,7 +707,7 @@ let inet6_ifaddr_parser_36 kernel_version bits =
       { inet6_ifaddr_lst_next = lst_next;
         inet6_ifaddr_prefix_len = prefix_len }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("inet6_ifaddr", "inet6_ifaddr_parser_36", match_err));;
+      raise (ParseError ("inet6_ifaddr", "inet6_ifaddr_parser_36", match_err));;
 let inet6_ifaddr_parser_34 kernel_version bits = 
   bitmatch bits with
   | { prefix_len : zero+32 : offset(128), littleendian;
@@ -711,7 +715,7 @@ let inet6_ifaddr_parser_34 kernel_version bits =
       { inet6_ifaddr_lst_next = lst_next;
         inet6_ifaddr_prefix_len = prefix_len }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("inet6_ifaddr", "inet6_ifaddr_parser_34", match_err));;
+      raise (ParseError ("inet6_ifaddr", "inet6_ifaddr_parser_34", match_err));;
 let inet6_ifaddr_parser_35 kernel_version bits = 
   bitmatch bits with
   | { prefix_len : zero+32 : offset(128), bigendian;
@@ -719,7 +723,7 @@ let inet6_ifaddr_parser_35 kernel_version bits =
       { inet6_ifaddr_lst_next = lst_next;
         inet6_ifaddr_prefix_len = prefix_len }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("inet6_ifaddr", "inet6_ifaddr_parser_35", match_err));;
+      raise (ParseError ("inet6_ifaddr", "inet6_ifaddr_parser_35", match_err));;
 let inet6_ifaddr_parser_37 kernel_version bits = 
   bitmatch bits with
   | { prefix_len : zero+32 : offset(128), bigendian;
@@ -727,7 +731,7 @@ let inet6_ifaddr_parser_37 kernel_version bits =
       { inet6_ifaddr_lst_next = lst_next;
         inet6_ifaddr_prefix_len = prefix_len }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("inet6_ifaddr", "inet6_ifaddr_parser_37", match_err));;
+      raise (ParseError ("inet6_ifaddr", "inet6_ifaddr_parser_37", match_err));;
 let inet6_ifaddr_parser_39 kernel_version bits = 
   bitmatch bits with
   | { prefix_len : zero+32 : offset(128), littleendian;
@@ -735,7 +739,7 @@ let inet6_ifaddr_parser_39 kernel_version bits =
       { inet6_ifaddr_lst_next = lst_next;
         inet6_ifaddr_prefix_len = prefix_len }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("inet6_ifaddr", "inet6_ifaddr_parser_39", match_err));;
+      raise (ParseError ("inet6_ifaddr", "inet6_ifaddr_parser_39", match_err));;
 let inet6_ifaddr_parser_41 kernel_version bits = 
   bitmatch bits with
   | { prefix_len : zero+32 : offset(128), bigendian;
@@ -743,7 +747,7 @@ let inet6_ifaddr_parser_41 kernel_version bits =
       { inet6_ifaddr_lst_next = lst_next;
         inet6_ifaddr_prefix_len = prefix_len }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("inet6_ifaddr", "inet6_ifaddr_parser_41", match_err));;
+      raise (ParseError ("inet6_ifaddr", "inet6_ifaddr_parser_41", match_err));;
 let inet6_ifaddr_parser_38 kernel_version bits = 
   bitmatch bits with
   | { prefix_len : zero+32 : offset(128), bigendian;
@@ -751,7 +755,7 @@ let inet6_ifaddr_parser_38 kernel_version bits =
       { inet6_ifaddr_lst_next = lst_next;
         inet6_ifaddr_prefix_len = prefix_len }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("inet6_ifaddr", "inet6_ifaddr_parser_38", match_err));;
+      raise (ParseError ("inet6_ifaddr", "inet6_ifaddr_parser_38", match_err));;
 let inet6_ifaddr_parser_40 kernel_version bits = 
   bitmatch bits with
   | { prefix_len : zero+32 : offset(128), littleendian;
@@ -759,7 +763,7 @@ let inet6_ifaddr_parser_40 kernel_version bits =
       { inet6_ifaddr_lst_next = lst_next;
         inet6_ifaddr_prefix_len = prefix_len }
   | { _ } ->
-      raise (Virt_mem_types.ParseError ("inet6_ifaddr", "inet6_ifaddr_parser_40", match_err));;
+      raise (ParseError ("inet6_ifaddr", "inet6_ifaddr_parser_40", match_err));;
 let size_of_task_struct =
   let map =
     StringMap.add "2.6.25.14-69.fc8.x86_64" 2496
@@ -1251,8 +1255,12 @@ let rec task_struct_follower kernel_version load map addr =
            let offset = data.task_struct_run_list'next_offset
            and adj = data.task_struct_run_list'next_adjustment in
            let offset = Int64.of_int offset and adj = Int64.of_int adj in
-           let addr = Int64.sub (Int64.add addr offset) adj in
-           let map = AddrMap.add addr ("task_struct", None) map in
+           let map =
+             if offset <> adj
+             then
+               (let addr = Int64.sub (Int64.add addr offset) adj
+                in AddrMap.add addr ("task_struct", None) map)
+             else map in
            let dest_addr = Int64.sub dest_addr adj in
            let map = task_struct_follower kernel_version load map dest_addr
            in map in
@@ -1261,8 +1269,12 @@ let rec task_struct_follower kernel_version load map addr =
        let offset = data.task_struct_tasks'next_offset
        and adj = data.task_struct_tasks'next_adjustment in
        let offset = Int64.of_int offset and adj = Int64.of_int adj in
-       let addr = Int64.sub (Int64.add addr offset) adj in
-       let map = AddrMap.add addr ("task_struct", None) map in
+       let map =
+         if offset <> adj
+         then
+           (let addr = Int64.sub (Int64.add addr offset) adj
+            in AddrMap.add addr ("task_struct", None) map)
+         else map in
        let dest_addr = Int64.sub dest_addr adj in
        let map = task_struct_follower kernel_version load map dest_addr
        in map
@@ -1285,8 +1297,12 @@ and net_device_follower kernel_version load map addr =
            let offset = data.net_device_dev_list'next_offset
            and adj = data.net_device_dev_list'next_adjustment in
            let offset = Int64.of_int offset and adj = Int64.of_int adj in
-           let addr = Int64.sub (Int64.add addr offset) adj in
-           let map = AddrMap.add addr ("net_device", None) map in
+           let map =
+             if offset <> adj
+             then
+               (let addr = Int64.sub (Int64.add addr offset) adj
+                in AddrMap.add addr ("net_device", None) map)
+             else map in
            let dest_addr = Int64.sub dest_addr adj in
            let map = net_device_follower kernel_version load map dest_addr
            in map in
@@ -1318,8 +1334,12 @@ and net_follower kernel_version load map addr =
        let offset = data.net_dev_base_head'next_offset
        and adj = data.net_dev_base_head'next_adjustment in
        let offset = Int64.of_int offset and adj = Int64.of_int adj in
-       let addr = Int64.sub (Int64.add addr offset) adj in
-       let map = AddrMap.add addr ("net_device", None) map in
+       let map =
+         if offset <> adj
+         then
+           (let addr = Int64.sub (Int64.add addr offset) adj
+            in AddrMap.add addr ("net_device", None) map)
+         else map in
        let dest_addr = Int64.sub dest_addr adj in
        let map = net_device_follower kernel_version load map dest_addr in map in
      let dest_addr = data.net_dev_base_head'prev in
@@ -1327,8 +1347,12 @@ and net_follower kernel_version load map addr =
        let offset = data.net_dev_base_head'prev_offset
        and adj = data.net_dev_base_head'prev_adjustment in
        let offset = Int64.of_int offset and adj = Int64.of_int adj in
-       let addr = Int64.sub (Int64.add addr offset) adj in
-       let map = AddrMap.add addr ("net_device", None) map in
+       let map =
+         if offset <> adj
+         then
+           (let addr = Int64.sub (Int64.add addr offset) adj
+            in AddrMap.add addr ("net_device", None) map)
+         else map in
        let dest_addr = Int64.sub dest_addr adj in
        let map = net_device_follower kernel_version load map dest_addr in map
      in map)