+ if images = [] then (
+ let conn =
+ let name = uri in
+ try C.connect_readonly ?name ()
+ with Libvirt.Virterror err ->
+ prerr_endline (Libvirt.Virterror.to_string err);
+ (* If non-root and no explicit connection URI, print a warning. *)
+ if Unix.geteuid () <> 0 && name = None then (
+ print_endline (s_ "NB: If you want to monitor a local Xen hypervisor, you usually need to be root");
+ );
+ exit 1 in
+
+ (* List of active domains. *)
+ let doms =
+ let nr_active_doms = C.num_of_domains conn in
+ let active_doms =
+ Array.to_list (C.list_domains conn nr_active_doms) in
+ let active_doms =
+ List.map (D.lookup_by_id conn) active_doms in
+ active_doms in
+
+ (* Get their XML. *)
+ let xmls = List.map (fun dom -> dom, D.get_xml_desc dom) doms in
+
+ (* Parse the XML. *)
+ let xmls = List.map (fun (dom, xml) ->
+ dom, Xml.parse_string xml) xmls in
+
+ (* XXX Do something with the XML XXX
+ * such as detecting arch, wordsize, endianness.
+ * XXXXXXXXXXXXXX
+ *
+ *
+ *
+ *)
+
+
+ List.map (
+ fun (dom, _) ->
+ let name = 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);
+ | Some ws -> ws in
+ let endian =
+ match !def_endian with
+ | None ->
+ failwith
+ (sprintf (f_"%s: use -E to define endianness for this image")
+ name);
+ | Some e -> e in
+
+ let arch =
+ match !def_architecture with
+ | 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
+
+ if !def_text_addr = 0L then
+ failwith
+ (sprintf (f_"%s: use -T to define kernel load address for this image")
+ name);
+
+ (* Read the kernel memory.
+ * Maximum 64K can be read over remote connections.
+ *)
+ let str = String.create kernel_size in
+ let rec loop i =
+ let remaining = kernel_size - i in
+ if remaining > 0 then (
+ let size = min remaining max_memory_peek in
+ D.memory_peek dom [D.Virtual]
+ (!def_text_addr +^ Int64.of_int i) size str i;
+ loop (i + size)
+ )
+ in
+ loop 0;
+
+ (* Map the virtual memory. *)
+ let mem = MMap.of_string str !def_text_addr in
+
+ (* Force the wordsize and endianness. *)
+ let mem = MMap.set_wordsize mem wordsize in
+ let mem = MMap.set_endian mem endian in
+
+ (name, arch, mem)
+ ) xmls
+ ) else