--- /dev/null
+(* Memory info command for virtual domains.
+ (C) Copyright 2008 Richard W.M. Jones, Red Hat Inc.
+ http://libvirt.org/
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *)
+
+open ExtList
+open ExtString
+
+open Printf
+
+module PP = Pahole_parser
+
+type parser_ = {
+ pa_i : int;
+ pa_name : string;
+ pa_endian : Bitstring.endian;
+ pa_structure : Pahole_parser.structure;
+}
+
+and pahash = (string, parser_) Hashtbl.t
+
+let endian_of_architecture arch =
+ if String.starts_with arch "i386" ||
+ String.starts_with arch "i486" ||
+ String.starts_with arch "i586" ||
+ String.starts_with arch "i686" ||
+ String.starts_with arch "x86_64" ||
+ String.starts_with arch "x86-64" then
+ Bitstring.LittleEndian
+ else if String.starts_with arch "ia64" then
+ Bitstring.LittleEndian (* XXX usually? *)
+ else if String.starts_with arch "ppc" then
+ Bitstring.BigEndian
+ else if String.starts_with arch "sparc" then
+ Bitstring.BigEndian
+ else
+ failwith (sprintf "endian_of_architecture: cannot parse %S" arch)
+
+let unique =
+ let i = ref 0 in
+ fun () ->
+ incr i; !i
+
+let hash_values h = Hashtbl.fold (fun _ v vs -> v :: vs) h []
+
+let minimize_parsers struct_name kernels =
+ let h = Hashtbl.create 13 in
+ let rh = Hashtbl.create 13 in
+
+ (* Do not change - see Code_generation.re_subst. *)
+ let name_of i = sprintf "%s_parser_%d" struct_name i in
+
+ List.iter (
+ fun ({ PP.kernel_version = version; arch = arch },
+ ({ PP.struct_fields = fields; struct_name = name_check }
+ as structure)) ->
+ assert (struct_name = name_check);
+ let endian = endian_of_architecture arch in
+ let key = endian, fields in
+ let pa =
+ try Hashtbl.find h key
+ with Not_found ->
+ let i = unique () in
+ let pa = { pa_i = i; pa_name = name_of i;
+ pa_endian = endian;
+ pa_structure = structure } in
+ Hashtbl.add h key pa;
+ pa in
+ Hashtbl.add rh version pa
+ ) kernels;
+
+ let pas = hash_values h in
+ pas, rh