1 #include <features.h>
2 #include <fpu_control.h>
3 #include <signal.h>
4 #include <sys/types.h>
5 #include <signal.h>
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <ucontext.h>
9 #include <unistd.h>
10 
handle_SIG(int sig)11 void handle_SIG(int sig)
12 {
13    double d;
14 
15    _FPU_SETCW(0);
16    d = 7;
17    asm volatile ("":: "f" (d));
18    printf("Got signal %d\n", sig);
19    if (sig == SIGSEGV) {
20       printf("SIGSEGV, exiting...\n");
21       exit(0);
22    }
23 }
24 
handle_rt_SIG(int sig,siginfo_t * info,void * uc)25 void handle_rt_SIG(int sig, siginfo_t *info, void *uc)
26 {
27    double d;
28 
29    _FPU_SETCW(0);
30    d = 8;
31    asm volatile ("":: "f" (d));
32    printf("Got signal %d\n", sig);
33    printf("si_signo: %d\n", info->si_signo);
34    printf("si_errno: %d\n", info->si_errno);
35    printf("si_code: %d\n", info->si_code);
36    if (sig == SIGSEGV) {
37       printf("SIGSEGV, exiting...\n");
38       exit(0);
39    }
40 }
41 
main(void)42 int main(void)
43 {
44    //   char *a;
45    struct sigaction sa;
46    double d1,d2,d3,d4,d5;
47 
48    _FPU_SETCW(1);
49    d1 = d2 = d3 = d4 = d5 = 1;
50    sa.sa_sigaction=handle_rt_SIG;
51    sa.sa_flags =SA_SIGINFO;
52    sigemptyset(&sa.sa_mask);
53    sigaction(SIGALRM, &sa, NULL);
54    signal(SIGUSR1, handle_SIG);
55    signal(SIGSEGV, handle_SIG);
56    kill(getpid(), SIGALRM);
57    printf("One!\n");
58    kill(getpid(), SIGUSR1);
59    printf("floating point is now: %f %f %f %f %f\n", d1, d2, d3, d4, d5);
60    {
61       int fpc;
62       _FPU_GETCW(fpc);
63       printf("fpc= %d\n", fpc);
64    }
65    printf("Good Bye!\n");
66 //	a = (char *) 0x12345678;
67 //	*a = 1;
68    exit(0);
69 }
70