3 #include "ns3/fatal-error.h"
4 #include "ns3/assert.h"
17 #ifdef HAVE_VALGRIND_H
18 # include "valgrind/valgrind.h"
20 # define VALGRIND_STACK_REGISTER(start,end) (0)
21 # define VALGRIND_STACK_DEREGISTER(id)
40 int pagesize = sysconf (_SC_PAGE_SIZE);
43 NS_FATAL_ERROR (
"Unable to query page size");
45 unsigned long page = (
unsigned long) si->si_addr;
46 page = page - (page % pagesize);
47 for (std::list<unsigned long>::iterator i =
g_guardPages.begin ();
54 char message[] =
"Stack overflow !";
55 write (2, message, strlen (message));
71 static bool alreadySetup =
false;
86 ss.ss_sp = malloc (SIGSTKSZ);
87 ss.ss_size = SIGSTKSZ;
89 int status = sigaltstack (&ss, NULL);
92 NS_FATAL_ERROR (
"Unable to setup an alternate signal stack handler, errno="
100 sa.sa_flags = SA_SIGINFO | SA_ONSTACK | SA_RESETHAND;
101 sigemptyset (&sa.sa_mask);
103 status = sigaction (SIGSEGV, &sa, NULL);
106 NS_FATAL_ERROR (
"Unable to setup page fault handler, errno="
107 << strerror (
errno));
114 int pagesize = sysconf (_SC_PAGE_SIZE);
117 NS_FATAL_ERROR (
"Unable to query page size");
120 if ((size % pagesize) == 0)
122 return size + 2 * pagesize;
126 return size + (pagesize - (size % pagesize)) + 2 * pagesize;
133 int pagesize = sysconf (_SC_PAGE_SIZE);
136 NS_FATAL_ERROR (
"Unable to query page size");
142 void *map = mmap (0, realSize, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
143 if (map == MAP_FAILED)
145 NS_FATAL_ERROR (
"Unable to allocate stack pages: size=" << size <<
146 ", alloced=" << realSize <<
147 ", errno=" << strerror (
errno));
149 uint8_t *stack = (uint8_t *)map;
150 int status = mprotect (stack + pagesize, realSize - 2 * pagesize, PROT_READ | PROT_WRITE);
153 NS_FATAL_ERROR (
"Unable to protect bottom of stack space, errno=" << strerror (
errno));
156 return stack + pagesize;
162 int pagesize = sysconf (_SC_PAGE_SIZE);
165 NS_FATAL_ERROR (
"Unable to query page size, errno=" << strerror (
errno));
168 int status = munmap (buffer - pagesize, realSize);
171 NS_FATAL_ERROR (
"Unable to unmap stack, errno=" << strerror (
errno));
173 unsigned long guard = (
unsigned long)(buffer - pagesize);
188 NS_ASSERT (
sizeof(
int) >= 4);
198 void (*cb)(
void *) = (
void (*) (
void*))fn;
213 fiber->
stack = stack;
216 retval = getcontext (&fiber->
context);
217 NS_ASSERT (retval != -1);
218 fiber->
context.uc_stack.ss_sp = stack;
219 fiber->
context.uc_stack.ss_size = stackSize;
223 uint64_t cb = (uint64_t)callback;
224 uint64_t ctx = (uint64_t)context;
225 uint32_t a0 = cb >> 32;
226 uint32_t a1 = cb & 0xffffffff;
227 uint32_t a2 = ctx >> 32;
228 uint32_t a3 = ctx & 0xffffffff;
230 makecontext (&fiber->
context, fn, 4, a0, a1, a2, a3);
249 if (fiber->
stack != 0)
260 const struct Fiber *toFiber)