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
12 #include "xbt/win32_ucontext.h"
13 #include "win32_ucontext.c"
19 #if defined(TEST_sigstack) || defined(TEST_sigaltstack)
20 #include <sys/types.h>
25 #if defined(TEST_makecontext)
27 #include "xbt/win32_ucontext.h"
40 static volatile char *handler_addr = (char *) 0xDEAD;
41 #if defined(TEST_sigstack) || defined(TEST_sigaltstack)
42 static volatile int handler_done = 0;
48 for (i = 0; i < 1024; i++)
50 handler_addr = (char *) &dummy;
55 #if defined(TEST_makecontext)
56 static ucontext_t uc_handler;
57 static ucontext_t uc_main;
63 for (i = 0; i < 1024; i++)
65 handler_addr = (char *) &dummy;
66 swapcontext(&uc_handler, &uc_main);
70 int main(int argc, char *argv[])
79 skbuf = (char *) malloc(sksize * 2 + 2 * sizeof(union alltypes));
82 for (i = 0; i < sksize * 2 + 2 * sizeof(union alltypes); i++)
84 skaddr = skbuf + sizeof(union alltypes);
85 #if defined(TEST_sigstack) || defined(TEST_sigaltstack)
88 #if defined(TEST_sigstack)
90 #elif defined(TEST_sigaltstack) && defined(HAVE_STACK_T)
93 struct sigaltstack ss;
95 #if defined(TEST_sigstack)
96 ss.ss_sp = (void *) (skaddr + sksize);
98 if (sigstack(&ss, NULL) < 0)
100 #elif defined(TEST_sigaltstack)
101 ss.ss_sp = (void *) (skaddr + sksize);
104 if (sigaltstack(&ss, NULL) < 0)
107 memset((void *) &sa, 0, sizeof(struct sigaction));
108 sa.sa_handler = handler;
109 sa.sa_flags = SA_ONSTACK;
110 sigemptyset(&sa.sa_mask);
111 sigaction(SIGUSR1, &sa, NULL);
112 kill(getpid(), SIGUSR1);
113 while (!handler_done)
117 #if defined(TEST_makecontext)
119 if (getcontext(&uc_handler) != 0)
121 uc_handler.uc_link = NULL;
122 uc_handler.uc_stack.ss_sp = (void *) (skaddr + sksize);
123 uc_handler.uc_stack.ss_size = sksize;
124 uc_handler.uc_stack.ss_flags = 0;
125 makecontext(&uc_handler, handler, 0);
126 swapcontext(&uc_main, &uc_handler);
129 if (handler_addr == (char *) 0xDEAD)
131 if (handler_addr < skaddr + sksize) {
132 /* stack was placed into lower area */
133 if (*(skaddr + sksize) != 'A')
134 sprintf(result, "(skaddr)+(sksize)-%d,(sksize)-%d",
135 sizeof(union alltypes), sizeof(union alltypes));
137 strcpy(result, "(skaddr)+(sksize),(sksize)");
139 /* stack was placed into higher area */
140 if (*(skaddr + sksize * 2) != 'A')
141 sprintf(result, "(skaddr),(sksize)-%d", sizeof(union alltypes));
143 strcpy(result, "(skaddr),(sksize)");
145 if ((f = fopen("conftestval", "w")) == NULL)
147 fprintf(f, "%s\n", result);