diff options
Diffstat (limited to 'src/pkg/runtime/sys_windows_amd64.s')
-rw-r--r-- | src/pkg/runtime/sys_windows_amd64.s | 126 |
1 files changed, 66 insertions, 60 deletions
diff --git a/src/pkg/runtime/sys_windows_amd64.s b/src/pkg/runtime/sys_windows_amd64.s index 8c4caf867..94845903e 100644 --- a/src/pkg/runtime/sys_windows_amd64.s +++ b/src/pkg/runtime/sys_windows_amd64.s @@ -13,9 +13,9 @@ TEXT runtime·asmstdcall(SB),NOSPLIT,$0 // asmcgocall will put first argument into CX. PUSHQ CX // save for later - MOVQ wincall_fn(CX), AX - MOVQ wincall_args(CX), SI - MOVQ wincall_n(CX), CX + MOVQ libcall_fn(CX), AX + MOVQ libcall_args(CX), SI + MOVQ libcall_n(CX), CX // SetLastError(0). MOVQ 0x30(GS), DI @@ -52,12 +52,12 @@ loadregs: // Return result. POPQ CX - MOVQ AX, wincall_r1(CX) + MOVQ AX, libcall_r1(CX) // GetLastError(). MOVQ 0x30(GS), DI MOVL 0x68(DI), AX - MOVQ AX, wincall_err(CX) + MOVQ AX, libcall_err(CX) RET @@ -95,49 +95,55 @@ TEXT runtime·setlasterror(SB),NOSPLIT,$0 MOVL AX, 0x68(CX) RET -TEXT runtime·sigtramp(SB),NOSPLIT,$0 - // CX: exception record - // R8: context +// Called by Windows as a Vectored Exception Handler (VEH). +// First argument is pointer to struct containing +// exception record and context pointers. +// Return 0 for 'not handled', -1 for handled. +TEXT runtime·sigtramp(SB),NOSPLIT,$0-0 + // CX: PEXCEPTION_POINTERS ExceptionInfo - // unwinding? - TESTL $6, 4(CX) // exception flags - MOVL $1, AX - JNZ sigdone - - // copy arguments for call to sighandler. - - // Stack adjustment is here to hide from 6l, - // which doesn't understand that sigtramp - // runs on essentially unlimited stack. - SUBQ $56, SP - MOVQ CX, 0(SP) - MOVQ R8, 8(SP) - - get_tls(CX) - - // check that m exists - MOVQ m(CX), AX + // DI SI BP BX R12 R13 R14 R15 registers and DF flag are preserved + // as required by windows callback convention. + PUSHFQ + SUBQ $88, SP + MOVQ DI, 80(SP) + MOVQ SI, 72(SP) + MOVQ BP, 64(SP) + MOVQ BX, 56(SP) + MOVQ R12, 48(SP) + MOVQ R13, 40(SP) + MOVQ R14, 32(SP) + MOVQ R15, 24(SP) + + MOVQ 0(CX), BX // ExceptionRecord* + MOVQ 8(CX), CX // Context* + + // fetch g + get_tls(DX) + MOVQ m(DX), AX CMPQ AX, $0 JNE 2(PC) CALL runtime·badsignal2(SB) - - MOVQ g(CX), CX - MOVQ CX, 16(SP) - - MOVQ BX, 24(SP) - MOVQ BP, 32(SP) - MOVQ SI, 40(SP) - MOVQ DI, 48(SP) - + MOVQ g(DX), DX + // call sighandler(ExceptionRecord*, Context*, G*) + MOVQ BX, 0(SP) + MOVQ CX, 8(SP) + MOVQ DX, 16(SP) CALL runtime·sighandler(SB) + // AX is set to report result back to Windows - MOVQ 24(SP), BX - MOVQ 32(SP), BP - MOVQ 40(SP), SI - MOVQ 48(SP), DI - ADDQ $56, SP + // restore registers as required for windows callback + MOVQ 24(SP), R15 + MOVQ 32(SP), R14 + MOVQ 40(SP), R13 + MOVQ 48(SP), R12 + MOVQ 56(SP), BX + MOVQ 64(SP), BP + MOVQ 72(SP), SI + MOVQ 80(SP), DI + ADDQ $88, SP + POPFQ -sigdone: RET TEXT runtime·ctrlhandler(SB),NOSPLIT,$8 @@ -277,13 +283,6 @@ TEXT runtime·callbackasm1(SB),NOSPLIT,$0 POPQ -8(CX)(DX*1) // restore bytes just after the args RET -TEXT runtime·setstacklimits(SB),NOSPLIT,$0 - MOVQ 0x30(GS), CX - MOVQ $0, 0x10(CX) - MOVQ $0xffffffffffff, AX - MOVQ AX, 0x08(CX) - RET - // uint32 tstart_stdcall(M *newm); TEXT runtime·tstart_stdcall(SB),NOSPLIT,$0 // CX contains first arg newm @@ -315,14 +314,6 @@ TEXT runtime·settls(SB),NOSPLIT,$0 MOVQ DI, 0x28(GS) RET -// void install_exception_handler() -TEXT runtime·install_exception_handler(SB),NOSPLIT,$0 - CALL runtime·setstacklimits(SB) - RET - -TEXT runtime·remove_exception_handler(SB),NOSPLIT,$0 - RET - // Sleep duration is in 100ns units. TEXT runtime·usleep1(SB),NOSPLIT,$0 MOVL duration+0(FP), BX @@ -337,20 +328,35 @@ TEXT runtime·usleep1(SB),NOSPLIT,$0 CALL AX RET - MOVQ m(R15), R14 - MOVQ m_g0(R14), R14 + MOVQ m(R15), R13 + + // leave pc/sp for cpu profiler + MOVQ (SP), R12 + MOVQ R12, m_libcallpc(R13) + MOVQ g(R15), R12 + MOVQ R12, m_libcallg(R13) + // sp must be the last, because once async cpu profiler finds + // all three values to be non-zero, it will use them + LEAQ 8(SP), R12 + MOVQ R12, m_libcallsp(R13) + + MOVQ m_g0(R13), R14 CMPQ g(R15), R14 - JNE 3(PC) + JNE usleep1_switch // executing on m->g0 already CALL AX - RET + JMP usleep1_ret +usleep1_switch: // Switch to m->g0 stack and back. MOVQ (g_sched+gobuf_sp)(R14), R14 MOVQ SP, -8(R14) LEAQ -8(R14), SP CALL AX MOVQ 0(SP), SP + +usleep1_ret: + MOVQ $0, m_libcallsp(R13) RET // Runs on OS stack. duration (in 100ns units) is in BX. |