makecontext(3)
on the surface(?) calls to makecontext() appear to have to be preceded by getcontext() to completely initialize its arg: ucontext_t struct (that is, if I comment out getcontext() calls from a program like the below, it causes SEGV). why is it the case? kenji
---
#include <ucontext.h>
#include <unistd.h>
#include <err.h>
static ucontext_t u0;
static ucontext_t u1;
static ucontext_t u2;
#define STACK_SIZE (1024 * 8)
#define NLOOP 7
static int i;
static int j;
static void f()
{
for (i = 0; i < NLOOP; i++) {
printf("f(): i = %d\n", i);
if (swapcontext(&u1, &u2) < 0)
err(1, NULL); }
}
static void g()
{
for (j = 0; j < NLOOP; j++) {
printf("g(): j = %d\n", j);
if (swapcontext(&u2, &u0) < 0)
err(1, NULL); }
}
main()
{
static unsigned char _u1_stack[STACK_SIZE];
static unsigned char _u2_stack[STACK_SIZE];
getcontext(&u1); u1.uc_stack.ss_sp = _u1_stack; u1.uc_stack.ss_size = sizeof _u1_stack; u1.uc_stack.ss_flags = 0; u1.uc_link = NULL; makecontext(&u1, f, 0); getcontext(&u2); u2.uc_stack.ss_sp = _u2_stack; u2.uc_stack.ss_size = sizeof _u2_stack; u2.uc_stack.ss_flags = 0; u2.uc_link = NULL; makecontext(&u2, g, 0);
while (1) {
if (swapcontext(&u0, &u1) < 0)
err(1, NULL);
printf("main: %d %d\n", i, j);
if (i == NLOOP && j == NLOOP)
exit(0); }
}
--
Quoted 5 lines · On Mon, Jul 28, 2003 at 03:06:30PM -0400, [email protected] wrote:
on the surface(?) calls to
makecontext()appear to have to be preceded bygetcontext()to completely initialize its arg:ucontext_tstruct (that is, if I comment outgetcontext()calls from a program like the below, it causes SEGV). why is it the case? kenji
Hello,
From the manual page:
The makecontext() function modifies the context pointed to by ucp (which was obtained from a call to getcontext()). Before calling make- context(), one should allocate a new stack for this context, assigning
to ucp->uc_stack, and define a successor context, assigning to
ucp->uc_link.
I assume that the getcontext() is needed to get values for registers (cs, ds, es, gs, ...).
Regards,
Luciano Rocha
howdy thanks,
Quoted 4 lines
Quoted 2 lines
makecontext()appear to have to be
preceded bygetcontext()to completely initialize its argI assume that the
getcontext()is needed to get values for registers (cs, ds, es, gs, ...).
hmm., that certainly is part of the answer :) but, why makecontext() doesn't/cannot fill up some appropriate(??) values automatically into such fields? -- it looks to me the machine context makecontext() have to fabricate is simply the one to start calling the given function as one of its argument (= its second arg: "void *func()"). and it appears to me that this new machine context doesn't have anything to do with that of the caller. this make me think getcontext() may not be necessary. -- ?? (well, obviously I'm missing something)
kenji