blob: 2009d164ec0e068f164c646641f7c6da771d70c6 [file] [log] [blame]
// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
#include "amd64/asm.h"
// void *stdcall_raw(void *fn, uintptr nargs, void *args)
TEXT runtime·stdcall_raw(SB),7,$8
MOVQ fn+0(FP), AX
MOVQ nargs+8(FP), CX
MOVQ args+16(FP), R11
// Switch to m->g0 if needed.
get_tls(DI)
MOVQ m(DI), DX
MOVQ g(DI), SI
MOVQ SI, 0(SP) // save g
MOVQ SP, m_gostack(DX) // save SP
MOVQ m_g0(DX), SI
CMPQ g(DI), SI
JEQ 3(PC)
MOVQ (g_sched+gobuf_sp)(SI), SP
ANDQ $~15, SP
MOVQ SI, g(DI)
SUBQ $0x60, SP
// Copy args to new stack.
MOVQ SP, DI
MOVQ R11, SI
CLD
REP; MOVSQ
MOVQ 0(R11), CX
MOVQ 8(R11), DX
MOVQ 16(R11), R8
MOVQ 24(R11), R9
// Call stdcall function.
CALL AX
// Restore original SP, g.
get_tls(DI)
MOVQ m(DI), DX
MOVQ m_gostack(DX), SP // restore SP
MOVQ 0(SP), SI // restore g
MOVQ SI, g(DI)
RET
// faster get/set last error
TEXT runtime·getlasterror(SB),7,$0
MOVQ 0x30(GS), AX
MOVL 0x68(AX), AX
RET
TEXT runtime·setlasterror(SB),7,$0
MOVL err+0(FP), AX
MOVQ 0x30(GS), CX
MOVL AX, 0x68(CX)
RET
// Windows runs the ctrl handler in a new thread.
TEXT runtime·ctrlhandler(SB),7,$0
// TODO
RET
TEXT runtime·callbackasm(SB),7,$0
// TODO
RET
// void tstart(M *newm);
TEXT runtime·tstart(SB),7,$0
MOVQ newm+8(SP), CX // m
MOVQ m_g0(CX), DX // g
MOVQ SP, DI // remember stack
// Layout new m scheduler stack on os stack.
MOVQ SP, AX
MOVQ AX, g_stackbase(DX)
SUBQ $(64*1024), AX // stack size
MOVQ AX, g_stackguard(DX)
// Set up tls.
LEAQ m_tls(CX), SI
MOVQ SI, 0x58(GS)
MOVQ CX, m(SI)
MOVQ DX, g(SI)
// Someday the convention will be D is always cleared.
CLD
PUSHQ DI // original stack
CALL runtime·stackcheck(SB) // clobbers AX,CX
CALL runtime·mstart(SB)
POPQ DI // original stack
MOVQ DI, SP
RET
// uint32 tstart_stdcall(M *newm);
TEXT runtime·tstart_stdcall(SB),7,$0
MOVQ CX, BX // stdcall first arg in RCX
PUSHQ BX
CALL runtime·tstart+0(SB)
POPQ BX
// Adjust stack for stdcall to return properly.
MOVQ (SP), AX // save return address
ADDQ $8, SP // remove single parameter
MOVQ AX, (SP) // restore return address
XORL AX, AX // return 0 == success
RET
TEXT runtime·notok(SB),7,$0
MOVQ $0xf1, BP
MOVQ BP, (BP)
RET
// set tls base to DI
TEXT runtime·settls(SB),7,$0
MOVQ DI, 0x58(GS)
RET