xref: /titanic_51/usr/src/lib/crt/sparc/mach-crt1.s (revision 3e0c804466b61d42dc6a3e1cb114c11681ef181a)
1*3e0c8044SRichard Lowe/*
2*3e0c8044SRichard Lowe * This file and its contents are supplied under the terms of the
3*3e0c8044SRichard Lowe * Common Development and Distribution License ("CDDL"), version 1.0.
4*3e0c8044SRichard Lowe * You may only use this file in accordance with the terms of version
5*3e0c8044SRichard Lowe * 1.0 of the CDDL.
6*3e0c8044SRichard Lowe *
7*3e0c8044SRichard Lowe * A full copy of the text of the CDDL should have accompanied this
8*3e0c8044SRichard Lowe * source.  A copy of the CDDL is also available via the Internet at
9*3e0c8044SRichard Lowe * http://www.illumos.org/license/CDDL.
10*3e0c8044SRichard Lowe */
11*3e0c8044SRichard Lowe
12*3e0c8044SRichard Lowe/*
13*3e0c8044SRichard Lowe * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
14*3e0c8044SRichard Lowe * Use is subject to license terms.
15*3e0c8044SRichard Lowe */
16*3e0c8044SRichard Lowe
17*3e0c8044SRichard Lowe/* Copyright 2016, Richard Lowe. */
18*3e0c8044SRichard Lowe
19*3e0c8044SRichard Lowe#include <sys/asm_linkage.h>
20*3e0c8044SRichard Lowe#include <sys/stack.h>
21*3e0c8044SRichard Lowe
22*3e0c8044SRichard Lowe	.file	"mach-crt1.s"
23*3e0c8044SRichard Lowe
24*3e0c8044SRichard Lowe	.global	_start_crt
25*3e0c8044SRichard Lowe
26*3e0c8044SRichard Lowe#if defined(__sparcv9)
27*3e0c8044SRichard Lowe#define	EB_MAX_SIZE	128
28*3e0c8044SRichard Lowe#else
29*3e0c8044SRichard Lowe#define	EB_MAX_SIZE	64
30*3e0c8044SRichard Lowe#endif
31*3e0c8044SRichard Lowe
32*3e0c8044SRichard LoweENTRY_NP(_start)
33*3e0c8044SRichard Lowe	/*
34*3e0c8044SRichard Lowe	 * On entry, the stack is:
35*3e0c8044SRichard Lowe	 *
36*3e0c8044SRichard Lowe	 * .-----------------------.   <--- %sp
37*3e0c8044SRichard Lowe	 * |			   |
38*3e0c8044SRichard Lowe	 * |	    Window	   |
39*3e0c8044SRichard Lowe	 * |			   |
40*3e0c8044SRichard Lowe	 * |-----------------------|
41*3e0c8044SRichard Lowe	 * |	    argc	   |
42*3e0c8044SRichard Lowe	 * |-----------------------|
43*3e0c8044SRichard Lowe	 * |	    argv[0]	   |
44*3e0c8044SRichard Lowe	 * |	    argv[1]	   |
45*3e0c8044SRichard Lowe	 * |	    argv[2]	   |
46*3e0c8044SRichard Lowe	 * |	    argv[3]	   |
47*3e0c8044SRichard Lowe	 * |	    ...		   |
48*3e0c8044SRichard Lowe	 * |	 argv[argc - 1]	   |
49*3e0c8044SRichard Lowe	 * |-----------------------|
50*3e0c8044SRichard Lowe	 * |	      NULL	   |
51*3e0c8044SRichard Lowe	 * |-----------------------|
52*3e0c8044SRichard Lowe	 * |	    envp[0]	   |
53*3e0c8044SRichard Lowe	 * |	    envp[1]	   |
54*3e0c8044SRichard Lowe	 * |	    envp[2]	   |
55*3e0c8044SRichard Lowe	 * |	    envp[3]	   |
56*3e0c8044SRichard Lowe	 * |	     ...	   |
57*3e0c8044SRichard Lowe	 * |	    envp[N]	   |
58*3e0c8044SRichard Lowe	 * |-----------------------|
59*3e0c8044SRichard Lowe	 * |	      NULL	   |
60*3e0c8044SRichard Lowe	 * .-----------------------.
61*3e0c8044SRichard Lowe	 *
62*3e0c8044SRichard Lowe	 * and an exit handler from the linker is in %g1
63*3e0c8044SRichard Lowe	 */
64*3e0c8044SRichard Lowe	clr	%fp		! don't trace the stack past this point
65*3e0c8044SRichard Lowe
66*3e0c8044SRichard Lowe	add	%sp, WINDOWSIZE + STACK_BIAS, %l0	! address of argc
67*3e0c8044SRichard Lowe
68*3e0c8044SRichard Lowe	! allocate a minimally sized frame, and align ourselves
69*3e0c8044SRichard Lowe	add	%sp, -SA(MINFRAME - EB_MAX_SIZE), %sp
70*3e0c8044SRichard Lowe
71*3e0c8044SRichard Lowe	ldn	[%l0], %o0			! argc
72*3e0c8044SRichard Lowe	add	%l0, CPTRSIZE, %o1	! argv
73*3e0c8044SRichard Lowe	call	_start_crt
74*3e0c8044SRichard Lowe	    mov %g1, %o2			! exit_handler in delay slot
75*3e0c8044SRichard LoweSET_SIZE(_start)
76