diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/xine-utils/memcpy.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/src/xine-utils/memcpy.c b/src/xine-utils/memcpy.c index 5ded24ebc..2d644d4a9 100644 --- a/src/xine-utils/memcpy.c +++ b/src/xine-utils/memcpy.c @@ -35,6 +35,8 @@ #include <stdlib.h> #include <string.h> +#include <signal.h> +#include <setjmp.h> #include "xine_internal.h" #include "cpu_accel.h" @@ -388,6 +390,15 @@ static unsigned long long int rdtsc() } #endif +static jmp_buf sigill_return; + +static void sigill_handler (int n) { + + printf ("memcpy: SIGILL catched\n"); + + longjmp(sigill_return, 1); +} + #define BUFSIZE 1024*1024 void probe_fast_memcpy(config_values_t *config) @@ -434,12 +445,20 @@ void probe_fast_memcpy(config_values_t *config) if( (config_flags & memcpy_method[i].cpu_require) != memcpy_method[i].cpu_require ) continue; - + + if (setjmp(sigill_return)) + continue; + + signal (SIGILL, sigill_handler); + t = rdtsc(); for(j=0;j<50;j++) { memcpy_method[i].function(buf2,buf1,BUFSIZE); memcpy_method[i].function(buf1,buf2,BUFSIZE); } + + signal (SIGILL, SIG_DFL); + t = rdtsc() - t; memcpy_method[i].time = t; |