1 /* Copyright (c) 2010, 2014-2015. The SimGrid Team.
2 * All rights reserved. */
4 /* This program is free software; you can redistribute it and/or modify it
5 * under the terms of the license (GNU LGPL) which comes with this package. */
8 #define _XOPEN_SOURCE 700
14 #if defined(TEST_sigstack) || defined(TEST_sigaltstack)
15 #include <sys/types.h>
20 #if defined(TEST_makecontext)
31 static volatile char *handler_addr = (char *) 0xDEAD;
32 #if defined(TEST_sigstack) || defined(TEST_sigaltstack)
33 static volatile int handler_done = 0;
39 for (i = 0; i < 1024; i++)
41 handler_addr = (char *) &dummy;
46 #if defined(TEST_makecontext)
47 static ucontext_t uc_handler;
48 static ucontext_t uc_main;
54 for (i = 0; i < 1024; i++)
56 handler_addr = (char *) &dummy;
57 swapcontext(&uc_handler, &uc_main);
61 int main(int argc, char *argv[])
70 skbuf = (char *) malloc(sksize * 2 + 2 * sizeof(union alltypes));
73 for (i = 0; i < sksize * 2 + 2 * sizeof(union alltypes); i++)
75 skaddr = skbuf + sizeof(union alltypes);
76 #if defined(TEST_sigstack) || defined(TEST_sigaltstack)
79 #if defined(TEST_sigstack)
81 #elif defined(TEST_sigaltstack) && defined(HAVE_STACK_T)
84 struct sigaltstack ss;
86 #if defined(TEST_sigstack)
87 ss.ss_sp = (void *) (skaddr + sksize);
89 if (sigstack(&ss, NULL) < 0)
91 #elif defined(TEST_sigaltstack)
92 ss.ss_sp = (void *) (skaddr + sksize);
95 if (sigaltstack(&ss, NULL) < 0)
98 memset((void *) &sa, 0, sizeof(struct sigaction));
99 sa.sa_handler = handler;
100 sa.sa_flags = SA_ONSTACK;
101 sigemptyset(&sa.sa_mask);
102 sigaction(SIGUSR1, &sa, NULL);
103 kill(getpid(), SIGUSR1);
104 while (!handler_done)
108 #if defined(TEST_makecontext)
110 if (getcontext(&uc_handler) != 0)
112 uc_handler.uc_link = NULL;
113 uc_handler.uc_stack.ss_sp = (void *) (skaddr + sksize);
114 uc_handler.uc_stack.ss_size = sksize;
115 uc_handler.uc_stack.ss_flags = 0;
116 makecontext(&uc_handler, handler, 0);
117 swapcontext(&uc_main, &uc_handler);
120 if (handler_addr == (char *) 0xDEAD)
122 if (handler_addr < skaddr + sksize) {
123 /* stack was placed into lower area */
124 if (*(skaddr + sksize) != 'A')
125 sprintf(result, "(skaddr)+(sksize)-%d,(sksize)-%d",
126 sizeof(union alltypes), sizeof(union alltypes));
128 strcpy(result, "(skaddr)+(sksize),(sksize)");
130 /* stack was placed into higher area */
131 if (*(skaddr + sksize * 2) != 'A')
132 sprintf(result, "(skaddr),(sksize)-%d", sizeof(union alltypes));
134 strcpy(result, "(skaddr),(sksize)");
136 if ((f = fopen("conftestval", "w")) == NULL)
138 fprintf(f, "%s\n", result);