8322 nl: misleading-indentation
[unleashed/tickless.git] / usr / src / lib / common / amd64 / crt1.s
blob2d3cd220ceca17caaafe5d4f40c9e8674f136c0d
1 /*
2 * CDDL HEADER START
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
19 * CDDL HEADER END
23 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
28 * This crt1.o module is provided as the bare minimum required to build
29 * a 64-bit executable with gcc. It is installed in /usr/lib/amd64
30 * where it will be picked up by gcc, along with crti.o and crtn.o
33 .ident "%Z%%M% %I% %E% SMI"
35 .file "crt1.s"
37 .globl _start
39 /* global entities defined elsewhere but used here */
40 .globl main
41 .globl __fpstart
42 .globl exit
43 .globl _exit
44 .weak _DYNAMIC
46 .section .data
48 .weak environ
49 .set environ,_environ
50 .globl _environ
51 .type _environ,@object
52 .size _environ,8
53 .align 8
54 _environ:
55 .8byte 0x0
57 .globl __environ_lock
58 .type __environ_lock,@object
59 .size __environ_lock,24
60 .align 8
61 __environ_lock:
62 .zero 24
64 .globl ___Argv
65 .type ___Argv,@object
66 .size ___Argv,8
67 .align 8
68 ___Argv:
69 .8byte 0x0
71 .section .text
72 .align 8
75 * The SVR4/i386 ABI (pages 3-29) says that when the entry
76 * point runs registers' %rbp, %rsp, %rdx values are specified
77 * the following:
79 * %rbp The content of this register is unspecified at
80 * process initialization time, but the user code should mark
81 * the deepest stack frame by setting the frame pointer to zero.
82 * No other frame's %ebp should have a zero value.
84 * %rsp Performing its usual job, the stack pointer holds the address
85 * of the bottom of the stack, which is guaranteed to be
86 * quadword aligned.
88 * The stack contains the arguments and environment:
89 * ...
90 * envp[0] (16+(8*argc))(%rsp)
91 * NULL (8+(8*argc))(%rsp)
92 * ...
93 * argv[0] 8(%rsp)
94 * argc 0(%rsp)
96 * %rdx In a conforming program, this register contains a function
97 * pointer that the application should register with atexit(BA_OS).
98 * This function is used for shared object termination code
99 * [see Dynamic Linking in Chapter 5 of the System V ABI].
103 .type _start,@function
104 _start:
106 * Allocate a NULL return address and a NULL previous %rbp as if
107 * there was a genuine call to _start.
109 pushq $0
110 pushq $0
111 movq %rsp,%rbp /* The first stack frame */
114 * The stack now is
116 * envp[0] (32+(8*argc))(%rsp) - (A)
117 * NULL (24+(8*argc))(%rsp)
118 * ...
119 * argv[0] 24(%rbp) - (B)
120 * argc 16(%rbp)
121 * 0 8(%rbp)
122 * 0 0(%rbp)
125 movq $_DYNAMIC,%rax
126 testq %rax,%rax
127 jz 1f
128 movq %rdx,%rdi /* register rt_do_exit */
129 call atexit
131 movq $_fini,%rdi
132 call atexit
135 * Calculate the location of the envp array by adding the size of
136 * the argv array to the start of the argv array.
138 movq 16(%rbp),%rax /* argc */
139 movq _environ, %rcx
140 testq %rcx, %rcx /* check if _environ==0 */
141 jne 1f
142 leaq 32(%rbp,%rax,8),%rcx /* (A) */
143 movq %rcx,_environ /* copy to _environ */
147 * Force stack alignment - below here there must have been an even
148 * number of un-popped pushq instructions whenever a call is reached
150 andq $-16,%rsp
151 pushq %rdx
152 leaq 24(%rbp),%rdx /* argv (B) */
153 movq %rdx,___Argv
154 pushq %rcx
155 pushq %rdx
156 pushq %rax
157 call __fpstart
158 call _init
159 popq %rdi
160 popq %rsi
161 popq %rdx
162 popq %rcx
163 call main /* main(argc,argv,envp) */
164 pushq %rax
165 pushq %rax
166 movq %rax,%rdi /* and call exit */
167 call exit
168 popq %rdi
169 popq %rdi
170 call _exit /* if user redefined exit, call _exit */
172 .size _start, .-_start
175 * The following is here in case any object module compiled with cc -p
176 * was linked into this module.
178 .globl _mcount
179 .section .text
180 .align 8
181 .type _mcount,@function
182 _mcount:
184 .size _mcount, .-_mcount
186 .globl __longdouble_used
187 .section .data
188 .align 8
189 .type __longdouble_used,@object
190 .size __longdouble_used,4
191 __longdouble_used:
192 .4byte 0