X-Git-Url: http://git.annexia.org/?p=virt-mem.git;a=blobdiff_plain;f=lib%2Fkernel.ml;fp=lib%2Fkernel.ml;h=2ad7a68a88581d2d157adf3e10662b6cf5646114;hp=9b7d3bcc86d0c3675c981ed6bf7cdc1efa159460;hb=ce3a2b6dc35d60e6ac0679b060fd10213c0b4628;hpb=48a85384daa4089f6d310293ab3f8d713740f962 diff --git a/lib/kernel.ml b/lib/kernel.ml index 9b7d3bc..2ad7a68 100644 --- a/lib/kernel.ml +++ b/lib/kernel.ml @@ -1238,184 +1238,369 @@ let parser_of_inet6_ifaddr = try StringMap.find kernel_version map with | Not_found -> unknown_kernel_version kernel_version "inet6_ifaddr";; -let rec task_struct_follower kernel_version load map addr = - if (addr <> 0L) && (not (AddrMap.mem addr map)) - then - (let parser_ = parser_of_task_struct kernel_version in - let total_size = size_of_task_struct kernel_version in - let bits = load "task_struct" addr total_size in - let data = parser_ kernel_version bits in - let map = - AddrMap.add addr - ("task_struct", (Some (total_size, bits, Task_struct data))) map in - let map = - match data.task_struct_run_list'next with - | None -> map - | Some dest_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 map = - if offset <> adj +let rec task_struct_follower debug kernel_version load map addr = + (if debug + then eprintf "%s_follower: addr = %Lx +" "task_struct" addr + else (); + if (addr <> 0L) && (not (AddrMap.mem addr map)) + then + (let parser_ = parser_of_task_struct kernel_version in + let total_size = size_of_task_struct kernel_version in + let bits = load "task_struct" addr total_size in + let data = parser_ kernel_version bits in + let map = + AddrMap.add addr + ("task_struct", (Some (total_size, bits, Task_struct data))) map in + let map = + match data.task_struct_run_list'next with + | None -> map + | Some dest_addr -> + (if debug 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 - let dest_addr = data.task_struct_tasks'next in - let map = - 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 map = - if offset <> adj + eprintf "%s_follower: %s: list_head pointing at a %s +" + "task_struct" "run_list'next" "task_struct" + else (); + let offset = data.task_struct_run_list'next_offset + and adj = data.task_struct_run_list'next_adjustment + in + (if debug + then + eprintf "%s_follower: %s: offset=%d adjustment=%d +" + "task_struct" "run_list'next" offset adj + else (); + let offset = Int64.of_int offset + and adj = Int64.of_int adj 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 + (if debug + then + eprintf "%s_follower: %s: dest_addr=%Lx +" "task_struct" + "run_list'next" dest_addr + else (); + let map = + task_struct_follower debug kernel_version load map + dest_addr + in map))) in + let dest_addr = data.task_struct_tasks'next in + let map = + (if debug + then + eprintf "%s_follower: %s: list_head pointing at a %s +" + "task_struct" "tasks'next" "task_struct" + else (); + let offset = data.task_struct_tasks'next_offset + and adj = data.task_struct_tasks'next_adjustment + in + (if debug + then + eprintf "%s_follower: %s: offset=%d adjustment=%d +" + "task_struct" "tasks'next" offset adj + else (); + let offset = Int64.of_int offset and adj = Int64.of_int adj 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 + (if debug + then + eprintf "%s_follower: %s: dest_addr=%Lx +" "task_struct" + "tasks'next" dest_addr + else (); + let map = + task_struct_follower debug kernel_version load map dest_addr + in map))) + in map) + else map) +and net_device_follower debug kernel_version load map addr = + (if debug then eprintf "%s_follower: addr = %Lx +" "net_device" addr else (); + if (addr <> 0L) && (not (AddrMap.mem addr map)) + then + (let parser_ = parser_of_net_device kernel_version in + let total_size = size_of_net_device kernel_version in + let bits = load "net_device" addr total_size in + let data = parser_ kernel_version bits in + let map = + AddrMap.add addr + ("net_device", (Some (total_size, bits, Net_device data))) map in + let map = + match data.net_device_dev_list'next with + | None -> map + | Some dest_addr -> + (if debug + then + eprintf "%s_follower: %s: list_head pointing at a %s +" + "net_device" "dev_list'next" "net_device" + else (); + let offset = data.net_device_dev_list'next_offset + and adj = data.net_device_dev_list'next_adjustment + in + (if debug + then + eprintf "%s_follower: %s: offset=%d adjustment=%d +" + "net_device" "dev_list'next" offset adj + else (); + let offset = Int64.of_int offset + and adj = Int64.of_int adj 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 + (if debug + then + eprintf "%s_follower: %s: dest_addr=%Lx +" "net_device" + "dev_list'next" dest_addr + else (); + let map = + net_device_follower debug kernel_version load map + dest_addr + in map))) in + let dest_addr = data.net_device_ip6_ptr in + let map = + (if debug + then + eprintf + "%s_follower: %s: is a struct pointer pointing to a %s; dest_addr=%Lx +" + "net_device" "ip6_ptr" "inet6_dev" dest_addr + else (); + let map = inet6_dev_follower debug kernel_version load map dest_addr + in map) in + let dest_addr = data.net_device_ip_ptr in + let map = + (if debug 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 map) - else map -and net_device_follower kernel_version load map addr = - if (addr <> 0L) && (not (AddrMap.mem addr map)) - then - (let parser_ = parser_of_net_device kernel_version in - let total_size = size_of_net_device kernel_version in - let bits = load "net_device" addr total_size in - let data = parser_ kernel_version bits in - let map = - AddrMap.add addr - ("net_device", (Some (total_size, bits, Net_device data))) map in - let map = - match data.net_device_dev_list'next with - | None -> map - | Some dest_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 map = - if offset <> adj + eprintf + "%s_follower: %s: is a struct pointer pointing to a %s; dest_addr=%Lx +" + "net_device" "ip_ptr" "in_device" dest_addr + else (); + let map = in_device_follower debug kernel_version load map dest_addr + in map) in + let map = + match data.net_device_next with + | None -> map + | Some dest_addr -> + (if debug 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_device_ip6_ptr in - let map = - let map = inet6_dev_follower kernel_version load map dest_addr in map in - let dest_addr = data.net_device_ip_ptr in - let map = - let map = in_device_follower kernel_version load map dest_addr in map in - let map = - match data.net_device_next with - | None -> map - | Some dest_addr -> - let map = net_device_follower kernel_version load map dest_addr - in map - in map) - else map -and net_follower kernel_version load map addr = - if (addr <> 0L) && (not (AddrMap.mem addr map)) - then - (let parser_ = parser_of_net kernel_version in - let total_size = size_of_net kernel_version in - let bits = load "net" addr total_size in - let data = parser_ kernel_version bits in - let map = - AddrMap.add addr ("net", (Some (total_size, bits, Net data))) map in - let dest_addr = data.net_dev_base_head'next in - let map = - 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 map = - if offset <> adj + eprintf + "%s_follower: %s: is a struct pointer pointing to a %s; dest_addr=%Lx +" + "net_device" "next" "net_device" dest_addr + else (); + let map = + net_device_follower debug kernel_version load map dest_addr + in map) + in map) + else map) +and net_follower debug kernel_version load map addr = + (if debug then eprintf "%s_follower: addr = %Lx +" "net" addr else (); + if (addr <> 0L) && (not (AddrMap.mem addr map)) + then + (let parser_ = parser_of_net kernel_version in + let total_size = size_of_net kernel_version in + let bits = load "net" addr total_size in + let data = parser_ kernel_version bits in + let map = + AddrMap.add addr ("net", (Some (total_size, bits, Net data))) map in + let dest_addr = data.net_dev_base_head'next in + let map = + (if debug + then + eprintf "%s_follower: %s: list_head pointing at a %s +" "net" + "dev_base_head'next" "net_device" + else (); + let offset = data.net_dev_base_head'next_offset + and adj = data.net_dev_base_head'next_adjustment + in + (if debug + then + eprintf "%s_follower: %s: offset=%d adjustment=%d +" "net" + "dev_base_head'next" offset adj + else (); + let offset = Int64.of_int offset and adj = Int64.of_int adj 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 + (if debug + then + eprintf "%s_follower: %s: dest_addr=%Lx +" "net" + "dev_base_head'next" dest_addr + else (); + let map = + net_device_follower debug kernel_version load map dest_addr + in map))) in + let dest_addr = data.net_dev_base_head'prev in + let map = + (if debug + then + eprintf "%s_follower: %s: list_head pointing at a %s +" "net" + "dev_base_head'prev" "net_device" + else (); + let offset = data.net_dev_base_head'prev_offset + and adj = data.net_dev_base_head'prev_adjustment + in + (if debug + then + eprintf "%s_follower: %s: offset=%d adjustment=%d +" "net" + "dev_base_head'prev" offset adj + else (); + let offset = Int64.of_int offset and adj = Int64.of_int adj 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 + (if debug + then + eprintf "%s_follower: %s: dest_addr=%Lx +" "net" + "dev_base_head'prev" dest_addr + else (); + let map = + net_device_follower debug kernel_version load map dest_addr + in map))) + in map) + else map) +and in_device_follower debug kernel_version load map addr = + (if debug then eprintf "%s_follower: addr = %Lx +" "in_device" addr else (); + if (addr <> 0L) && (not (AddrMap.mem addr map)) + then + (let parser_ = parser_of_in_device kernel_version in + let total_size = size_of_in_device kernel_version in + let bits = load "in_device" addr total_size in + let data = parser_ kernel_version bits in + let map = + AddrMap.add addr + ("in_device", (Some (total_size, bits, In_device data))) map in + let dest_addr = data.in_device_ifa_list in + let map = + (if debug + then + eprintf + "%s_follower: %s: is a struct pointer pointing to a %s; dest_addr=%Lx +" + "in_device" "ifa_list" "in_ifaddr" dest_addr + else (); + let map = in_ifaddr_follower debug kernel_version load map dest_addr + in map) + in map) + else map) +and inet6_dev_follower debug kernel_version load map addr = + (if debug then eprintf "%s_follower: addr = %Lx +" "inet6_dev" addr else (); + if (addr <> 0L) && (not (AddrMap.mem addr map)) + then + (let parser_ = parser_of_inet6_dev kernel_version in + let total_size = size_of_inet6_dev kernel_version in + let bits = load "inet6_dev" addr total_size in + let data = parser_ kernel_version bits in + let map = + AddrMap.add addr + ("inet6_dev", (Some (total_size, bits, Inet6_dev data))) map in + let dest_addr = data.inet6_dev_addr_list in + let map = + (if debug 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 - let map = - 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 map = - if offset <> adj + eprintf + "%s_follower: %s: is a struct pointer pointing to a %s; dest_addr=%Lx +" + "inet6_dev" "addr_list" "inet6_ifaddr" dest_addr + else (); + let map = + inet6_ifaddr_follower debug kernel_version load map dest_addr + in map) + in map) + else map) +and in_ifaddr_follower debug kernel_version load map addr = + (if debug then eprintf "%s_follower: addr = %Lx +" "in_ifaddr" addr else (); + if (addr <> 0L) && (not (AddrMap.mem addr map)) + then + (let parser_ = parser_of_in_ifaddr kernel_version in + let total_size = size_of_in_ifaddr kernel_version in + let bits = load "in_ifaddr" addr total_size in + let data = parser_ kernel_version bits in + let map = + AddrMap.add addr + ("in_ifaddr", (Some (total_size, bits, In_ifaddr data))) map in + let dest_addr = data.in_ifaddr_ifa_next in + let map = + (if debug 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) - else map -and in_device_follower kernel_version load map addr = - if (addr <> 0L) && (not (AddrMap.mem addr map)) - then - (let parser_ = parser_of_in_device kernel_version in - let total_size = size_of_in_device kernel_version in - let bits = load "in_device" addr total_size in - let data = parser_ kernel_version bits in - let map = - AddrMap.add addr - ("in_device", (Some (total_size, bits, In_device data))) map in - let dest_addr = data.in_device_ifa_list in - let map = - let map = in_ifaddr_follower kernel_version load map dest_addr in map - in map) - else map -and inet6_dev_follower kernel_version load map addr = - if (addr <> 0L) && (not (AddrMap.mem addr map)) - then - (let parser_ = parser_of_inet6_dev kernel_version in - let total_size = size_of_inet6_dev kernel_version in - let bits = load "inet6_dev" addr total_size in - let data = parser_ kernel_version bits in - let map = - AddrMap.add addr - ("inet6_dev", (Some (total_size, bits, Inet6_dev data))) map in - let dest_addr = data.inet6_dev_addr_list in - let map = - let map = inet6_ifaddr_follower kernel_version load map dest_addr - in map - in map) - else map -and in_ifaddr_follower kernel_version load map addr = - if (addr <> 0L) && (not (AddrMap.mem addr map)) - then - (let parser_ = parser_of_in_ifaddr kernel_version in - let total_size = size_of_in_ifaddr kernel_version in - let bits = load "in_ifaddr" addr total_size in - let data = parser_ kernel_version bits in - let map = - AddrMap.add addr - ("in_ifaddr", (Some (total_size, bits, In_ifaddr data))) map in - let dest_addr = data.in_ifaddr_ifa_next in - let map = - let map = in_ifaddr_follower kernel_version load map dest_addr in map - in map) - else map -and inet6_ifaddr_follower kernel_version load map addr = - if (addr <> 0L) && (not (AddrMap.mem addr map)) - then - (let parser_ = parser_of_inet6_ifaddr kernel_version in - let total_size = size_of_inet6_ifaddr kernel_version in - let bits = load "inet6_ifaddr" addr total_size in - let data = parser_ kernel_version bits in - let map = - AddrMap.add addr - ("inet6_ifaddr", (Some (total_size, bits, Inet6_ifaddr data))) map in - let dest_addr = data.inet6_ifaddr_lst_next in - let map = - let map = inet6_ifaddr_follower kernel_version load map dest_addr - in map - in map) - else map;; + eprintf + "%s_follower: %s: is a struct pointer pointing to a %s; dest_addr=%Lx +" + "in_ifaddr" "ifa_next" "in_ifaddr" dest_addr + else (); + let map = in_ifaddr_follower debug kernel_version load map dest_addr + in map) + in map) + else map) +and inet6_ifaddr_follower debug kernel_version load map addr = + (if debug + then eprintf "%s_follower: addr = %Lx +" "inet6_ifaddr" addr + else (); + if (addr <> 0L) && (not (AddrMap.mem addr map)) + then + (let parser_ = parser_of_inet6_ifaddr kernel_version in + let total_size = size_of_inet6_ifaddr kernel_version in + let bits = load "inet6_ifaddr" addr total_size in + let data = parser_ kernel_version bits in + let map = + AddrMap.add addr + ("inet6_ifaddr", (Some (total_size, bits, Inet6_ifaddr data))) map in + let dest_addr = data.inet6_ifaddr_lst_next in + let map = + (if debug + then + eprintf + "%s_follower: %s: is a struct pointer pointing to a %s; dest_addr=%Lx +" + "inet6_ifaddr" "lst_next" "inet6_ifaddr" dest_addr + else (); + let map = + inet6_ifaddr_follower debug kernel_version load map dest_addr + in map) + in map) + else map);;