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