]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix cgo to handle the case where the G stack is copied.
authorKeith Randall <khr@golang.org>
Fri, 12 Sep 2014 03:36:23 +0000 (20:36 -0700)
committerKeith Randall <khr@golang.org>
Fri, 12 Sep 2014 03:36:23 +0000 (20:36 -0700)
Tests will come in a separate CL after the funcdata stuff is resolved.

Update #8696

LGTM=iant, rsc
R=rsc, iant
CC=golang-codereviews
https://golang.org/cl/138330045

src/runtime/asm_386.s
src/runtime/asm_amd64.s
src/runtime/asm_arm.s

index 062a668e3ec9579715abc4a0bec50344c587f101..37ad092414d785f41deeb4d9463de0bdee4bd5e4 100644 (file)
@@ -684,15 +684,19 @@ TEXT asmcgocall<>(SB),NOSPLIT,$0-12
        SUBL    $32, SP
        ANDL    $~15, SP        // alignment, perhaps unnecessary
        MOVL    DI, 8(SP)       // save g
-       MOVL    DX, 4(SP)       // save SP
+       MOVL    (g_stack+stack_hi)(DI), DI
+       SUBL    DX, DI
+       MOVL    DI, 4(SP)       // save depth in stack (can't just save SP, as stack might be copied during a callback)
        MOVL    BX, 0(SP)       // first argument in x86-32 ABI
        CALL    AX
 
        // Restore registers, g, stack pointer.
        get_tls(CX)
        MOVL    8(SP), DI
+       MOVL    (g_stack+stack_hi)(DI), SI
+       SUBL    4(SP), SI
        MOVL    DI, g(CX)
-       MOVL    4(SP), SP
+       MOVL    SI, SP
        RET
 
 // cgocallback(void (*fn)(void*), void *frame, uintptr framesize)
index bf0f490ae32e09e80e0a35de100fd19e1d5def1e..241d5feebfa41bfcd993d26a46ca867e732ef901 100644 (file)
@@ -670,7 +670,9 @@ nosave:
        SUBQ    $64, SP
        ANDQ    $~15, SP        // alignment for gcc ABI
        MOVQ    DI, 48(SP)      // save g
-       MOVQ    DX, 40(SP)      // save SP
+       MOVQ    (g_stack+stack_hi)(DI), DI
+       SUBQ    DX, DI
+       MOVQ    DI, 40(SP)      // save depth in stack (can't just save SP, as stack might be copied during a callback)
        MOVQ    BX, DI          // DI = first argument in AMD64 ABI
        MOVQ    BX, CX          // CX = first argument in Win64
        CALL    AX
@@ -678,8 +680,10 @@ nosave:
        // Restore registers, g, stack pointer.
        get_tls(CX)
        MOVQ    48(SP), DI
+       MOVQ    (g_stack+stack_hi)(DI), SI
+       SUBQ    40(SP), SI
        MOVQ    DI, g(CX)
-       MOVQ    40(SP), SP
+       MOVQ    SI, SP
        RET
 
 // cgocallback(void (*fn)(void*), void *frame, uintptr framesize)
index bddffc9e77c430506e7eb5848d5bb4b75d03ad33..a4524f919beb5f4bc10328483a2a13badf553d35 100644 (file)
@@ -520,15 +520,20 @@ asmcgocall_g0:
        SUB     $24, R13
        BIC     $0x7, R13       // alignment for gcc ABI
        MOVW    R4, 20(R13) // save old g
-       MOVW    R2, 16(R13)     // save old SP
+       MOVW    (g_stack+stack_hi)(R4), R4
+       SUB     R2, R4
+       MOVW    R4, 16(R13)     // save depth in stack (can't just save SP, as stack might be copied during a callback)
        BL      (R1)
 
        // Restore registers, g, stack pointer.
        MOVW    R0, R5
        MOVW    20(R13), R0
        BL      setg<>(SB)
+       MOVW    (g_stack+stack_hi)(g), R1
+       MOVW    16(R13), R2
+       SUB     R2, R1
        MOVW    R5, R0
-       MOVW    16(R13), R13
+       MOVW    R1, R13
        RET
 
 // cgocallback(void (*fn)(void*), void *frame, uintptr framesize)