// Copyright 2018 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 "go_asm.h"
#include "go_tls.h"
#include "textflag.h"

TEXT runtime·threadinit(SB),NOSPLIT,$0
	MOVQ	DI, R8

	MOVQ	m_g0(R8), DX		// g
	MOVQ	R8, g_m(DX)

	// Layout new m scheduler stack on os stack.
	// TODO: which os stack? do we need to make a new vmo?
	LEAQ	(-8*1024+104)(SP), BX
	MOVQ	BX, g_stackguard0(DX)
	MOVQ	BX, g_stackguard1(DX)
	MOVQ	BX, (g_stack+stack_lo)(DX)
	MOVQ	SP, (g_stack+stack_hi)(DX)

	PUSHQ	R8

	// Set up tls.
	LEAQ	m_tls(R8), DI
	CALL 	runtime·settls(SB)

	get_tls(CX)

	POPQ	R8
	MOVQ	m_g0(R8), DX
	MOVQ	DX, g(CX)

	CLD				// convention is D is always left cleared
	CALL	runtime·stackcheck(SB)	// clobbers AX,CX
	CALL	runtime·mstart(SB)
	// TODO CALL	syscall/zx·Sys_zircon_thread_exit(SB)
	RET

// Set TLS base to DI for the thread handle supplied in SI.
TEXT runtime·settls(SB),NOSPLIT,$0
	ADDQ	$8, DI		// ELF wants to use -8(FS)
	PUSHQ	DI
	LEAQ	0(SP), DX	// object_set_property takes a pointer to the base

	SUBQ	$28, SP

	MOVL	SI, 0(SP)	// thread handle
	MOVL	$4, 4(SP)	// ZX_PROP_REGISTER_FS
	MOVQ	DX, 8(SP)	// pointer to fs base
	MOVQ	$8, 16(SP)	// size
	CALL	runtime·vdsoCall_zx_object_set_property(SB)

	// Stash return and restore SP
	MOVL	24(SP), AX
	ADDQ	$28, SP
	TESTL	$0, AX
	JZ	2(PC)
	MOVL	$0xf1, 0xf1  // crash
	POPQ	DI
	RET

TEXT ·cgocallm0(SB),NOSPLIT,$0-20
	MOVQ fn+0(FP), AX
	MOVQ arg+8(FP), DI

	MOVQ SP, BP // BP is callee-save in the x86-64 ABI

	ANDQ $~15, SP
	CALL AX

	MOVQ BP, SP
	get_tls(CX)
	RET

// This implementation lives separately because the m/g for the profiler and
// exception watcher are faked, and this causes issues with runtime.exitsyscall
// not returning.
TEXT runtime·fake_m_object_wait_one(SB),NOSPLIT,$0-28
	MOVL handle+0(FP), DI
	MOVL signals+4(FP), SI
	MOVQ deadline+8(FP), DX
	MOVQ observed+16(FP), CX
	MOVQ vdso_zx_object_wait_one(SB), AX
	CALL AX
	MOVL AX, ret+24(FP)
	RET

TEXT runtime·osyield(SB),NOSPLIT,$0
	MOVQ $0, DI
	MOVQ vdso_zx_nanosleep(SB), AX
	CALL AX
	RET
