aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/runtime/asm_amd64.s
diff options
context:
space:
mode:
Diffstat (limited to 'src/pkg/runtime/asm_amd64.s')
-rw-r--r--src/pkg/runtime/asm_amd64.s12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/pkg/runtime/asm_amd64.s b/src/pkg/runtime/asm_amd64.s
index d41ab96d02..2bf9f7eb9f 100644
--- a/src/pkg/runtime/asm_amd64.s
+++ b/src/pkg/runtime/asm_amd64.s
@@ -446,19 +446,21 @@ TEXT runtime·asmcgocall(SB),7,$0
MOVQ (g_sched+gobuf_sp)(SI), SP
// Now on a scheduling stack (a pthread-created stack).
- SUBQ $48, SP
+ // Make sure we have enough room for 4 stack-backed fast-call
+ // registers as per windows amd64 calling convention.
+ SUBQ $64, SP
ANDQ $~15, SP // alignment for gcc ABI
- MOVQ DI, 32(SP) // save g
- MOVQ DX, 24(SP) // save SP
+ MOVQ DI, 48(SP) // save g
+ MOVQ DX, 40(SP) // save SP
MOVQ BX, DI // DI = first argument in AMD64 ABI
MOVQ BX, CX // CX = first argument in Win64
CALL AX
// Restore registers, g, stack pointer.
get_tls(CX)
- MOVQ 32(SP), DI
+ MOVQ 48(SP), DI
MOVQ DI, g(CX)
- MOVQ 24(SP), SP
+ MOVQ 40(SP), SP
RET
// cgocallback(void (*fn)(void*), void *frame, uintptr framesize)