summaryrefslogtreecommitdiff
path: root/usr/src/lib/crt/i386/mach-crt1.s
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/crt/i386/mach-crt1.s')
-rw-r--r--usr/src/lib/crt/i386/mach-crt1.s80
1 files changed, 80 insertions, 0 deletions
diff --git a/usr/src/lib/crt/i386/mach-crt1.s b/usr/src/lib/crt/i386/mach-crt1.s
new file mode 100644
index 0000000000..1824d41ec3
--- /dev/null
+++ b/usr/src/lib/crt/i386/mach-crt1.s
@@ -0,0 +1,80 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+#include <sys/asm_linkage.h>
+
+ .file "mach-crt1.s"
+
+/* global entities defined elsewhere but used here */
+ .globl _start_crt
+
+/*
+ * C language startup routine.
+ * Assume that exec code has cleared the direction flag in the TSS.
+ * Assume that %esp is set to the addr after the last word pushed.
+ * The stack contains (in order): argc, argv[],envp[],...
+ * Assume that all of the segment registers are initialized.
+ *
+ * Allocate a NULL return address and a NULL previous %ebp as if
+ * there was a genuine call to _start.
+ * debugger stack trace shows _start(argc,argv[0],argv[1],...,envp[0],...)
+ */
+ENTRY_NP(_start)
+ pushl $0
+ pushl $0
+ movl %esp,%ebp /* The first stack frame */
+
+ /*
+ * The stack needs to be 16-byte aligned with a 4-byte bias. See
+ * comment in lib/libc/i386/gen/makectxt.c.
+ *
+ * Note: If you change it, you need to change it in the following
+ * files as well:
+ *
+ * - lib/libc/i386/threads/machdep.c
+ * - lib/libc/i386/gen/makectxt.c
+ * - lib/crt/i386/crti.s
+ */
+ andl $-16,%esp /* make main() and exit() be called with */
+ subl $4,%esp /* a properly aligned stack pointer */
+ pushl %edx /* possible atexit handler */
+ leal 12(%ebp),%edx /* argv */
+ movl 8(%ebp),%eax /* argc */
+ pushl %edx
+ pushl %eax
+ call _start_crt
+ hlt
+SET_SIZE(_start)
+
+#include "fsr.s"
+
+/*
+ * The following is here in case any object module compiled with cc -p
+ * was linked into this module.
+ */
+ENTRY_NP(_mcount)
+ .weak _mcount
+ ret
+SET_SIZE(_mcount)