]> granicus.if.org Git - libjpeg-turbo/commitdiff
AVX2: Verify O/S support for AVX2 before enabling
authorDRC <information@libjpeg-turbo.org>
Tue, 12 Jul 2016 01:21:46 +0000 (20:21 -0500)
committerDRC <information@libjpeg-turbo.org>
Tue, 12 Jul 2016 01:26:34 +0000 (20:26 -0500)
This fixes crashes that would occur when attempting to use
libjpeg-turbo's AVX2 extensions on older O/S's (such as Windows XP or
RHEL 5.)  Even if the CPU supports AVX2, the O/S has to also support
saving/restoring YMM registers when switching contexts.

simd/jsimdcpu-64.asm
simd/jsimdcpu.asm

index 80e19c9ea209a484d7eb352be99896117ee8f40b..d0c2e5bf38c65f6b68775682e15d329233f22dc6 100644 (file)
@@ -48,6 +48,16 @@ EXTN(jpeg_simd_cpu_support):
     or          rdi, JSIMD_SSE
     test        rax, 1<<5               ; bit5:AVX2
     jz          short .return
+
+    ; Check for AVX2 O/S support
+    mov         rax, 1
+    xor         rcx, rcx
+    cpuid
+    test        rcx, 1<<27
+    jz          short .return           ; O/S does not support XSAVE
+    test        rcx, 1<<28
+    jz          short .return           ; CPU does not support AVX2
+
     or          rdi, JSIMD_AVX2
 
 .return:
index 71abf93bb9e0bc827df5daf331dd5cb9e5de4397..92782e2855ff26b2e90746c154055afc45bd09a1 100644 (file)
@@ -82,6 +82,16 @@ EXTN(jpeg_simd_cpu_support):
     mov         eax, ebx
     test        eax, 1<<5               ; bit5:AVX2
     jz          short .no_avx2
+
+    ; Check for AVX2 O/S support
+    mov         eax, 1
+    xor         ecx, ecx
+    cpuid
+    test        ecx, 1<<27
+    jz          short .no_avx2          ; O/S does not support XSAVE
+    test        ecx, 1<<28
+    jz          short .no_avx2          ; CPU does not support AVX2
+
     or          edi, JSIMD_AVX2
 .no_avx2: