"schedule"; (* scheduler entry point *)
]
-let find_kernel_symbols debug ({ mem = mem; domname = domname } as image) =
+let find_kernel_symbols debug ({ mem = mem; domname = domname } as kimage) =
(* Searching for <NUL>string<NUL> *)
let common_ksyms_nul = List.map (sprintf "\000%s\000") common_ksyms in
List.iter (
fun (addr, size) ->
eprintf "\t%Lx\t%Lx\t%!" addr size;
- eprintf "first symbol: %s\n%!"
+ eprintf "first symbol: %S\n%!"
(Virt_mem_mmap.get_string mem
(Virt_mem_mmap.follow_pointer mem
(Virt_mem_mmap.succ_long mem addr)))
(* Vote for the most popular symbol table candidate and from this
* generate a function to look up ksyms.
*)
- let ksymmap =
+ let ksyms, have_ksyms =
let freqs = frequency ksymtabs in
match freqs with
| [] ->
eprintf (f_"%s: cannot find start of kernel symbol table\n") domname;
- None
+ Ksymmap.empty, false
| (_, (ksymtab_addr, ksymtab_size)) :: _ ->
if debug then
(Int64.to_int ksymtab_size)) in
(* Construct kernel symbol map. *)
- let ksymmap =
+ let ksyms =
let bits = bits_of_wordsize (Virt_mem_mmap.get_wordsize mem) in
let e = Virt_mem_mmap.get_endian mem in
- let rec loop ksymmap bs =
+ let rec loop ksyms bs =
bitmatch bs with
| { value : bits : endian(e);
name_ptr : bits : endian(e);
bs : -1 : bitstring } ->
let name = Virt_mem_mmap.get_string mem name_ptr in
- let ksymmap = Ksymmap.add name value ksymmap in
- loop ksymmap bs
+ let ksyms = Ksymmap.add name value ksyms in
+ loop ksyms bs
| { _ } ->
- ksymmap
+ ksyms
in
loop Ksymmap.empty ksymtab in
- Some ksymmap
+ ksyms, true
in
if debug then (
(end_t -. start_t)
);
- (image, ksymmap)
+ { kimage with ksyms = ksyms; have_ksyms = have_ksyms }