1436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <features.h> 2436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <fpu_control.h> 3436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <signal.h> 4436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <sys/types.h> 5436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <signal.h> 6436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <stdio.h> 7436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <stdlib.h> 8436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <ucontext.h> 9436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <unistd.h> 10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 11436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid handle_SIG(int sig) 12436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 13436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov double d; 14436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 15436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov _FPU_SETCW(0); 16436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov d = 7; 17436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov asm volatile ("":: "f" (d)); 18436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("Got signal %d\n", sig); 19436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (sig == SIGSEGV) { 20436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("SIGSEGV, exiting...\n"); 21436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov exit(0); 22436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 23436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 24436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 25436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid handle_rt_SIG(int sig, siginfo_t *info, void *uc) 26436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 27436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov double d; 28436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 29436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov _FPU_SETCW(0); 30436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov d = 8; 31436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov asm volatile ("":: "f" (d)); 32436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("Got signal %d\n", sig); 33436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("si_signo: %d\n", info->si_signo); 34436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("si_errno: %d\n", info->si_errno); 35436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("si_code: %d\n", info->si_code); 36436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (sig == SIGSEGV) { 37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("SIGSEGV, exiting...\n"); 38436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov exit(0); 39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 42436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovint main(void) 43436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov // char *a; 45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov struct sigaction sa; 46436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov double d1,d2,d3,d4,d5; 47436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 48436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov _FPU_SETCW(1); 49436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov d1 = d2 = d3 = d4 = d5 = 1; 50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov sa.sa_sigaction=handle_rt_SIG; 51436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov sa.sa_flags =SA_SIGINFO; 52436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov sigemptyset(&sa.sa_mask); 53436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov sigaction(SIGALRM, &sa, NULL); 54436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov signal(SIGUSR1, handle_SIG); 55436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov signal(SIGSEGV, handle_SIG); 56436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov kill(getpid(), SIGALRM); 57436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("One!\n"); 58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov kill(getpid(), SIGUSR1); 59436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("floating point is now: %f %f %f %f %f\n", d1, d2, d3, d4, d5); 60436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov { 61436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov int fpc; 62436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov _FPU_GETCW(fpc); 63436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("fpc= %d\n", fpc); 64436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 65436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("Good Bye!\n"); 66436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov// a = (char *) 0x12345678; 67436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov// *a = 1; 68436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov exit(0); 69436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 70