Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
bf7b5690a40748c0da7a7dedf371a7ad338e734b
[simgrid.git] / buildtools / CPACK / prog_test / prog_stacksetup.c
1 #define _XOPEN_SOURCE
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #if defined(TEST_sigstack) || defined(TEST_sigaltstack)
6 #include <sys/types.h>
7 #include <signal.h>
8 #include <unistd.h>
9 #endif
10 #if defined(TEST_makecontext)
11 #include <ucontext.h>
12 #endif
13 union alltypes {
14     long   l;
15     double d;
16     void  *vp;
17     void (*fp)(void);
18     char  *cp;
19 };
20 static volatile char *handler_addr = (char *)0xDEAD;
21 #if defined(TEST_sigstack) || defined(TEST_sigaltstack)
22 static volatile int handler_done = 0;
23 void handler(int sig)
24 {
25     char garbage[1024];
26     int i;
27     auto int dummy;
28     for (i = 0; i < 1024; i++)
29         garbage[i] = 'X';
30     handler_addr = (char *)&dummy;
31     handler_done = 1;
32     return;
33 }
34 #endif
35 #if defined(TEST_makecontext)
36 static ucontext_t uc_handler;
37 static ucontext_t uc_main;
38 void handler(void)
39 {
40     char garbage[1024];
41     int i;
42     auto int dummy;
43     for (i = 0; i < 1024; i++)
44         garbage[i] = 'X';
45     handler_addr = (char *)&dummy;
46     swapcontext(&uc_handler, &uc_main);
47     return;
48 }
49 #endif
50 int main(int argc, char *argv[])
51 {
52     FILE *f;
53     char *skaddr;
54     char *skbuf;
55     int sksize;
56     char result[1024];
57     int i;
58     sksize = 32768;
59     skbuf = (char *)malloc(sksize*2+2*sizeof(union alltypes));
60     if (skbuf == NULL)
61         exit(1);
62     for (i = 0; i < sksize*2+2*sizeof(union alltypes); i++)
63         skbuf[i] = 'A';
64     skaddr = skbuf+sizeof(union alltypes);
65 #if defined(TEST_sigstack) || defined(TEST_sigaltstack)
66     {
67         struct sigaction sa;
68 #if defined(TEST_sigstack)
69         struct sigstack ss;
70 #elif defined(TEST_sigaltstack) && defined(HAVE_STACK_T)
71         stack_t ss;
72 #else
73         struct sigaltstack ss;
74 #endif
75 #if defined(TEST_sigstack)
76         ss.ss_sp      = (void *)(skaddr + sksize);
77         ss.ss_onstack = 0;
78         if (sigstack(&ss, NULL) < 0)
79             exit(1);
80 #elif defined(TEST_sigaltstack)
81         ss.ss_sp    = (void *)(skaddr + sksize);
82         ss.ss_size  = sksize;
83         ss.ss_flags = 0;
84         if (sigaltstack(&ss, NULL) < 0)
85             exit(1);
86 #endif
87         memset((void *)&sa, 0, sizeof(struct sigaction));
88         sa.sa_handler = handler;
89         sa.sa_flags = SA_ONSTACK;
90         sigemptyset(&sa.sa_mask);
91         sigaction(SIGUSR1, &sa, NULL);
92         kill(getpid(), SIGUSR1);
93         while (!handler_done)
94             /*nop*/;
95     }
96 #endif
97 #if defined(TEST_makecontext)
98     {
99         if (getcontext(&uc_handler) != 0)
100             exit(1);
101         uc_handler.uc_link = NULL;
102         uc_handler.uc_stack.ss_sp    = (void *)(skaddr + sksize);
103         uc_handler.uc_stack.ss_size  = sksize;
104         uc_handler.uc_stack.ss_flags = 0;
105         makecontext(&uc_handler, handler, 0);
106         swapcontext(&uc_main, &uc_handler);
107     }
108 #endif
109     if (handler_addr == (char *)0xDEAD)
110         exit(1);
111     if (handler_addr < skaddr+sksize) {
112         /* stack was placed into lower area */
113         if (*(skaddr+sksize) != 'A')
114              sprintf(result, "(skaddr)+(sksize)-%d,(sksize)-%d",
115                      sizeof(union alltypes), sizeof(union alltypes));
116         else
117              strcpy(result, "(skaddr)+(sksize),(sksize)");
118     }
119     else {
120         /* stack was placed into higher area */
121         if (*(skaddr+sksize*2) != 'A')
122             sprintf(result, "(skaddr),(sksize)-%d", sizeof(union alltypes));
123         else
124             strcpy(result, "(skaddr),(sksize)");
125     }
126     if ((f = fopen("conftestval", "w")) == NULL)
127         exit(1);
128     fprintf(f, "%s\n", result);
129     fclose(f);
130     exit(0);
131 }