aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/rt0_linux_386.s
blob: 59a30b41e8bb9b58caf7b5e762929e866578bb42 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// Copyright 2009 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 "textflag.h"

TEXT _rt0_386_linux(SB),NOSPLIT,$8
	MOVL	8(SP), AX
	LEAL	12(SP), BX
	MOVL	AX, 0(SP)
	MOVL	BX, 4(SP)
	CALL	main(SB)
	INT	$3

// When building with -buildmode=c-shared, this symbol is called when the shared
// library is loaded.
TEXT _rt0_386_linux_lib(SB),NOSPLIT,$0
	PUSHL	BP
	MOVL	SP, BP
	PUSHL	BX
	PUSHL	SI
	PUSHL	DI

	MOVL	8(BP), AX
	MOVL	AX, _rt0_386_linux_lib_argc<>(SB)
	MOVL	12(BP), AX
	MOVL	AX, _rt0_386_linux_lib_argv<>(SB)

	// Synchronous initialization.
	MOVL	$runtime·libpreinit(SB), AX
	CALL	AX

	SUBL	$8, SP

	// Create a new thread to do the runtime initialization.
	MOVL	_cgo_sys_thread_create(SB), AX
	TESTL	AX, AX
	JZ	nocgo
	MOVL	$_rt0_386_linux_lib_go(SB), BX
	MOVL	BX, 0(SP)
	MOVL	$0, 4(SP)
	CALL	AX
	JMP	restore

nocgo:
	MOVL	$0x800000, 0(SP)                    // stacksize = 8192KB
	MOVL	$_rt0_386_linux_lib_go(SB), AX
	MOVL	AX, 4(SP)                           // fn
	MOVL	$runtime·newosproc0(SB), AX
	CALL	AX

restore:
	ADDL	$8, SP
	POPL	DI
	POPL	SI
	POPL	BX
	POPL	BP
	RET

TEXT _rt0_386_linux_lib_go(SB),NOSPLIT,$12
	MOVL	_rt0_386_linux_lib_argc<>(SB), AX
	MOVL	AX, 0(SP)
	MOVL	_rt0_386_linux_lib_argv<>(SB), AX
	MOVL	AX, 4(SP)
	MOVL	$runtime·rt0_go(SB), AX
	CALL	AX
	RET

DATA _rt0_386_linux_lib_argc<>(SB)/4, $0
GLOBL _rt0_386_linux_lib_argc<>(SB),NOPTR, $4
DATA _rt0_386_linux_lib_argv<>(SB)/4, $0
GLOBL _rt0_386_linux_lib_argv<>(SB),NOPTR, $4

TEXT main(SB),NOSPLIT,$0
	JMP	runtime·rt0_go(SB)

TEXT _fallback_vdso(SB),NOSPLIT,$0
	INT	$0x80
	RET

DATA	runtime·_vdso(SB)/4, $_fallback_vdso(SB)
GLOBL	runtime·_vdso(SB), NOPTR, $4