… | |
… | |
43 | #if !defined(STACK_ADJUST_PTR) |
43 | #if !defined(STACK_ADJUST_PTR) |
44 | /* IRIX is decidedly NON-unix */ |
44 | /* IRIX is decidedly NON-unix */ |
45 | # if __sgi |
45 | # if __sgi |
46 | # define STACK_ADJUST_PTR(sp,ss) ((char *)(sp) + (ss) - 8) |
46 | # define STACK_ADJUST_PTR(sp,ss) ((char *)(sp) + (ss) - 8) |
47 | # define STACK_ADJUST_SIZE(sp,ss) ((ss) - 8) |
47 | # define STACK_ADJUST_SIZE(sp,ss) ((ss) - 8) |
48 | # elif __i386__ && CORO_LINUX |
48 | # elif (__i386__ && CORO_LINUX) || (_M_IX86 && CORO_LOSER) |
49 | # define STACK_ADJUST_PTR(sp,ss) ((char *)(sp) + (ss)) |
49 | # define STACK_ADJUST_PTR(sp,ss) ((char *)(sp) + (ss)) |
50 | # define STACK_ADJUST_SIZE(sp,ss) (ss) |
50 | # define STACK_ADJUST_SIZE(sp,ss) (ss) |
51 | # elif __amd64__ && CORO_LINUX |
51 | # elif (__amd64__ && CORO_LINUX) || ((_M_AMD64 || _M_IA64) && CORO_LOSER) |
52 | # define STACK_ADJUST_PTR(sp,ss) ((char *)(sp) + (ss) - 8) |
52 | # define STACK_ADJUST_PTR(sp,ss) ((char *)(sp) + (ss) - 8) |
53 | # define STACK_ADJUST_SIZE(sp,ss) (ss) |
53 | # define STACK_ADJUST_SIZE(sp,ss) (ss) |
54 | # else |
54 | # else |
55 | # define STACK_ADJUST_PTR(sp,ss) (sp) |
55 | # define STACK_ADJUST_PTR(sp,ss) (sp) |
56 | # define STACK_ADJUST_SIZE(sp,ss) (ss) |
56 | # define STACK_ADJUST_SIZE(sp,ss) (ss) |
… | |
… | |
120 | # endif |
120 | # endif |
121 | |
121 | |
122 | #endif |
122 | #endif |
123 | |
123 | |
124 | #if CORO_ASM |
124 | #if CORO_ASM |
125 | void __attribute__((__noinline__, __fastcall__)) |
125 | void __attribute__((__noinline__, __regparm__(2))) |
126 | coro_transfer (struct coro_context *prev, struct coro_context *next) |
126 | coro_transfer (struct coro_context *prev, struct coro_context *next) |
127 | { |
127 | { |
128 | asm volatile ( |
128 | asm volatile ( |
129 | #if __amd64 |
129 | #if __amd64 |
130 | # define NUM_CLOBBERED 5 |
130 | # define NUM_SAVED 5 |
131 | "push %%rbx\n\t" |
131 | "push %%rbx\n\t" |
132 | "push %%r12\n\t" |
132 | "push %%r12\n\t" |
133 | "push %%r13\n\t" |
133 | "push %%r13\n\t" |
134 | "push %%r14\n\t" |
134 | "push %%r14\n\t" |
135 | "push %%r15\n\t" |
135 | "push %%r15\n\t" |
… | |
… | |
139 | "pop %%r14\n\t" |
139 | "pop %%r14\n\t" |
140 | "pop %%r13\n\t" |
140 | "pop %%r13\n\t" |
141 | "pop %%r12\n\t" |
141 | "pop %%r12\n\t" |
142 | "pop %%rbx\n\t" |
142 | "pop %%rbx\n\t" |
143 | #elif __i386 |
143 | #elif __i386 |
144 | # define NUM_CLOBBERED 4 |
144 | # define NUM_SAVED 4 |
145 | "push %%ebx\n\t" |
145 | "push %%ebx\n\t" |
146 | "push %%esi\n\t" |
146 | "push %%esi\n\t" |
147 | "push %%edi\n\t" |
147 | "push %%edi\n\t" |
148 | "push %%ebp\n\t" |
148 | "push %%ebp\n\t" |
149 | "mov %%esp, %0\n\t" |
149 | "mov %%esp, %0\n\t" |
… | |
… | |
285 | #if __CYGWIN__ |
285 | #if __CYGWIN__ |
286 | ctx->env[7] = (long)((char *)sptr + ssize); |
286 | ctx->env[7] = (long)((char *)sptr + ssize); |
287 | ctx->env[8] = (long)coro_init; |
287 | ctx->env[8] = (long)coro_init; |
288 | #elif defined(_M_IX86) |
288 | #elif defined(_M_IX86) |
289 | ((_JUMP_BUFFER *)&ctx->env)->Eip = (long)coro_init; |
289 | ((_JUMP_BUFFER *)&ctx->env)->Eip = (long)coro_init; |
290 | ((_JUMP_BUFFER *)&ctx->env)->Esp = (long)STACK_ADJUST_PTR (sptr,ssize); |
290 | ((_JUMP_BUFFER *)&ctx->env)->Esp = (long)STACK_ADJUST_PTR (sptr, ssize); |
291 | #elif defined(_M_AMD64) |
291 | #elif defined(_M_AMD64) |
292 | ((_JUMP_BUFFER *)&ctx->env)->Rip = (__int64)coro_init; |
292 | ((_JUMP_BUFFER *)&ctx->env)->Rip = (__int64)coro_init; |
293 | ((_JUMP_BUFFER *)&ctx->env)->Rsp = (__int64)STACK_ADJUST_PTR (sptr,ssize); |
293 | ((_JUMP_BUFFER *)&ctx->env)->Rsp = (__int64)STACK_ADJUST_PTR (sptr, ssize); |
294 | #elif defined(_M_IA64) |
294 | #elif defined(_M_IA64) |
295 | ((_JUMP_BUFFER *)&ctx->env)->StIIP = (__int64)coro_init; |
295 | ((_JUMP_BUFFER *)&ctx->env)->StIIP = (__int64)coro_init; |
296 | ((_JUMP_BUFFER *)&ctx->env)->IntSp = (__int64)STACK_ADJUST_PTR (sptr,ssize); |
296 | ((_JUMP_BUFFER *)&ctx->env)->IntSp = (__int64)STACK_ADJUST_PTR (sptr, ssize); |
297 | #else |
297 | #else |
298 | # error "microsoft libc or architecture not supported" |
298 | # error "microsoft libc or architecture not supported" |
299 | #endif |
299 | #endif |
300 | |
300 | |
301 | # elif CORO_LINUX |
301 | # elif CORO_LINUX |
… | |
… | |
326 | # elif CORO_ASM |
326 | # elif CORO_ASM |
327 | |
327 | |
328 | ctx->sp = (volatile void **)(ssize + (char *)sptr); |
328 | ctx->sp = (volatile void **)(ssize + (char *)sptr); |
329 | *--ctx->sp = (void *)coro_init; |
329 | *--ctx->sp = (void *)coro_init; |
330 | *--ctx->sp = (void *)coro_init; // this is needed when the prologue saves ebp |
330 | *--ctx->sp = (void *)coro_init; // this is needed when the prologue saves ebp |
331 | ctx->sp -= NUM_CLOBBERED; |
331 | ctx->sp -= NUM_SAVED; |
332 | |
332 | |
333 | # endif |
333 | # endif |
334 | |
334 | |
335 | coro_transfer ((coro_context *)create_coro, (coro_context *)new_coro); |
335 | coro_transfer ((coro_context *)create_coro, (coro_context *)new_coro); |
336 | |
336 | |