fix detect for k6 cpu's

SVN revision: 14086
This commit is contained in:
Carsten Haitzler 2005-04-03 15:31:35 +00:00
parent cb54bb2e60
commit d845297892
1 changed files with 22 additions and 2 deletions

View File

@ -7,19 +7,26 @@
#include <setjmp.h> #include <setjmp.h>
#ifndef WIN32 #ifndef WIN32
static sigjmp_buf detect_buf; static sigjmp_buf detect_buf, detect_buf2;
#endif #endif
static int cpu_feature_mask = 0; static int cpu_feature_mask = 0;
#ifndef WIN32 #ifndef WIN32
static void evas_common_cpu_catch_ill(int sig); static void evas_common_cpu_catch_ill(int sig);
static void evas_common_cpu_catch_segv(int sig);
static void static void
evas_common_cpu_catch_ill(int sig) evas_common_cpu_catch_ill(int sig)
{ {
siglongjmp(detect_buf, 1); siglongjmp(detect_buf, 1);
} }
static void
evas_common_cpu_catch_segv(int sig)
{
siglongjmp(detect_buf2, 1);
}
#endif #endif
void void
@ -76,7 +83,7 @@ evas_common_cpu_feature_test(void (*feature)(void))
{ {
#ifndef WIN32 #ifndef WIN32
int enabled = 1; int enabled = 1;
struct sigaction act, oact; struct sigaction act, oact, oact2;
act.sa_handler = evas_common_cpu_catch_ill; act.sa_handler = evas_common_cpu_catch_ill;
act.sa_flags = SA_RESTART; act.sa_flags = SA_RESTART;
@ -87,8 +94,21 @@ evas_common_cpu_feature_test(void (*feature)(void))
sigaction(SIGILL, &oact, NULL); sigaction(SIGILL, &oact, NULL);
return 0; return 0;
} }
feature(); act.sa_handler = evas_common_cpu_catch_segv;
act.sa_flags = SA_RESTART;
sigemptyset(&act.sa_mask);
sigaction(SIGSEGV, &act, &oact2);
if (sigsetjmp(detect_buf2, 1))
{
sigaction(SIGILL, &oact, NULL); sigaction(SIGILL, &oact, NULL);
sigaction(SIGSEGV, &oact2, NULL);
return 0;
}
feature();
sigaction(SIGILL, &oact, NULL);
sigaction(SIGSEGV, &oact2, NULL);
return enabled; return enabled;
#else #else
return 0; return 0;