X-Git-Url: http://git.annexia.org/?p=virt-mem.git;a=blobdiff_plain;f=lib%2Fvirt_mem_ksyms.ml;h=32031fb4d7e2a89cee5dfe40e6b7a2d603ba15d2;hp=d70ace180daca9141ca964e190b8ac681d1115c1;hb=e7fad361d3dbf1689a22fdd1ae5f5579d6ef5fb0;hpb=693401d45aff92fc09c157eee41dcced4c600530 diff --git a/lib/virt_mem_ksyms.ml b/lib/virt_mem_ksyms.ml index d70ace1..32031fb 100644 --- a/lib/virt_mem_ksyms.ml +++ b/lib/virt_mem_ksyms.ml @@ -45,7 +45,7 @@ let common_ksyms = [ "schedule"; (* scheduler entry point *) ] -let find_kernel_symbols debug (domid, name, arch, mem) = +let find_kernel_symbols debug ({ mem = mem; domname = domname } as image) = (* Searching for string *) let common_ksyms_nul = List.map (sprintf "\000%s\000") common_ksyms in @@ -127,7 +127,7 @@ let find_kernel_symbols debug (domid, name, arch, mem) = let ksymtabs = List.filter (fun (_, size) -> size > 64L) ksymtabs in if debug then ( - eprintf "%s: candidate symbol tables at:\n" name; + eprintf "%s: candidate symbol tables at:\n" domname; List.iter ( fun (addr, size) -> eprintf "\t%Lx\t%Lx\t%!" addr size; @@ -141,18 +141,18 @@ let find_kernel_symbols debug (domid, name, arch, mem) = (* Vote for the most popular symbol table candidate and from this * generate a function to look up ksyms. *) - let lookup_ksym = + let ksymmap = let freqs = frequency ksymtabs in match freqs with | [] -> - eprintf (f_"%s: cannot find start of kernel symbol table\n") name; - (fun _ -> raise Not_found) + eprintf (f_"%s: cannot find start of kernel symbol table\n") domname; + Ksymmap.empty | (_, (ksymtab_addr, ksymtab_size)) :: _ -> if debug then eprintf "%s: Kernel symbol table found at %Lx, size %Lx bytes\n%!" - name ksymtab_addr ksymtab_size; + domname ksymtab_addr ksymtab_size; (* Load the whole symbol table as a bitstring. *) let ksymtab = @@ -160,26 +160,24 @@ let find_kernel_symbols debug (domid, name, arch, mem) = (Virt_mem_mmap.get_bytes mem ksymtab_addr (Int64.to_int ksymtab_size)) in - (* Function to look up an address in the symbol table. *) - let lookup_ksym sym = + (* Construct kernel symbol map. *) + let ksymmap = let bits = bits_of_wordsize (Virt_mem_mmap.get_wordsize mem) in let e = Virt_mem_mmap.get_endian mem in - let rec loop bs = + let rec loop ksymmap bs = bitmatch bs with | { value : bits : endian(e); - name_ptr : bits : endian(e) } - when Virt_mem_mmap.get_string mem name_ptr = sym -> - value - | { _ : bits : endian(e); - _ : bits : endian(e); + name_ptr : bits : endian(e); bs : -1 : bitstring } -> - loop bs - | { _ } -> raise Not_found + let name = Virt_mem_mmap.get_string mem name_ptr in + let ksymmap = Ksymmap.add name value ksymmap in + loop ksymmap bs + | { _ } -> + ksymmap in - loop ksymtab - in + loop Ksymmap.empty ksymtab in - lookup_ksym + ksymmap in if debug then ( @@ -188,4 +186,4 @@ let find_kernel_symbols debug (domid, name, arch, mem) = (end_t -. start_t) ); - ((domid, name, arch, mem, lookup_ksym) : image1) + ((image, ksymmap) : image1)