Signed-off-by: Andrew Cooper <andrew.coop...@citrix.com> Acked-by: Wei Liu <wei.l...@citrix.com> --- CC: Ian Jackson <ian.jack...@eu.citrix.com>
New in v2 --- tools/libxc/Makefile | 9 ++++++ tools/libxc/include/xenctrl.h | 14 ++++++++ tools/libxc/xc_cpuid_x86.c | 75 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 98 insertions(+) diff --git a/tools/libxc/Makefile b/tools/libxc/Makefile index 608404f..ef02c9d 100644 --- a/tools/libxc/Makefile +++ b/tools/libxc/Makefile @@ -145,6 +145,15 @@ $(eval $(genpath-target)) xc_private.h: _paths.h +ifeq ($(CONFIG_X86),y) + +_xc_cpuid_autogen.h: $(XEN_ROOT)/xen/include/public/arch-x86/cpufeatureset.h $(XEN_ROOT)/xen/tools/gen-cpuid.py + $(PYTHON) $(XEN_ROOT)/xen/tools/gen-cpuid.py -i $^ -o $@.new + $(call move-if-changed,$@.new,$@) + +build: _xc_cpuid_autogen.h +endif + $(CTRL_LIB_OBJS) $(GUEST_LIB_OBJS) \ $(CTRL_PIC_OBJS) $(GUEST_PIC_OBJS): xc_private.h diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h index c136aa8..66acbd1 100644 --- a/tools/libxc/include/xenctrl.h +++ b/tools/libxc/include/xenctrl.h @@ -2533,6 +2533,20 @@ int xc_psr_cat_get_l3_info(xc_interface *xch, uint32_t socket, int xc_get_cpu_levelling_caps(xc_interface *xch, uint32_t *caps); int xc_get_cpu_featureset(xc_interface *xch, uint32_t index, uint32_t *nr_features, uint32_t *featureset); + +uint32_t xc_get_cpu_featureset_size(void); + +enum xc_static_cpu_featuremask { + XC_FEATUREMASK_KNOWN, + XC_FEATUREMASK_SPECIAL, + XC_FEATUREMASK_PV, + XC_FEATUREMASK_HVM_SHADOW, + XC_FEATUREMASK_HVM_HAP, + XC_FEATUREMASK_DEEP_FEATURES, +}; +const uint32_t *xc_get_static_cpu_featuremask(enum xc_static_cpu_featuremask); +const uint32_t *xc_get_feature_deep_deps(uint32_t feature); + #endif /* Compat shims */ diff --git a/tools/libxc/xc_cpuid_x86.c b/tools/libxc/xc_cpuid_x86.c index d3674db..0cffb36 100644 --- a/tools/libxc/xc_cpuid_x86.c +++ b/tools/libxc/xc_cpuid_x86.c @@ -28,6 +28,7 @@ enum { #define XEN_CPUFEATURE(name, value) X86_FEATURE_##name = value, #include <xen/arch-x86/cpufeatureset.h> }; +#include "_xc_cpuid_autogen.h" #define bitmaskof(idx) (1u << ((idx) & 31)) #define clear_bit(idx, dst) ((dst) &= ~bitmaskof(idx)) @@ -78,6 +79,80 @@ int xc_get_cpu_featureset(xc_interface *xch, uint32_t index, return ret; } +uint32_t xc_get_cpu_featureset_size(void) +{ + return FEATURESET_NR_ENTRIES; +} + +const uint32_t *xc_get_static_cpu_featuremask( + enum xc_static_cpu_featuremask mask) +{ + const static uint32_t known[FEATURESET_NR_ENTRIES] = INIT_KNOWN_FEATURES, + special[FEATURESET_NR_ENTRIES] = INIT_SPECIAL_FEATURES, + pv[FEATURESET_NR_ENTRIES] = INIT_PV_FEATURES, + hvm_shadow[FEATURESET_NR_ENTRIES] = INIT_HVM_SHADOW_FEATURES, + hvm_hap[FEATURESET_NR_ENTRIES] = INIT_HVM_HAP_FEATURES, + deep_features[FEATURESET_NR_ENTRIES] = INIT_DEEP_FEATURES; + + XC_BUILD_BUG_ON(ARRAY_SIZE(known) != FEATURESET_NR_ENTRIES); + XC_BUILD_BUG_ON(ARRAY_SIZE(special) != FEATURESET_NR_ENTRIES); + XC_BUILD_BUG_ON(ARRAY_SIZE(pv) != FEATURESET_NR_ENTRIES); + XC_BUILD_BUG_ON(ARRAY_SIZE(hvm_shadow) != FEATURESET_NR_ENTRIES); + XC_BUILD_BUG_ON(ARRAY_SIZE(hvm_hap) != FEATURESET_NR_ENTRIES); + XC_BUILD_BUG_ON(ARRAY_SIZE(deep_features) != FEATURESET_NR_ENTRIES); + + switch ( mask ) + { + case XC_FEATUREMASK_KNOWN: + return known; + + case XC_FEATUREMASK_SPECIAL: + return special; + + case XC_FEATUREMASK_PV: + return pv; + + case XC_FEATUREMASK_HVM_SHADOW: + return hvm_shadow; + + case XC_FEATUREMASK_HVM_HAP: + return hvm_hap; + + case XC_FEATUREMASK_DEEP_FEATURES: + return deep_features; + + default: + return NULL; + } +} + +const uint32_t *xc_get_feature_deep_deps(uint32_t feature) +{ + static const struct { + uint32_t feature; + uint32_t fs[FEATURESET_NR_ENTRIES]; + } deep_deps[] = INIT_DEEP_DEPS; + + unsigned int start = 0, end = ARRAY_SIZE(deep_deps); + + XC_BUILD_BUG_ON(ARRAY_SIZE(deep_deps) != NR_DEEP_DEPS); + + /* deep_deps[] is sorted. Perform a binary search. */ + while ( start < end ) + { + unsigned int mid = start + ((end - start) / 2); + + if ( deep_deps[mid].feature > feature ) + end = mid; + else if ( deep_deps[mid].feature < feature ) + start = mid + 1; + else + return deep_deps[mid].fs; + } + + return NULL; +} + struct cpuid_domain_info { enum -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel