X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=lib%2Fvirt_mem.ml;h=9280a690fbf20fe27962dff7ab8890d4b1381c53;hb=f7abd816091c98cf1e1c227ecbbfebc9e791819c;hp=0a956f1257b8fd9bb6b45c5726a4f389978428b6;hpb=89d41f7614612cf991d6005e7c1e20cd502a5404;p=virt-mem.git diff --git a/lib/virt_mem.ml b/lib/virt_mem.ml index 0a956f1..9280a69 100644 --- a/lib/virt_mem.ml +++ b/lib/virt_mem.ml @@ -44,11 +44,11 @@ let tools = ref [] (* Registration function used by the tools. *) let register ?(external_cmd = true) ?(extra_args = []) - ?argcheck ?beforeksyms ?run + ?argcheck ?beforeksyms ?beforeutsname ?run name summary description = tools := (name, (name, summary, description, external_cmd, extra_args, - argcheck, beforeksyms, run)) + argcheck, beforeksyms, beforeutsname, run)) :: !tools (* Main program, called from mem/virt_mem_main.ml when all the @@ -106,7 +106,7 @@ let main () = match tool with | None -> (* Generic usage message. *) let tools = List.map ( - fun (name, (_, summary, _, external_cmd, _, _, _, _)) -> + fun (name, (_, summary, _, external_cmd, _, _, _, _, _)) -> if external_cmd then "virt-"^name, summary else "virt-mem "^name, summary ) tools in @@ -133,7 +133,7 @@ To display extra help for a single tool, do: Options:") tools (* Tool-specific usage message. *) - | Some (name, summary, description, external_cmd, _, _, _, _) -> + | Some (name, summary, description, external_cmd, _, _, _, _, _) -> let cmd = if external_cmd then "virt-" ^ name else "virt-mem " ^ name in @@ -219,7 +219,7 @@ Options:") cmd summary description in let argspec = let extra_args = match tool with | None -> [] - | Some (_, _, _, _, extra_args, _, _, _) -> extra_args in + | Some (_, _, _, _, extra_args, _, _, _, _) -> extra_args in let argspec = [ "-A", Arg.String set_architecture, "arch " ^ s_"Set kernel architecture, endianness and word size"; @@ -270,7 +270,7 @@ Options:") cmd summary description in * or the user didn't give us a valid tool (eg. "virt-mem foobar"). * Detect that final case now and give an error. *) - let name, _, _, _, _, argcheck, beforeksyms, run = + let name, _, _, _, _, argcheck, beforeksyms, beforeutsname, run = match tool with | Some t -> t | None -> @@ -350,22 +350,21 @@ Use 'virt-mem --help' for more help or read the manual page virt-mem(1)"); List.map ( fun (dom, _) -> - let id = D.get_id dom in - let name = D.get_name dom in + let domname = D.get_name dom in let wordsize = match !def_wordsize with | None -> failwith (sprintf (f_"%s: use -W to define word size for this image") - name); + domname); | Some ws -> ws in let endian = match !def_endian with | None -> failwith (sprintf (f_"%s: use -E to define endianness for this image") - name); + domname); | Some e -> e in let arch = @@ -373,11 +372,11 @@ Use 'virt-mem --help' for more help or read the manual page virt-mem(1)"); | Some I386 -> I386 | Some X86_64 -> X86_64 | _ -> failwith - (sprintf (f_"%s: use -A to define architecture (i386/x86-64 only) for this image") name) in + (sprintf (f_"%s: use -A to define architecture (i386/x86-64 only) for this image") domname) in if !def_text_addr = 0L then failwith - (sprintf (f_"%s: use -T to define kernel load address for this image") name); + (sprintf (f_"%s: use -T to define kernel load address for this image") domname); let start_t = gettimeofday () in @@ -409,7 +408,7 @@ Use 'virt-mem --help' for more help or read the manual page virt-mem(1)"); let mem = Virt_mem_mmap.set_wordsize mem wordsize in let mem = Virt_mem_mmap.set_endian mem endian in - ((Some id, name, arch, mem) : image0) + { dom = Some dom; domname = domname; mem = mem; arch = arch } ) xmls ) else ( (* One or more -t options passed. *) @@ -457,7 +456,7 @@ Use 'virt-mem --help' for more help or read the manual page virt-mem(1)"); let mem = Virt_mem_mmap.set_wordsize mem wordsize in let mem = Virt_mem_mmap.set_endian mem endian in - ((None, filename, arch, mem) : image0) + { dom = None; domname = filename; mem = mem; arch = arch } ) testimages ) in @@ -469,21 +468,21 @@ Use 'virt-mem --help' for more help or read the manual page virt-mem(1)"); | Some beforeksyms -> beforeksyms debug images ); - (* If there is no run function, then there is no point continuing - * with the rest of the program (kernel symbol analysis) ... + (* If there are no more callback functions, then there is no point + * continuing with the rest of the program (kernel symbol analysis) ... *) - if run = None then exit 0; + if beforeutsname = None && run = None then exit 0; (* Do the kernel symbol analysis. *) let images = List.map ( fun image -> - (* Look for ordinary kernel symbols: *) let image = Virt_mem_ksyms.find_kernel_symbols debug image in (* Look for kallsyms: *) let image = Virt_mem_kallsyms.find_kallsyms debug image in +(* (* Finally, just wrap the lookup_ksym call in something * which prints the query when debug is set. *) @@ -502,13 +501,27 @@ Use 'virt-mem --help' for more help or read the manual page virt-mem(1)"); (domid, name, arch, mem, lookup_ksym) else image in +*) image ) images in + (* Before utsname analysis. *) + (match beforeutsname with + | None -> () + | Some beforeutsname -> List.iter (beforeutsname debug) images + ); + + (* If there are no more callback functions, then there is no point + * continuing with the rest of the program (kernel version analysis) ... + *) + if run = None then exit 0; + + (* Get the kernel version (utsname analysis). *) + let images = List.map (Virt_mem_utsname.find_utsname debug) images in + (* Run the tool's main function. *) (match run with | None -> () - | Some run -> - run debug images + | Some run -> List.iter (run debug) images )