[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 05/13] libx86: introduce a libx86 shared library
From: Roger Pau Monné <roger.pau@xxxxxxxxxx> Move x86_cpuid_lookup_deep_deps() into the shared library, removing the individual copies from the hypervisor and libxc respectively. Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- CC: Jan Beulich <JBeulich@xxxxxxxx> CC: Wei Liu <wei.liu2@xxxxxxxxxx> CC: Roger Pau Monné <roger.pau@xxxxxxxxxx> CC: Sergey Dyasli <sergey.dyasli@xxxxxxxxxx> CC: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx> v2: * Rename libx86-private.h to just private.h * Only vpath libx86 for CONFIG_X86 builds of libxc --- tools/libxc/Makefile | 6 ++++++ tools/libxc/include/xenctrl.h | 1 - tools/libxc/xc_cpuid_x86.c | 29 +--------------------------- xen/arch/x86/cpu/common.c | 2 +- xen/arch/x86/cpuid.c | 32 +----------------------------- xen/common/Makefile | 1 + xen/common/libx86/Makefile | 1 + xen/common/libx86/cpuid.c | 44 ++++++++++++++++++++++++++++++++++++++++++ xen/common/libx86/private.h | 38 ++++++++++++++++++++++++++++++++++++ xen/include/asm-x86/cpuid.h | 2 -- xen/include/xen/libx86/cpuid.h | 2 ++ 11 files changed, 95 insertions(+), 63 deletions(-) create mode 100644 xen/common/libx86/Makefile create mode 100644 xen/common/libx86/cpuid.c create mode 100644 xen/common/libx86/private.h diff --git a/tools/libxc/Makefile b/tools/libxc/Makefile index ca2b203..cd4225c 100644 --- a/tools/libxc/Makefile +++ b/tools/libxc/Makefile @@ -80,6 +80,12 @@ GUEST_SRCS-y += $(ELF_SRCS-y) $(patsubst %.c,%.o,$(ELF_SRCS-y)): CFLAGS += -Wno-pointer-sign $(patsubst %.c,%.opic,$(ELF_SRCS-y)): CFLAGS += -Wno-pointer-sign +ifeq ($(CONFIG_X86),y) # Add libx86 to the build +vpath %.c ../../xen/common/libx86 + +GUEST_SRCS-y += cpuid.c +endif + # new domain builder GUEST_SRCS-y += xc_dom_core.c xc_dom_boot.c GUEST_SRCS-y += xc_dom_elfloader.c diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h index 5520c94..dd7d8a9 100644 --- a/tools/libxc/include/xenctrl.h +++ b/tools/libxc/include/xenctrl.h @@ -2564,7 +2564,6 @@ enum xc_static_cpu_featuremask { 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 diff --git a/tools/libxc/xc_cpuid_x86.c b/tools/libxc/xc_cpuid_x86.c index d2f85aa..3c214c8 100644 --- a/tools/libxc/xc_cpuid_x86.c +++ b/tools/libxc/xc_cpuid_x86.c @@ -131,33 +131,6 @@ const uint32_t *xc_get_static_cpu_featuremask( } } -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); - - 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 @@ -677,7 +650,7 @@ static void sanitise_featureset(struct cpuid_domain_info *info) const uint32_t *dfs; if ( !test_bit(b, disabled_features) || - !(dfs = xc_get_feature_deep_deps(b)) ) + !(dfs = x86_cpuid_lookup_deep_deps(b)) ) continue; for ( i = 0; i < ARRAY_SIZE(disabled_features); ++i ) diff --git a/xen/arch/x86/cpu/common.c b/xen/arch/x86/cpu/common.c index 6570c2d..185fefe 100644 --- a/xen/arch/x86/cpu/common.c +++ b/xen/arch/x86/cpu/common.c @@ -62,7 +62,7 @@ void __init setup_clear_cpu_cap(unsigned int cap) __builtin_return_address(0), cap); __clear_bit(cap, boot_cpu_data.x86_capability); - dfs = lookup_deep_deps(cap); + dfs = x86_cpuid_lookup_deep_deps(cap); if (!dfs) return; diff --git a/xen/arch/x86/cpuid.c b/xen/arch/x86/cpuid.c index 3c29191..731ccb6 100644 --- a/xen/arch/x86/cpuid.c +++ b/xen/arch/x86/cpuid.c @@ -97,7 +97,7 @@ static void sanitise_featureset(uint32_t *fs) for_each_set_bit(i, (void *)disabled_features, sizeof(disabled_features) * 8) { - const uint32_t *dfs = lookup_deep_deps(i); + const uint32_t *dfs = x86_cpuid_lookup_deep_deps(i); unsigned int j; ASSERT(dfs); /* deep_features[] should guarentee this. */ @@ -544,36 +544,6 @@ bool recheck_cpu_features(unsigned int cpu) return okay; } -const uint32_t *lookup_deep_deps(uint32_t feature) -{ - static const struct { - uint32_t feature; - uint32_t fs[FSCAPINTS]; - } deep_deps[] = INIT_DEEP_DEPS; - unsigned int start = 0, end = ARRAY_SIZE(deep_deps); - - BUILD_BUG_ON(ARRAY_SIZE(deep_deps) != NR_DEEP_DEPS); - - /* Fast early exit. */ - if ( !test_bit(feature, deep_features) ) - return NULL; - - /* 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; -} - void recalculate_cpuid_policy(struct domain *d) { struct cpuid_policy *p = d->arch.cpuid; diff --git a/xen/common/Makefile b/xen/common/Makefile index b3e0b0e..a843394 100644 --- a/xen/common/Makefile +++ b/xen/common/Makefile @@ -80,3 +80,4 @@ subdir-$(CONFIG_UBSAN) += ubsan subdir-$(CONFIG_NEEDS_LIBELF) += libelf subdir-$(CONFIG_HAS_DEVICE_TREE) += libfdt +subdir-$(CONFIG_X86) += libx86 diff --git a/xen/common/libx86/Makefile b/xen/common/libx86/Makefile new file mode 100644 index 0000000..3fb2e0b --- /dev/null +++ b/xen/common/libx86/Makefile @@ -0,0 +1 @@ +obj-y += cpuid.o diff --git a/xen/common/libx86/cpuid.c b/xen/common/libx86/cpuid.c new file mode 100644 index 0000000..0f497d4 --- /dev/null +++ b/xen/common/libx86/cpuid.c @@ -0,0 +1,44 @@ +#include "private.h" + +#include <xen/libx86/cpuid.h> + +const uint32_t *x86_cpuid_lookup_deep_deps(uint32_t feature) +{ + static const uint32_t deep_features[] = INIT_DEEP_FEATURES; + 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); + + BUILD_BUG_ON(ARRAY_SIZE(deep_deps) != NR_DEEP_DEPS); + + /* Fast early exit. */ + if ( !test_bit(feature, deep_features) ) + return NULL; + + /* 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; +} + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/common/libx86/private.h b/xen/common/libx86/private.h new file mode 100644 index 0000000..c234b85 --- /dev/null +++ b/xen/common/libx86/private.h @@ -0,0 +1,38 @@ +#ifndef XEN_LIBX86_PRIVATE_H +#define XEN_LIBX86_PRIVATE_H + +#ifdef __XEN__ + +#include <xen/bitops.h> +#include <xen/kernel.h> +#include <xen/lib.h> +#include <xen/types.h> + +#else + +#include <inttypes.h> +#include <stdbool.h> +#include <stddef.h> + +#include <xen-tools/libs.h> + +static inline bool test_bit(unsigned int bit, const void *vaddr) +{ + const char *addr = vaddr; + + return addr[bit / 8] & (1u << (bit % 8)); +} + +#endif /* __XEN__ */ + +#endif /* XEN_LIBX86_PRIVATE_H */ + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/include/asm-x86/cpuid.h b/xen/include/asm-x86/cpuid.h index 7a3f2f4..ea79445 100644 --- a/xen/include/asm-x86/cpuid.h +++ b/xen/include/asm-x86/cpuid.h @@ -17,8 +17,6 @@ extern const uint32_t special_features[FSCAPINTS]; void init_guest_cpuid(void); -const uint32_t *lookup_deep_deps(uint32_t feature); - /* * Expected levelling capabilities (given cpuid vendor/family information), * and levelling capabilities actually available (given MSR probing). diff --git a/xen/include/xen/libx86/cpuid.h b/xen/include/xen/libx86/cpuid.h index 69bd8a9..233fa13 100644 --- a/xen/include/xen/libx86/cpuid.h +++ b/xen/include/xen/libx86/cpuid.h @@ -228,6 +228,8 @@ static inline void cpuid_featureset_to_policy( p->feat._7d0 = fs[FEATURESET_7d0]; } +const uint32_t *x86_cpuid_lookup_deep_deps(uint32_t feature); + #endif /* !XEN_LIBX86_CPUID_H */ /* -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |