Author: aurel32
Date: 2011-10-30 17:05:36 +0000 (Sun, 30 Oct 2011)
New Revision: 5021

Added:
   
glibc-package/branches/glibc-branch-squeeze/debian/patches/amd64/cvs-avx-detection.diff
Modified:
   glibc-package/branches/glibc-branch-squeeze/debian/changelog
   glibc-package/branches/glibc-branch-squeeze/debian/patches/series
Log:
  * patches/amd64/cvs-avx-detection.diff: do not use AVX if hardware support
    is present, but not enabled in the kernel.  Closes: #646549.



Modified: glibc-package/branches/glibc-branch-squeeze/debian/changelog
===================================================================
--- glibc-package/branches/glibc-branch-squeeze/debian/changelog        
2011-10-30 17:03:00 UTC (rev 5020)
+++ glibc-package/branches/glibc-branch-squeeze/debian/changelog        
2011-10-30 17:05:36 UTC (rev 5021)
@@ -50,6 +50,8 @@
   * patches/i386/local-cpuid-level2.diff: fix a typo.  Closes: #609389.
   * patches/any/cvs-nptl-pthread-race.diff: fix a race in NPTL code that
     sometimes causes a deadlock when calling fork() from a thread.
+  * patches/amd64/cvs-avx-detection.diff: do not use AVX if hardware support
+    is present, but not enabled in the kernel.  Closes: #646549.
 
  -- Aurelien Jarno <aure...@debian.org>  Sat, 11 Jun 2011 18:12:35 +0200
 

Added: 
glibc-package/branches/glibc-branch-squeeze/debian/patches/amd64/cvs-avx-detection.diff
===================================================================
--- 
glibc-package/branches/glibc-branch-squeeze/debian/patches/amd64/cvs-avx-detection.diff
                             (rev 0)
+++ 
glibc-package/branches/glibc-branch-squeeze/debian/patches/amd64/cvs-avx-detection.diff
     2011-10-30 17:05:36 UTC (rev 5021)
