Message ID | 1454679743-18133-27-git-send-email-andrew.cooper3@citrix.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, Feb 05, 2016 at 01:42:19PM +0000, Andrew Cooper wrote: > Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> > --- > CC: Ian Campbell <Ian.Campbell@citrix.com> > CC: Ian Jackson <Ian.Jackson@eu.citrix.com> > CC: Wei Liu <wei.liu2@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 0a8614c..30de3fe 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 I don't seem to see this file in tree or in this series. And I think ultimately that file should be maintained by x86 maintainers. > + $(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 5a7500a..1da372d 100644 > --- a/tools/libxc/include/xenctrl.h > +++ b/tools/libxc/include/xenctrl.h > @@ -2574,6 +2574,20 @@ int xc_psr_cat_get_l3_info(xc_interface *xch, uint32_t socket, > > 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_INVERTED, > + 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 348cbdd..7ef37d2 100644 > --- a/tools/libxc/xc_cpuid_x86.c > +++ b/tools/libxc/xc_cpuid_x86.c > @@ -22,6 +22,7 @@ > #include <stdlib.h> > #include <stdbool.h> > #include "xc_private.h" > +#include "_xc_cpuid_autogen.h" > #include <xen/arch-x86/cpufeatureset.h> > #include <xen/hvm/params.h> > > @@ -60,6 +61,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) I can only get a vague idea how these functions are supposed to work. I think I will leave this to hypervisor maintainers. Wei.
On Fri, Feb 05, 2016 at 04:12:45PM +0000, Wei Liu wrote: > On Fri, Feb 05, 2016 at 01:42:19PM +0000, Andrew Cooper wrote: > > Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> > > --- > > CC: Ian Campbell <Ian.Campbell@citrix.com> > > CC: Ian Jackson <Ian.Jackson@eu.citrix.com> > > CC: Wei Liu <wei.liu2@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 0a8614c..30de3fe 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 > > I don't seem to see this file in tree or in this series. > Stupid me, I missed it. It's in another patch. So in principle: Acked-by: Wei Liu <wei.liu2@citrix.com>
diff --git a/tools/libxc/Makefile b/tools/libxc/Makefile index 0a8614c..30de3fe 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 5a7500a..1da372d 100644 --- a/tools/libxc/include/xenctrl.h +++ b/tools/libxc/include/xenctrl.h @@ -2574,6 +2574,20 @@ int xc_psr_cat_get_l3_info(xc_interface *xch, uint32_t socket, 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_INVERTED, + 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 348cbdd..7ef37d2 100644 --- a/tools/libxc/xc_cpuid_x86.c +++ b/tools/libxc/xc_cpuid_x86.c @@ -22,6 +22,7 @@ #include <stdlib.h> #include <stdbool.h> #include "xc_private.h" +#include "_xc_cpuid_autogen.h" #include <xen/arch-x86/cpufeatureset.h> #include <xen/hvm/params.h> @@ -60,6 +61,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, + inverted[FEATURESET_NR_ENTRIES] = INIT_INVERTED_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(inverted) != 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_INVERTED: + return inverted; + + 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
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> --- CC: Ian Campbell <Ian.Campbell@citrix.com> CC: Ian Jackson <Ian.Jackson@eu.citrix.com> CC: Wei Liu <wei.liu2@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(+)