# HG changeset patch # User Rob Hoes # HG changeset patch # User Rob Hoes CP-1652: Cpuid modules gets physical and current CPU features from Xen Previously, the physical features were kept in a file in dom0 on first boot. This is not very robust, so now all physical and current CPU features come directly from Xen via a hypercall. Signed-off-by: Rob Hoes diff -r 55a40dacee4c Makefile.in --- a/Makefile.in Wed Feb 24 10:29:26 2010 +0000 +++ b/Makefile.in Wed Feb 24 14:16:47 2010 +0000 @@ -31,7 +31,6 @@ endif $(MAKE) -C forking_executioner $(MAKE) -C mlvm - $(MAKE) -C cpuid $(MAKE) -C xen-utils .PHONY: allxen @@ -43,6 +42,7 @@ $(MAKE) -C xs $(MAKE) -C xsrpc $(MAKE) -C eventchn + $(MAKE) -C cpuid endif install: @@ -69,7 +69,6 @@ endif $(MAKE) -C forking_executioner install $(MAKE) -C mlvm install - $(MAKE) -C cpuid install $(MAKE) -C xen-utils install installxen: @@ -80,6 +79,7 @@ $(MAKE) -C xs install $(MAKE) -C xsrpc install $(MAKE) -C eventchn install + $(MAKE) -C cpuid install endif uninstall: @@ -106,7 +106,6 @@ endif $(MAKE) -C forking_executioner uninstall $(MAKE) -C mlvm uninstall - $(MAKE) -C cpuid uninstall $(MAKE) -C xen-utils uninstall uninstallxen: @@ -117,6 +116,7 @@ $(MAKE) -C xb uninstall $(MAKE) -C xc uninstall $(MAKE) -C mmap uninstall + $(MAKE) -C cpuid uninstall endif bins: diff -r 55a40dacee4c cpuid/META.in --- a/cpuid/META.in Wed Feb 24 10:29:26 2010 +0000 +++ b/cpuid/META.in Wed Feb 24 14:16:47 2010 +0000 @@ -1,5 +1,5 @@ version = "@VERSION@" description = "Cpuid extension" -requires = "" +requires = "stdext xc xen-utils" archive(byte) = "cpuid.cma" archive(native) = "cpuid.cmxa" diff -r 55a40dacee4c cpuid/Makefile --- a/cpuid/Makefile Wed Feb 24 10:29:26 2010 +0000 +++ b/cpuid/Makefile Wed Feb 24 14:16:47 2010 +0000 @@ -2,7 +2,7 @@ CFLAGS = -Wall -fPIC -O2 -I/opt/xensource/lib/ocaml -I$(XEN_ROOT)/usr/include OCAMLC = ocamlc -g OCAMLOPT = ocamlopt -INCLUDES = -I ../stdext +INCLUDES = -I ../stdext -I ../xc -I ../xen-utils LDFLAGS = -cclib -L./ @@ -65,8 +65,8 @@ .PHONY: doc doc: $(INTF) - python ../doc/doc.py $(DOCDIR) "cpuid" "package" "$(OBJS)" "." "stdext" "" + python ../doc/doc.py $(DOCDIR) "cpuid" "package" "$(OBJS)" "." "stdext xc xen-utils" "" clean: - rm -f *.o *.so *.a *.cmo *.cmi *.cma *.cmx *.cmxa *.annot $(LIBS) $(PROGRAMS) + rm -f *.o *.so *.a *.cmo *.cmi *.cma *.cmx *.cmxa *.annot $(LIBS) $(PROGRAMS) *~ *.rej diff -r 55a40dacee4c cpuid/cpuid.ml --- a/cpuid/cpuid.ml Wed Feb 24 10:29:26 2010 +0000 +++ b/cpuid/cpuid.ml Wed Feb 24 14:16:47 2010 +0000 @@ -127,21 +127,44 @@ if has_emt family then true else false -let get_physical_features features = - let features_file = "/var/xapi/features" in - try - let data = Unixext.read_whole_file_to_string features_file in - string_to_features data - with _ -> - let data = features_to_string features in - Unixext.write_string_to_file features_file data; - features - +let get_features_from_xen () = + let features = Xc.with_intf (fun xc -> Xc.get_boot_cpufeatures xc) in + match features with + | base_ecx, base_edx, ext_ecx, ext_edx, + masked_base_ecx, masked_base_edx, masked_ext_ecx, masked_ext_edx -> + { + base_ecx = masked_base_ecx; + base_edx = masked_base_edx; + ext_ecx = masked_ext_ecx; + ext_edx = masked_ext_edx + }, + { + base_ecx = base_ecx; + base_edx = base_edx; + ext_ecx = ext_ecx; + ext_edx = ext_edx + } + +let get_current_mask () = + let masks = Xen_cmdline.list_cpuid_masks () in + let get_mask m = + if List.mem_assoc m masks = false then + 0xffffffffl + else + Int32.of_string (List.assoc m masks) + in + { + base_ecx = get_mask "cpuid_mask_ecx"; + base_edx = get_mask "cpuid_mask_edx"; + ext_ecx = get_mask "cpuid_mask_ext_ecx"; + ext_edx = get_mask "cpuid_mask_ext_edx" + } + let read_cpu_info () = let manufacturer = read_manufacturer () in let family = read_family () in let model = read_model () in - let features = read_features () in + let features, phy_features = get_features_from_xen () in let stepping = read_stepping () in { manufacturer = manufacturer; @@ -149,7 +172,7 @@ model = model; stepping = stepping; features = features; - physical_features = get_physical_features features; + physical_features = phy_features; maskable = is_maskable manufacturer family model stepping; }