--- libcoro/coro.c 2001/09/16 01:34:36 1.8 +++ libcoro/coro.c 2005/08/30 21:32:17 1.17 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001 Marc Alexander Lehmann + * Copyright (c) 2001-2005 Marc Alexander Lehmann * * Redistribution and use in source and binary forms, with or without modifica- * tion, are permitted provided that the following conditions are met: @@ -46,9 +46,15 @@ # endif #endif -#if CORO_SJLJ || CORO_LOOSE || CORO_LINUX || CORO_IRIX +#if CORO_SJLJ || CORO_LOSER || CORO_LINUX || CORO_IRIX -#include +#include + +#if CORO_SJLJ +# include +# include +# include +#endif static volatile coro_func coro_init_func; static volatile void *coro_init_arg; @@ -74,7 +80,7 @@ /* trampoline signal handler */ static void -trampoline(int sig) +trampoline (int sig) { if (setjmp (((coro_context *)new_coro)->env)) coro_init (); /* start it */ @@ -96,13 +102,13 @@ getcontext (&(ctx->uc)); ctx->uc.uc_link = 0; - ctx->uc.uc_stack.ss_sp = STACK_ADJUST_PTR(sptr,ssize); + ctx->uc.uc_stack.ss_sp = STACK_ADJUST_PTR (sptr,ssize); ctx->uc.uc_stack.ss_size = (size_t) STACK_ADJUST_SIZE (sptr,ssize); ctx->uc.uc_stack.ss_flags = 0; makecontext (&(ctx->uc), (void (*)()) coro, 1, arg); -#elif CORO_SJLJ || CORO_LOOSE || CORO_LINUX || CORO_IRIX +#elif CORO_SJLJ || CORO_LOSER || CORO_LINUX || CORO_IRIX # if CORO_SJLJ stack_t ostk, nstk; @@ -132,7 +138,7 @@ perror ("sigaction"); /* set the new stack */ - nstk.ss_sp = STACK_ADJUST(sptr,ssize); /* yes, some platforms (IRIX) get this wrong. */ + nstk.ss_sp = STACK_ADJUST_PTR (sptr,ssize); /* yes, some platforms (IRIX) get this wrong. */ nstk.ss_size = STACK_ADJUST_SIZE (sptr,ssize); nstk.ss_flags = 0; @@ -162,19 +168,19 @@ sigprocmask (SIG_SETMASK, &osig, 0); -# elif CORO_LOOSE +# elif CORO_LOSER setjmp (ctx->env); - ctx->env[7] = (int)((char *)sptr + ssize); - ctx->env[8] = (int)coro_init; + ctx->env[7] = (long)((char *)sptr + ssize); + ctx->env[8] = (long)coro_init; # elif CORO_LINUX setjmp (ctx->env); #if defined(__GLIBC__) && defined(__GLIBC_MINOR__) \ && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 0 && defined(JB_PC) && defined(JB_SP) - ctx->env[0].__jmpbuf[JB_PC] = (int)coro_init; - ctx->env[0].__jmpbuf[JB_SP] = (int)STACK_ADJUST_PTR(sptr,ssize); + ctx->env[0].__jmpbuf[JB_PC] = (long)coro_init; + ctx->env[0].__jmpbuf[JB_SP] = (long)STACK_ADJUST_PTR (sptr,ssize); #elif defined(__GLIBC__) && defined(__GLIBC_MINOR__) \ && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 0 && defined(__mc68000__) ctx->env[0].__jmpbuf[0].__aregs[0] = (long int)coro_init; @@ -182,6 +188,9 @@ #elif defined(__GNU_LIBRARY__) && defined(__i386__) ctx->env[0].__jmpbuf[0].__pc = (char *)coro_init; ctx->env[0].__jmpbuf[0].__sp = (void *)((char *)sptr + ssize); +#elif defined(__GNU_LIBRARY__) && defined(__amd64__) + ctx->env[0].__jmpbuf[JB_PC] = (long)coro_init; + ctx->env[0].__jmpbuf[JB_RSP] = (long)((char *)sptr + ssize); #else #error "linux libc or architecture not supported" #endif @@ -190,7 +199,7 @@ setjmp (ctx->env); ctx->env[JB_PC] = (__uint64_t)coro_init; - ctx->env[JB_SP] = (__uint64_t)STACK_ADJUST_PTR(sptr,ssize); + ctx->env[JB_SP] = (__uint64_t)STACK_ADJUST_PTR (sptr,ssize); # endif