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