From 55590b65f2de925cdf093210d9a17f3fc745c389 Mon Sep 17 00:00:00 2001 From: Christopher Clark Date: Tue, 25 Sep 2018 10:40:59 -0700 Subject: xen: fix build with _FORTIFY_SOURCE, gcc 8.2 and glibc 2.28 Apply upstream-reviewed patch to fix compilation. Patch reorders header includes to issue a pragma to disable SSE before including any potentially always_inline functions that would use SSE. Also modify the recipe to supply compiler flags via the tools variables where they will get used, necessary as _FORTIFY_SOURCE requires optimization flags to be supplied. Signed-off-by: Christopher Clark Signed-off-by: Bruce Ashfield --- .../xen/files/xen-disable-sse-before-inlines.patch | 140 +++++++++++++++++++++ recipes-extended/xen/xen.inc | 6 + recipes-extended/xen/xen_4.11.0.bb | 1 + recipes-extended/xen/xen_git.bb | 1 + 4 files changed, 148 insertions(+) create mode 100644 recipes-extended/xen/files/xen-disable-sse-before-inlines.patch diff --git a/recipes-extended/xen/files/xen-disable-sse-before-inlines.patch b/recipes-extended/xen/files/xen-disable-sse-before-inlines.patch new file mode 100644 index 00000000..54a28ee4 --- /dev/null +++ b/recipes-extended/xen/files/xen-disable-sse-before-inlines.patch @@ -0,0 +1,140 @@ +From 6d50ae155c0f736aa6239eabf1bc8c8e3704742d Mon Sep 17 00:00:00 2001 +From: Christopher Clark +Date: Fri, 21 Sep 2018 08:28:02 -0700 +Subject: [PATCH v2] fuzz, test x86_emulator: disable sse before including + always_inline fns +To: xen-devel@lists.xenproject.org, + jbeulich@suse.com +Cc: ian.jackson@eu.citrix.com, + wei.liu2@citrix.com, + andrew.cooper3@citrix.com + +Workaround for compiler rejection of SSE-using always_inlines defined before +SSE is disabled. + +Compiling with _FORTIFY_SOURCE or higher levels of optimization enabled +will always_inline several library fns (memset, memcpy, ...) +(with gcc 8.2.0 and glibc 2.28). + +In fuzz and x86_emulator test, the compiler is instructed not +to generate SSE instructions via: #pragma GCC target("no-sse") +because those registers are needed for use by the workload. + +The combination above causes compilation failure as the inline functions +use those instructions. This is resolved by reordering the inclusion of + and to after the pragma disabling SSE generation. + +It would be preferable to locate the no-sse pragma within x86-emulate.h at the +top of the file, prior to including any other headers; unfortunately doing so +before causes compilation failure due to declaration of 'atof' with: + "SSE register return with SSE disabled". +Fortunately there is no (known) current dependency on any always_inline +SSE-inclined function declared in or any of its dependencies, so the +pragma is therefore issued immediately after inclusion of with a +comment introduced to explain its location there. + +Add compile-time checks for unwanted prior inclusion of and +, which are the two headers that provide the library functions that +are handled with wrappers and listed within "x86-emulate.h" as ones "we think +might access any of the FPU state". +* Use standard-defined "EOF" macro to detect prior inclusion. +* Use "_STRING_H" (non-standardized guard macro) as best-effort + for detection of prior inclusion. This is non-universally + viable but will provide error output on common GLIBC systems, so + provides some defensive coverage. + +Adds conditional #include to x86-emulate.h because fwrite, printf, +etc. are referenced when WRAP has been defined. + +Signed-off-by: Christopher Clark +Reviewed-by: Jan Beulich +--- + tools/fuzz/x86_instruction_emulator/fuzz-emul.c | 10 +++++++-- + tools/tests/x86_emulator/wrappers.c | 1 - + tools/tests/x86_emulator/x86-emulate.h | 28 +++++++++++++++++++++++-- + 3 files changed, 34 insertions(+), 5 deletions(-) + +diff --git a/tools/fuzz/x86_instruction_emulator/fuzz-emul.c b/tools/fuzz/x86_instruction_emulator/fuzz-emul.c +index 03a2473..0ffd0fb 100644 +--- a/tools/fuzz/x86_instruction_emulator/fuzz-emul.c ++++ b/tools/fuzz/x86_instruction_emulator/fuzz-emul.c +@@ -6,9 +6,7 @@ + #include + #include + #include +-#include + #include +-#include + #include + #include + #include +@@ -16,6 +14,14 @@ + #include + + #include "x86-emulate.h" ++/* ++ * include "x86-emulate.h" prior to and : ++ * x86-emulate.h disables use of SSE registers, while and ++ * declare functions that may be always_inline and use those registers ++ * unless they have been disabled earlier, which can fail to compile. ++ */ ++#include ++#include + #include "fuzz-emul.h" + + #define MSR_INDEX_MAX 16 +diff --git a/tools/tests/x86_emulator/wrappers.c b/tools/tests/x86_emulator/wrappers.c +index d02013c..eba7cc9 100644 +--- a/tools/tests/x86_emulator/wrappers.c ++++ b/tools/tests/x86_emulator/wrappers.c +@@ -1,5 +1,4 @@ + #include +-#include + + #define WRAP(x) typeof(x) emul_##x + #include "x86-emulate.h" +diff --git a/tools/tests/x86_emulator/x86-emulate.h b/tools/tests/x86_emulator/x86-emulate.h +index b249e46..07ea1e8 100644 +--- a/tools/tests/x86_emulator/x86-emulate.h ++++ b/tools/tests/x86_emulator/x86-emulate.h +@@ -3,11 +3,35 @@ + #include + #include + #include +-#include +- ++/* ++ * Use of sse registers must be disabled prior to the definition of ++ * always_inline functions that would use them (memcpy, memset, etc), ++ * so do this as early as possible, aiming to be before any always_inline ++ * functions that are used are declared. ++ * Unfortunately, this cannot be done prior to inclusion of ++ * due to functions such as 'atof' that have SSE register return declared, ++ * so do so here, immediately after that. ++ */ + #if __GNUC__ >= 6 + #pragma GCC target("no-sse") + #endif ++ /* ++ * Attempt detection of unwanted prior inclusion of some headers known to use ++ * always_inline with SSE registers in some library / compiler / optimization ++ * combinations. ++ */ ++#ifdef _STRING_H ++#error "Must not include before x86-emulate.h" ++#endif ++#include ++ ++/* EOF is a standard macro defined in so use it for detection */ ++#ifdef EOF ++#error "Must not include before x86-emulate.h" ++#endif ++#ifdef WRAP ++#include ++#endif + + #include + +-- +2.1.4 + diff --git a/recipes-extended/xen/xen.inc b/recipes-extended/xen/xen.inc index bf4b3c28..365f71d9 100644 --- a/recipes-extended/xen/xen.inc +++ b/recipes-extended/xen/xen.inc @@ -842,6 +842,12 @@ export LDFLAGS="" # patching the build to be ok with this TUNE_CCARGS := "${@oe.utils.str_filter_out('-mfpmath=sse', '${TUNE_CCARGS}', d)}" +# Supply the full set of compiler flags via the tool variables +# Yocto supplys _FORTIFY_SOURCE via CC/CPP/CXX but optimization -O via C*FLAGS +CC_append = " ${CFLAGS}" +CPP_append = " ${CPPFLAGS}" +CXX_append = " ${CXXFLAGS}" + EXTRA_OECONF += " \ --exec-prefix=/usr \ --prefix=/usr \ diff --git a/recipes-extended/xen/xen_4.11.0.bb b/recipes-extended/xen/xen_4.11.0.bb index 40e73405..b2750667 100644 --- a/recipes-extended/xen/xen_4.11.0.bb +++ b/recipes-extended/xen/xen_4.11.0.bb @@ -6,6 +6,7 @@ SRC_URI = " \ file://tools-xentop-vwprintw.patch \ file://xen-4.11-arm-acpi-fix-string-lengths.patch \ file://xen-tools-xenpmd-snprintf.patch \ + file://xen-disable-sse-before-inlines.patch \ " SRC_URI[md5sum] = "cbec0600284921744bc14119f4ed3fff" diff --git a/recipes-extended/xen/xen_git.bb b/recipes-extended/xen/xen_git.bb index da1eea60..81ee1002 100644 --- a/recipes-extended/xen/xen_git.bb +++ b/recipes-extended/xen/xen_git.bb @@ -12,6 +12,7 @@ S = "${WORKDIR}/git" SRC_URI = " \ git://xenbits.xen.org/xen.git;branch=${XEN_BRANCH} \ + file://xen-disable-sse-before-inlines.patch \ " DEFAULT_PREFERENCE = "-1" -- cgit v1.2.3-54-g00ecf