changeset 8533:9b73b801af55

Ok, here is a better patch, which even adds a fix to compile it on older NetBSD systems, there was a ; missing. patch by Bernd Ernesti <mplayer@lists.veego.de>
author arpi
date Mon, 23 Dec 2002 01:24:42 +0000
parents 9688aa033083
children 922ce27eb683
files cpudetect.c
diffstat 1 files changed, 28 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- a/cpudetect.c	Mon Dec 23 00:40:15 2002 +0000
+++ b/cpudetect.c	Mon Dec 23 01:24:42 2002 +0000
@@ -16,7 +16,8 @@
 
 #ifdef __NetBSD__
 #include <sys/param.h>
-#include <setjmp.h>
+#include <sys/sysctl.h>
+#include <machine/cpu.h>
 #endif
 
 #ifdef __FreeBSD__
@@ -242,15 +243,6 @@
 #undef CPUID_STEPPING
 
 
-#ifdef __NetBSD__
-jmp_buf sseCheckEnv;
-
-void sseCheckHandler(int i)
-{
-        longjmp(sseCheckEnv, 1);
-}
-#endif
-
 #if defined(__linux__) && defined(_POSIX_SOURCE) && defined(X86_FXSR_MAGIC)
 static void sigill_handler_sse( int signal, struct sigcontext sc )
 {
@@ -308,33 +300,37 @@
       gCpuCaps.hasSSE=0;
 
 #elif defined(__NetBSD__)
-#if __NetBSD_Version__ >= 105260000
-   if ( gCpuCaps.hasSSE ) {
-      void (*oldHandler)(int);
+#if __NetBSD_Version__ >= 105250000
+   int has_sse, has_sse2, ret, mib[2];
+   size_t varlen;
 
-      mp_msg(MSGT_CPUDETECT,MSGL_V, "Testing OS support for SSE... " );
+   mib[0] = CTL_MACHDEP;
+   mib[1] = CPU_SSE;
+   varlen = sizeof(has_sse);
 
-      oldHandler = signal(SIGILL, sseCheckHandler);
-      if (setjmp(sseCheckEnv)) {
-        gCpuCaps.hasSSE = 0;
-      } else {
-         __asm__ __volatile__ (
-               "subl $0x10, %esp     \n"
-               "movups %xmm0, (%esp) \n"
-               "emms                 \n"
-               "addl $0x10, %esp     \n"
-           );
-      }
-      signal(SIGILL, oldHandler);
+   mp_msg(MSGT_CPUDETECT,MSGL_V, "Testing OS support for SSE... " );
+   ret = sysctl(mib, 2, &has_sse, &varlen, NULL, 0);
+   if (ret < 0 || !has_sse) {
+      gCpuCaps.hasSSE=0;
+      mp_msg(MSGT_CPUDETECT,MSGL_V, "no!\n" );
+   } else {
+      gCpuCaps.hasSSE=1;
+      mp_msg(MSGT_CPUDETECT,MSGL_V, "yes!\n" );
+   }
 
-      if ( gCpuCaps.hasSSE ) {
-	mp_msg(MSGT_CPUDETECT,MSGL_V, "no!\n" );
-      } else {
-	mp_msg(MSGT_CPUDETECT,MSGL_V, "yes!\n" );
-      }
+   mib[1] = CPU_SSE2;
+   varlen = sizeof(has_sse2);
+   mp_msg(MSGT_CPUDETECT,MSGL_V, "Testing OS support for SSE2... " );
+   ret = sysctl(mib, 2, &has_sse2, &varlen, NULL, 0);
+   if (ret < 0 || !has_sse2) {
+      gCpuCaps.hasSSE2=0;
+      mp_msg(MSGT_CPUDETECT,MSGL_V, "no!\n" );
+   } else {
+      gCpuCaps.hasSSE2=1;
+      mp_msg(MSGT_CPUDETECT,MSGL_V, "yes!\n" );
    }
 #else
-   gCpuCaps.hasSSE = 0
+   gCpuCaps.hasSSE = 0;
    mp_msg(MSGT_CPUDETECT,MSGL_WARN, "No OS support for SSE, disabling to be safe.\n" );
 #endif
 #elif defined(__linux__)