54 lines
873 B
C
54 lines
873 B
C
/* $NetBSD: context.c,v 1.3 2004/07/19 06:36:27 chs Exp $ */
|
|
|
|
#include <malloc.h>
|
|
#include <ucontext.h>
|
|
#include <stdarg.h>
|
|
#include <err.h>
|
|
|
|
#define STACKSZ (10*1024)
|
|
#define DEPTH 3
|
|
|
|
int calls;
|
|
|
|
void
|
|
run(int n, ...)
|
|
{
|
|
va_list va;
|
|
int i, ia;
|
|
|
|
if (n != DEPTH - calls - 1)
|
|
exit (1);
|
|
|
|
va_start(va, n);
|
|
for (i = 0; i < 9; i++) {
|
|
ia = va_arg(va, int);
|
|
if (ia != i)
|
|
errx(2, "arg[%d]=%d", i, ia);
|
|
}
|
|
va_end(va);
|
|
calls++;
|
|
}
|
|
|
|
main()
|
|
{
|
|
ucontext_t uc[DEPTH];
|
|
int i, res;
|
|
|
|
for (i = 0; i < DEPTH; i++) {
|
|
res = getcontext(&uc[i]);
|
|
if (res)
|
|
err(1, "getcontext");
|
|
uc[i].uc_stack.ss_sp = malloc(STACKSZ);
|
|
uc[i].uc_stack.ss_size = STACKSZ;
|
|
if (i > 0)
|
|
uc[i].uc_link = &uc[i - 1];
|
|
makecontext(&uc[i], (void *)run, 10, i,
|
|
0, 1, 2, 3, 4, 5, 6, 7, 8);
|
|
}
|
|
res = setcontext(&uc[DEPTH-1]);
|
|
if (res)
|
|
err(1, "setcontext");
|
|
/* NOTREACHED */
|
|
return (3);
|
|
}
|