summaryrefslogtreecommitdiff
path: root/usr/src/lib/crt/sparc/mach-crt1.s
blob: 2e840068c3b071eed559d8fbae79312e07cdbc6d (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
/*
 * This file and its contents are supplied under the terms of the
 * Common Development and Distribution License ("CDDL"), version 1.0.
 * You may only use this file in accordance with the terms of version
 * 1.0 of the CDDL.
 *
 * A full copy of the text of the CDDL should have accompanied this
 * source.  A copy of the CDDL is also available via the Internet at
 * http://www.illumos.org/license/CDDL.
 */

/*
 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

/* Copyright 2016, Richard Lowe. */

#include <sys/asm_linkage.h>
#include <sys/stack.h>

	.file	"mach-crt1.s"
	.ident	""

	.global	_start_crt

#if defined(__sparcv9)
#define	EB_MAX_SIZE	128
#else
#define	EB_MAX_SIZE	64
#endif

ENTRY_NP(_start)
	/*
	 * On entry, the stack is:
	 *
	 * .-----------------------.   <--- %sp
	 * |			   |
	 * |	    Window	   |
	 * |			   |
	 * |-----------------------|
	 * |	    argc	   |
	 * |-----------------------|
	 * |	    argv[0]	   |
	 * |	    argv[1]	   |
	 * |	    argv[2]	   |
	 * |	    argv[3]	   |
	 * |	    ...		   |
	 * |	 argv[argc - 1]	   |
	 * |-----------------------|
	 * |	      NULL	   |
	 * |-----------------------|
	 * |	    envp[0]	   |
	 * |	    envp[1]	   |
	 * |	    envp[2]	   |
	 * |	    envp[3]	   |
	 * |	     ...	   |
	 * |	    envp[N]	   |
	 * |-----------------------|
	 * |	      NULL	   |
	 * .-----------------------.
	 *
	 * and an exit handler from the linker is in %g1
	 */
	clr	%fp		! don't trace the stack past this point

	add	%sp, WINDOWSIZE + STACK_BIAS, %l0	! address of argc

	! allocate a minimally sized frame, and align ourselves
	add	%sp, -SA(MINFRAME - EB_MAX_SIZE), %sp

	ldn	[%l0], %o0			! argc
	add	%l0, CPTRSIZE, %o1	! argv
	call	_start_crt
	    mov %g1, %o2			! exit_handler in delay slot
SET_SIZE(_start)