| From b1971f6f1331d738d1d6b376b4741668a7546125 Mon Sep 17 00:00:00 2001 |
| From: "H.J. Lu" <hjl.tools@gmail.com> |
| Date: Tue, 2 Feb 2021 13:45:58 -0800 |
| Subject: [PATCH] x86: Require full ISA support for x86-64 level marker [BZ #27318] |
| |
| Since -march=sandybridge enables ISAs in x86-64 ISA level v3, the v3 |
| marker is set on libc.so. We couldn't set the needed ISA marker to v2 |
| since this libc won't run on all v2 machines. Technically, the v3 marker |
| is correct. But the resulting libc.so won't run on Sandy Brigde, which |
| is a v2 machine, even when libc is compiled with -march=sandybridge: |
| |
| $ ./elf/ld.so ./libc.so |
| ./libc.so: (p) CPU ISA level is lower than required: needed: 7; got: 3 |
| |
| Instead, we require full ISA support for x86-64 level marker and disable |
| x86-64 level marker for -march=sandybridge which enables ISAs between v2 |
| and v3. |
| |
| Upstream-Status: Submitted [https://sourceware.org/pipermail/libc-alpha/2021-February/122297.html] |
| Signed-off-by: Khem Raj <raj.khem@gmail.com> |
| --- |
| |
| sysdeps/x86/configure | 7 ++++++- |
| sysdeps/x86/configure.ac | 2 +- |
| sysdeps/x86/isa-level.c | 21 ++++++++++++++++++++- |
| 3 files changed, 27 insertions(+), 3 deletions(-) |
| |
| diff --git a/sysdeps/x86/configure b/sysdeps/x86/configure |
| index 5e32dc62b3..5b20646843 100644 |
| --- a/sysdeps/x86/configure |
| +++ b/sysdeps/x86/configure |
| @@ -133,7 +133,12 @@ if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -nostartfiles -nostdlib -r -o conftest c |
| $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 |
| test $ac_status = 0; }; }; then |
| count=`LC_ALL=C $READELF -n conftest | grep NT_GNU_PROPERTY_TYPE_0 | wc -l` |
| - if test "$count" = 1; then |
| + if test "$count" = 1 && { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -DINCLUDE_X86_ISA_LEVEL -S -o conftest.s $srcdir/sysdeps/x86/isa-level.c' |
| + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 |
| + (eval $ac_try) 2>&5 |
| + ac_status=$? |
| + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 |
| + test $ac_status = 0; }; }; then |
| libc_cv_include_x86_isa_level=yes |
| fi |
| fi |
| diff --git a/sysdeps/x86/configure.ac b/sysdeps/x86/configure.ac |
| index f94088f377..54ecd33d2c 100644 |
| --- a/sysdeps/x86/configure.ac |
| +++ b/sysdeps/x86/configure.ac |
| @@ -100,7 +100,7 @@ EOF |
| libc_cv_include_x86_isa_level=no |
| if AC_TRY_COMMAND(${CC-cc} $CFLAGS $CPPFLAGS -nostartfiles -nostdlib -r -o conftest conftest1.S conftest2.S); then |
| count=`LC_ALL=C $READELF -n conftest | grep NT_GNU_PROPERTY_TYPE_0 | wc -l` |
| - if test "$count" = 1; then |
| + if test "$count" = 1 && AC_TRY_COMMAND(${CC-cc} $CFLAGS $CPPFLAGS -DINCLUDE_X86_ISA_LEVEL -S -o conftest.s $srcdir/sysdeps/x86/isa-level.c); then |
| libc_cv_include_x86_isa_level=yes |
| fi |
| fi |
| diff --git a/sysdeps/x86/isa-level.c b/sysdeps/x86/isa-level.c |
| index aaf524cb56..7f83449061 100644 |
| --- a/sysdeps/x86/isa-level.c |
| +++ b/sysdeps/x86/isa-level.c |
| @@ -25,12 +25,17 @@ |
| License along with the GNU C Library; if not, see |
| <https://www.gnu.org/licenses/>. */ |
| |
| -#include <elf.h> |
| +#ifdef _LIBC |
| +# include <elf.h> |
| +#endif |
| |
| /* ELF program property for x86 ISA level. */ |
| #ifdef INCLUDE_X86_ISA_LEVEL |
| # if defined __x86_64__ || defined __FXSR__ || !defined _SOFT_FLOAT \ |
| || defined __MMX__ || defined __SSE__ || defined __SSE2__ |
| +# if !defined __SSE__ || !defined __SSE2__ |
| +# error "Missing ISAs for x86-64 ISA level baseline" |
| +# endif |
| # define ISA_BASELINE GNU_PROPERTY_X86_ISA_1_BASELINE |
| # else |
| # define ISA_BASELINE 0 |
| @@ -40,6 +45,11 @@ |
| || (defined __x86_64__ && defined __LAHF_SAHF__) \ |
| || defined __POPCNT__ || defined __SSE3__ \ |
| || defined __SSSE3__ || defined __SSE4_1__ || defined __SSE4_2__ |
| +# if !defined __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16 \ |
| + || !defined __POPCNT__ || !defined __SSE3__ \ |
| + || !defined __SSSE3__ || !defined __SSE4_1__ || !defined __SSE4_2__ |
| +# error "Missing ISAs for x86-64 ISA level v2" |
| +# endif |
| # define ISA_V2 GNU_PROPERTY_X86_ISA_1_V2 |
| # else |
| # define ISA_V2 0 |
| @@ -48,6 +58,10 @@ |
| # if defined __AVX__ || defined __AVX2__ || defined __F16C__ \ |
| || defined __FMA__ || defined __LZCNT__ || defined __MOVBE__ \ |
| || defined __XSAVE__ |
| +# if !defined __AVX__ || !defined __AVX2__ || !defined __F16C__ \ |
| + || !defined __FMA__ || !defined __LZCNT__ |
| +# error "Missing ISAs for x86-64 ISA level v3" |
| +# endif |
| # define ISA_V3 GNU_PROPERTY_X86_ISA_1_V3 |
| # else |
| # define ISA_V3 0 |
| @@ -55,6 +69,11 @@ |
| |
| # if defined __AVX512F__ || defined __AVX512BW__ || defined __AVX512CD__ \ |
| || defined __AVX512DQ__ || defined __AVX512VL__ |
| +# if !defined __AVX512F__ || !defined __AVX512BW__ \ |
| + || !defined __AVX512CD__ || !defined __AVX512DQ__ \ |
| + || !defined __AVX512VL__ |
| +# error "Missing ISAs for x86-64 ISA level v4" |
| +# endif |
| # define ISA_V4 GNU_PROPERTY_X86_ISA_1_V4 |
| # else |
| # define ISA_V4 0 |