Index: lib/libpuffs/callcontext.c =================================================================== RCS file: /cvsroot/src/lib/libpuffs/callcontext.c,v retrieving revision 1.26 diff -u -p -u -r1.26 callcontext.c --- lib/libpuffs/callcontext.c 2 Nov 2011 16:43:04 -0000 1.26 +++ lib/libpuffs/callcontext.c 6 Dec 2011 18:19:53 -0000 @@ -201,7 +201,11 @@ slowccalloc(struct puffs_usermount *pu) pcc = sp; memset(pcc, 0, sizeof(struct puffs_cc)); +#ifndef __MACHINE_STACK_GROWS_UP mprotect((uint8_t *)sp + psize, (size_t)psize, PROT_NONE); +#else + mprotect((uint8_t *)sp + stacksize - psize, (size_t)psize, PROT_NONE); +#endif /* initialize both ucontext's */ if (getcontext(&pcc->pcc_uc) == -1) { @@ -245,6 +249,8 @@ puffs__cc_create(struct puffs_usermount pcc->pcc_func = func; pcc->pcc_farg = pcc; } else { + const long psize = sysconf(_SC_PAGESIZE); + /* link context */ pcc->pcc_uc.uc_link = &pcc->pcc_uc_ret; @@ -254,8 +260,8 @@ puffs__cc_create(struct puffs_usermount * swapcontext(). However, it gets lost. So reinit it. */ st = &pcc->pcc_uc.uc_stack; - st->ss_sp = pcc; - st->ss_size = stacksize; + st->ss_sp = ((uint8_t *)(void *)pcc) + psize; + st->ss_size = stacksize - psize; st->ss_flags = 0; /*