Reset bit_AVX in __cpu_features is OS support is missing
authorUlrich Drepper <drepper@gmail.com>
Thu, 26 Jan 2012 12:45:14 +0000 (07:45 -0500)
committerUlrich Drepper <drepper@gmail.com>
Thu, 26 Jan 2012 12:45:14 +0000 (07:45 -0500)
ChangeLog
NEWS
sysdeps/x86_64/multiarch/init-arch.c
sysdeps/x86_64/multiarch/init-arch.h

index a0b355e..1e2284f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+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.
+
 2012-01-25  Joseph Myers  <joseph@codesourcery.com>
 
        * elf/tst-unique3.cc (gets): Remove declaration.
diff --git a/NEWS b/NEWS
index 5e062af..42e09c1 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,4 @@
-GNU C Library NEWS -- history of user-visible changes.  2012-1-10
+GNU C Library NEWS -- history of user-visible changes.  2012-1-26
 Copyright (C) 1992-2009, 2010, 2011, 2012 Free Software Foundation, Inc.
 See the end for copying conditions.
 
@@ -10,7 +10,7 @@ Version 2.16
 * The following bugs are resolved with this release:
 
   13525, 13526, 13527, 13528, 13529, 13531, 13532, 13533, 13547, 13530,
-  13551, 13552, 13553, 13555, 13559
+  13551, 13552, 13553, 13555, 13559, 13583
 
 * ISO C11 support:
 
index 65b0ee9..4fabbee 100644 (file)
@@ -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 ();
index 2a1df39..408e5ae 100644 (file)
@@ -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)