diff options
-rw-r--r-- | coro.c | 22 |
1 files changed, 17 insertions, 5 deletions
@@ -117,18 +117,20 @@ trampoline (int sig) # if CORO_ASM + #if _WIN32 + #define CORO_WIN_TIB 1 + #endif + asm ( - ".text\n" - ".globl coro_transfer\n" - ".type coro_transfer, @function\n" + "\t.text\n" + "\t.globl coro_transfer\n" "coro_transfer:\n" /* windows, of course, gives a shit on the amd64 ABI and uses different registers */ /* http://blogs.msdn.com/freik/archive/2005/03/17/398200.aspx */ #if __amd64 - #ifdef _WIN32 + #ifdef WIN32 /* TODO: xmm6..15 also would need to be saved. sigh. */ #define NUM_SAVED 8 - #undef CORO_WIN_TIB "\tpushq %rsi\n" "\tpushq %rdi\n" "\tpushq %rbp\n" @@ -137,8 +139,18 @@ trampoline (int sig) "\tpushq %r13\n" "\tpushq %r14\n" "\tpushq %r15\n" + #if CORO_WIN_TIB + "\tpushq %fs:0x0\n" + "\tpushq %fs:0x8\n" + "\tpushq %fs:0xc\n" + #endif "\tmovq %rsp, (%rcx)\n" "\tmovq (%rdx), %rsp\n" + #if CORO_WIN_TIB + "\tpopq %fs:0xc\n" + "\tpopq %fs:0x8\n" + "\tpopq %fs:0x0\n" + #endif "\tpopq %r15\n" "\tpopq %r14\n" "\tpopq %r13\n" |