@@ -0,0 +1,164 @@
+2011-07-23  Ulrich Drepper  <drep...@gmail.com>
+
+       * sysdeps/x86_64/dl-trampoline.S (_dl_runtime_profile): Fix one more
+       typo.
+       (_dl_x86_64_save_sse): Likewise.
+
+2011-07-22  Ulrich Drepper  <drep...@gmail.com>
+ 
+       * sysdeps/x86_64/dl-trampoline.S (_dl_runtime_profile): Fix test for
+       OSXSAVE.
+       (_dl_x86_64_save_sse): Likewise.
+
+2011-07-21  Andreas Schwab  <sch...@redhat.com>
+
+       * sysdeps/x86_64/dl-trampoline.S (_dl_runtime_profile): Fix last
+       change.
+       (_dl_x86_64_save_sse): Use correct AVX check.
+
+2011-07-20  Ulrich Drepper  <drep...@gmail.com>
+ 
+       [BZ #13007]
+       * sysdeps/x86_64/dl-trampoline.S (_dl_runtime_profile): More complete
+       check for AVX enablement so that we don't crash with old kernels and
+       new hardware.
+       * elf/tst-audit4.c: Add same checks here.
+       * elf/tst-audit6.c: Likewise.
+
+---
+ elf/tst-audit4.c               |   22 ++++++++++++++++++----
+ elf/tst-audit6.c               |   22 ++++++++++++++++++----
+ sysdeps/x86_64/dl-trampoline.S |   36 +++++++++++++++++++++++++++---------
+ 3 files changed, 63 insertions(+), 17 deletions(-)
+
+--- a/elf/tst-audit4.c
++++ b/elf/tst-audit4.c
+@@ -6,16 +6,30 @@
+ #include <cpuid.h>
+ #include <immintrin.h>
+ 
++
++static int
++avx_enabled (void)
++{
++  unsigned int eax, ebx, ecx, edx;
++
++  if (__get_cpuid (1, &eax, &ebx, &ecx, &edx) == 0
++      || (ecx & (bit_AVX | bit_OSXSAVE)) != (bit_AVX | bit_OSXSAVE))
++    return 0;
++
++  /* Check the OS has AVX and SSE saving enabled.  */
++  asm ("xgetbv" : "=a" (eax), "=d" (edx) : "c" (0));
++
++  return (eax & 6) == 6;
++}
++
++
+ extern __m256i audit_test (__m256i, __m256i, __m256i, __m256i,
+                          __m256i, __m256i, __m256i, __m256i);
+ int
+ main (void)
+ {
+-  unsigned int eax, ebx, ecx, edx;
+-
+   /* Run AVX test only if AVX is supported.  */
+-  if (__get_cpuid (1, &eax, &ebx, &ecx, &edx)
+-      && (ecx & bit_AVX))
++  if (avx_enabled ())
+     {
+       __m256i ymm = _mm256_setzero_si256 ();
+       __m256i ret = audit_test (ymm, ymm, ymm, ymm, ymm, ymm, ymm, ymm);
+--- a/elf/tst-audit6.c
++++ b/elf/tst-audit6.c
+@@ -9,14 +9,28 @@
+ extern __m128i audit_test (__m128i, __m128i, __m128i, __m128i,
+                          __m128i, __m128i, __m128i, __m128i);
+ 
+-int
+-main (void)
++
++static int
++avx_enabled (void)
+ {
+   unsigned int eax, ebx, ecx, edx;
+ 
++  if (__get_cpuid (1, &eax, &ebx, &ecx, &edx) == 0
++      || (ecx & (bit_AVX | bit_OSXSAVE)) != (bit_AVX | bit_OSXSAVE))
++    return 0;
++
++  /* Check the OS has AVX and SSE saving enabled.  */
++  asm ("xgetbv" : "=a" (eax), "=d" (edx) : "c" (0));
++
++  return (eax & 6) == 6;
++}
++
++
++int
++main (void)
++{
+   /* Run AVX test only if AVX is supported.  */
+-  if (__get_cpuid (1, &eax, &ebx, &ecx, &edx)
+-      && (ecx & bit_AVX))
++  if (avx_enabled ())
+     {
+       __m128i xmm = _mm_setzero_si128 ();
+       __m128i ret = audit_test (xmm, xmm, xmm, xmm, xmm, xmm, xmm, xmm);
+--- a/sysdeps/x86_64/dl-trampoline.S
++++ b/sysdeps/x86_64/dl-trampoline.S
+@@ -1,5 +1,5 @@
+ /* PLT trampolines.  x86-64 version.
+-   Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
++   Copyright (C) 2004, 2005, 2007, 2009, 2011 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -139,11 +139,20 @@
+       movl    $1, %eax
+       cpuid
+       movq    %r11,%rbx               # Restore rbx
+-      movl    $1, %eax
+-      testl   $(1 << 28), %ecx
++      xorl    %eax, %eax
++      // AVX and XSAVE supported?
++      andl    $((1 << 28) | (1 << 27)), %ecx
++      cmpl    $((1 << 28) | (1 << 27)), %ecx
+       jne     2f
+-      negl    %eax
+-2:    movl    %eax, L(have_avx)(%rip)
++      xorl    %ecx, %ecx
++      // Get XFEATURE_ENABLED_MASK
++      xgetbv
++      andl    $0x6, %eax
++      cmpl    $0x6, %eax
++      // Nonzero if SSE and AVX state saving is enabled.
++      sete    %al
++2:    leal    -1(%eax,%eax), %eax
++      movl    %eax, L(have_avx)(%rip)
+       cmpl    $0, %eax
+ 
+ 1:    js      L(no_avx)
+@@ -176,11 +185,20 @@
+       movl    $1, %eax
+       cpuid
+       movq    %r11,%rbx               # Restore rbx
+-      movl    $1, %eax
+-      testl   $(1 << 28), %ecx
++      xorl    %eax, %eax
++      // AVX and XSAVE supported?
++      andl    $((1 << 28) | (1 << 27)), %ecx
++      cmpl    $((1 << 28) | (1 << 27)), %ecx
+       jne     2f
+-      negl    %eax
+-2:    movl    %eax, L(have_avx)(%rip)
++      xorl    %ecx, %ecx
++      // Get XFEATURE_ENABLED_MASK
++      xgetbv
++      andl    $0x6, %eax
++      cmpl    $0x6, %eax
++      // Nonzero if SSE and AVX state saving is enabled.
++      sete    %al
++2:    leal    -1(%eax,%eax), %eax
++      movl    %eax, L(have_avx)(%rip)
+       cmpl    $0, %eax
+ 
+ 1:    js      L(no_avx5)

Modified: glibc-package/branches/glibc-branch-squeeze/debian/patches/series
===================================================================
--- glibc-package/branches/glibc-branch-squeeze/debian/patches/series   
2011-10-30 17:03:00 UTC (rev 5020)
+++ glibc-package/branches/glibc-branch-squeeze/debian/patches/series   
2011-10-30 17:05:36 UTC (rev 5021)
@@ -64,6 +64,7 @@
 amd64/local-clone.diff
 amd64/local-linuxthreads-gscope.diff
 amd64/submitted-tst-audit6-avx.diff
+amd64/cvs-avx-detection.diff
 
 arm/local-atomic.diff
 arm/local-eabi-wchar.diff


-- 
To UNSUBSCRIBE, email to debian-glibc-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org
Archive: http://lists.debian.org/e1rkypf-0000vz...@vasks.debian.org

Reply via email to