I think this is fine.  It's been a very long time since we had to worry
about this.

Keith

On Mon, 2010-08-16 at 01:17 -0700, Vinson Lee wrote:
> I am proposing to remove the check_os_katmai_support function from 
> u_cpu_detect.
> 
> util: Remove check_os_katmai_support.
> 
> check_os_katmai_support checks that the operating system running on a 
> SSE-capable processor supports SSE. This is necessary for unpatched 2.2.x and 
> earlier kernels. 2.4.x and later kernels support SSE.
> 
> check_os_katmai_support will disable SSE capabilities for 32-bit x86 
> operating systems for which there is no code path. Currently, this function 
> handles Linux, Windows, and several BSDs. Mac OS, Cygwin, and Solaris are 
> several operating systems with no code paths.
> 
> Rather than add code for the unhandled operating systems, remove this 
> function altogether. This will fix SSE detection on all recent 32-bit x86 
> operating systems. This completely breaks functionality on unpatched 2.2.x 
> and earlier kernels, although there are likely no Gallium3D users on such 
> operating systems.
> 
> 
> diff --git a/src/gallium/auxiliary/util/u_cpu_detect.c 
> b/src/gallium/auxiliary/util/u_cpu_detect.c
> index 5056351..b9b9f92 100644
> --- a/src/gallium/auxiliary/util/u_cpu_detect.c
> +++ b/src/gallium/auxiliary/util/u_cpu_detect.c
> @@ -194,123 +194,8 @@ check_os_altivec_support(void)
>  }
>  #endif /* PIPE_ARCH_PPC */
>  
> -/* If we're running on a processor that can do SSE, let's see if we
> - * are allowed to or not.  This will catch 2.4.0 or later kernels that
> - * haven't been configured for a Pentium III but are running on one,
> - * and RedHat patched 2.2 kernels that have broken exception handling
> - * support for user space apps that do SSE.
> - */
> -#if defined(PIPE_ARCH_X86) || defined (PIPE_ARCH_X86_64)
> -static void
> -check_os_katmai_support(void)
> -{
> -#if defined(PIPE_ARCH_X86)
> -#if defined(PIPE_OS_FREEBSD)
> -   int has_sse=0, ret;
> -   int len = sizeof (has_sse);
> -
> -   ret = sysctlbyname("hw.instruction_sse", &has_sse, &len, NULL, 0);
> -   if (ret || !has_sse)
> -      util_cpu_caps.has_sse=0;
> -
> -#elif defined(PIPE_OS_NETBSD) || defined(PIPE_OS_OPENBSD)
> -   int has_sse, has_sse2, ret, mib[2];
> -   int varlen;
> -
> -   mib[0] = CTL_MACHDEP;
> -   mib[1] = CPU_SSE;
> -   varlen = sizeof (has_sse);
> -
> -   ret = sysctl(mib, 2, &has_sse, &varlen, NULL, 0);
> -   if (ret < 0 || !has_sse) {
> -      util_cpu_caps.has_sse = 0;
> -   } else {
> -      util_cpu_caps.has_sse = 1;
> -   }
> -
> -   mib[1] = CPU_SSE2;
> -   varlen = sizeof (has_sse2);
> -   ret = sysctl(mib, 2, &has_sse2, &varlen, NULL, 0);
> -   if (ret < 0 || !has_sse2) {
> -      util_cpu_caps.has_sse2 = 0;
> -   } else {
> -      util_cpu_caps.has_sse2 = 1;
> -   }
> -   util_cpu_caps.has_sse = 0; /* FIXME ?!?!? */
> -
> -
> -#elif defined(PIPE_OS_WINDOWS)
> -   LPTOP_LEVEL_EXCEPTION_FILTER exc_fil;
> -   if (util_cpu_caps.has_sse) {
> -      exc_fil = SetUnhandledExceptionFilter(win32_sig_handler_sse);
> -#if defined(PIPE_CC_GCC)
> -      __asm __volatile ("xorps %xmm0, %xmm0");
> -#elif defined(PIPE_CC_MSVC)
> -      __asm {
> -          xorps xmm0, xmm0        /* executing SSE instruction */
> -      }
> -#else
> -#error Unsupported compiler
> -#endif
> -      SetUnhandledExceptionFilter(exc_fil);
> -   }
> -#elif defined(PIPE_OS_LINUX)
> -   struct sigaction saved_sigill;
> -   struct sigaction saved_sigfpe;
> -
> -   /* Save the original signal handlers.
> -   */
> -   sigaction(SIGILL, NULL, &saved_sigill);
> -   sigaction(SIGFPE, NULL, &saved_sigfpe);
> -
> -   signal(SIGILL, (void (*)(int))sigill_handler_sse);
> -   signal(SIGFPE, (void (*)(int))sigfpe_handler_sse);
> -
> -   /* Emulate test for OSFXSR in CR4.  The OS will set this bit if it
> -    * supports the extended FPU save and restore required for SSE.  If
> -    * we execute an SSE instruction on a PIII and get a SIGILL, the OS
> -    * doesn't support Streaming SIMD Exceptions, even if the processor
> -    * does.
> -    */
> -   if (util_cpu_caps.has_sse) {
> -      __asm __volatile ("xorps %xmm1, %xmm0");
> -   }
> -
> -   /* Emulate test for OSXMMEXCPT in CR4.  The OS will set this bit if
> -    * it supports unmasked SIMD FPU exceptions.  If we unmask the
> -    * exceptions, do a SIMD divide-by-zero and get a SIGILL, the OS
> -    * doesn't support unmasked SIMD FPU exceptions.  If we get a SIGFPE
> -    * as expected, we're okay but we need to clean up after it.
> -    *
> -    * Are we being too stringent in our requirement that the OS support
> -    * unmasked exceptions?  Certain RedHat 2.2 kernels enable SSE by
> -    * setting CR4.OSFXSR but don't support unmasked exceptions.  Win98
> -    * doesn't even support them.  We at least know the user-space SSE
> -    * support is good in kernels that do support unmasked exceptions,
> -    * and therefore to be safe I'm going to leave this test in here.
> -    */
> -   if (util_cpu_caps.has_sse) {
> -      /* test_os_katmai_exception_support(); */
> -   }
> -
> -   /* Restore the original signal handlers.
> -   */
> -   sigaction(SIGILL, &saved_sigill, NULL);
> -   sigaction(SIGFPE, &saved_sigfpe, NULL);
> -
> -#else
> -   /* We can't use POSIX signal handling to test the availability of
> -    * SSE, so we disable it by default.
> -    */
> -   util_cpu_caps.has_sse = 0;
> -#endif /* __linux__ */
> -#endif
> -
> -#if defined(PIPE_ARCH_X86_64)
> -   util_cpu_caps.has_sse = 1;
> -#endif
> -}
> -
>  
> +#if defined(PIPE_ARCH_X86) || defined (PIPE_ARCH_X86_64)
>  static int has_cpuid(void)
>  {
>  #if defined(PIPE_ARCH_X86)
> @@ -469,9 +354,6 @@ util_cpu_detect(void)
>           util_cpu_caps.cacheline = regs2[2] & 0xFF;
>        }
>  
> -      if (util_cpu_caps.has_sse)
> -         check_os_katmai_support();
> -
>        if (!util_cpu_caps.has_sse) {
>           util_cpu_caps.has_sse2 = 0;
>           util_cpu_caps.has_sse3 = 0;


_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to