forked from rpms/glibc
64 lines
2.4 KiB
Diff
64 lines
2.4 KiB
Diff
commit afc5ed09cbce5d6fd48b3a8c5ec427b31f996880
|
|
Author: Ulrich Drepper <drepper@gmail.com>
|
|
Date: Thu Jan 26 07:45:14 2012 -0500
|
|
|
|
Reset bit_AVX in __cpu_features is OS support is missing
|
|
|
|
2012-01-26 Ulrich Drepper <drepper@gmail.com>
|
|
|
|
[BZ #13583]
|
|
* sysdeps/x86_64/multiarch/init-arch.h: Define bit_OSXSAVE.
|
|
* sysdeps/x86_64/multiarch/init-arch.c (__init_cpu_features): If
|
|
bit_AVX is set also check OSXAVE/XCR0 and reset bit_AVX if necessary.
|
|
|
|
diff --git a/sysdeps/x86_64/multiarch/init-arch.c b/sysdeps/x86_64/multiarch/init-arch.c
|
|
index 65b0ee9..4fabbee 100644
|
|
--- a/sysdeps/x86_64/multiarch/init-arch.c
|
|
+++ b/sysdeps/x86_64/multiarch/init-arch.c
|
|
@@ -1,6 +1,6 @@
|
|
/* Initialize CPU feature data.
|
|
This file is part of the GNU C Library.
|
|
- Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
|
|
+ Copyright (C) 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
|
|
Contributed by Ulrich Drepper <drepper@redhat.com>.
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
@@ -144,6 +144,18 @@ __init_cpu_features (void)
|
|
else
|
|
kind = arch_kind_other;
|
|
|
|
+ if (__cpu_features.cpuid[COMMON_CPUID_INDEX_1].ecx & bit_AVX)
|
|
+ {
|
|
+ /* Reset the AVX bit in case OSXSAVE is disabled. */
|
|
+ if ((__cpu_features.cpuid[COMMON_CPUID_INDEX_1].ecx & bit_OSXSAVE) == 0
|
|
+ || ({ unsigned int xcrlow;
|
|
+ unsigned int xcrhigh;
|
|
+ asm ("xgetbv"
|
|
+ : "=a" (xcrlow), "=d" (xcrhigh) : "c" (0));
|
|
+ (xcrlow & 6) != 6; }))
|
|
+ __cpu_features.cpuid[COMMON_CPUID_INDEX_1].ecx &= ~bit_AVX;
|
|
+ }
|
|
+
|
|
__cpu_features.family = family;
|
|
__cpu_features.model = model;
|
|
atomic_write_barrier ();
|
|
diff --git a/sysdeps/x86_64/multiarch/init-arch.h b/sysdeps/x86_64/multiarch/init-arch.h
|
|
index 2a1df39..408e5ae 100644
|
|
--- a/sysdeps/x86_64/multiarch/init-arch.h
|
|
+++ b/sysdeps/x86_64/multiarch/init-arch.h
|
|
@@ -1,5 +1,5 @@
|
|
/* This file is part of the GNU C Library.
|
|
- Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
|
|
+ Copyright (C) 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
@@ -27,6 +27,7 @@
|
|
#define bit_SSSE3 (1 << 9)
|
|
#define bit_SSE4_1 (1 << 19)
|
|
#define bit_SSE4_2 (1 << 20)
|
|
+#define bit_OSXSAVE (1 << 27)
|
|
#define bit_AVX (1 << 28)
|
|
#define bit_POPCOUNT (1 << 23)
|
|
#define bit_FMA (1 << 12)
|