# HG changeset patch # User arpi # Date 1040606682 0 # Node ID 9b73b801af550d5bd804c54ffea9fa1ad7c88c5a # Parent 9688aa033083facb3d57a54dedd8f09f2c00f818 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 diff -r 9688aa033083 -r 9b73b801af55 cpudetect.c --- 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 -#include +#include +#include #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__)