1117531Smarcel/*
2117531Smarcel * Copyright (c) 2003 Marcel Moolenaar
3117531Smarcel * All rights reserved.
4117531Smarcel *
5117531Smarcel * Redistribution and use in source and binary forms, with or without
6117531Smarcel * modification, are permitted provided that the following conditions
7117531Smarcel * are met:
8117531Smarcel *
9117531Smarcel * 1. Redistributions of source code must retain the above copyright
10117531Smarcel *    notice, this list of conditions and the following disclaimer.
11117531Smarcel * 2. Redistributions in binary form must reproduce the above copyright
12117531Smarcel *    notice, this list of conditions and the following disclaimer in the
13117531Smarcel *    documentation and/or other materials provided with the distribution.
14117531Smarcel *
15117531Smarcel * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16117531Smarcel * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17117531Smarcel * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18117531Smarcel * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19117531Smarcel * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20117531Smarcel * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21117531Smarcel * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22117531Smarcel * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23117531Smarcel * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24117531Smarcel * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25117531Smarcel */
26117531Smarcel
27216338Sdim#include <machine/asm.h>
28216338Sdim__FBSDID("$FreeBSD$");
29117531Smarcel
30117531Smarcel		.text
31117531Smarcel
32117531Smarcel/*
33117531Smarcel * void _start(char **ap, struct ps_strings *, void (*cleanup)(void));
34117531Smarcel */
35117531Smarcel#define	AP		in0
36117531Smarcel#define	CLEANUP		in2
37117531Smarcel
38117531Smarcel#define	GP		loc0
39117531Smarcel#define	ARGC		loc1
40117531Smarcel#define	ARGV		loc2
41117531Smarcel#define	ENVP		loc3
42117531Smarcel
43117531Smarcel		.global		_start
44117531Smarcel		.type		_start, @function
45117531Smarcel		.proc		_start
46117531Smarcel_start:
47117531Smarcel		.prologue
48117531Smarcel		.save		rp, r0
49117531Smarcel		.body
50117531Smarcel{		.mlx
51117531Smarcel		alloc		r14=ar.pfs,3,4,3,0
52117531Smarcel		movl		r15=@gprel(1f)
53117531Smarcel}
54117531Smarcel1:
55117531Smarcel{		.mmi
56117531Smarcel		ld4		ARGC=[AP]
57117531Smarcel		adds		ARGV=8,AP
58117531Smarcel		mov		r16=ip
59117531Smarcel		;;
60117531Smarcel}
61117531Smarcel{		.mmi
62117531Smarcel		sub		gp=r16,r15
63117531Smarcel		sub		GP=r16,r15
64117531Smarcel		shladd		r14=ARGC,3,AP
65117531Smarcel		;;
66117531Smarcel}
67117531Smarcel{		.mii
68117531Smarcel		addl		r15=@ltoff(environ),gp
69117531Smarcel		cmp4.ge		p6,p7=0,ARGC
70117531Smarcel		adds		ENVP=16,r14
71117531Smarcel		;;
72117531Smarcel}
73117531Smarcel{		.mmi
74117531Smarcel		ld8		r14=[r15]
75117531Smarcel(p7)		ld8		r15=[ARGV]
76117531Smarcel		addl		r16=@gprel(__progname),gp
77117531Smarcel		;;
78117531Smarcel}
79117531Smarcel{		.mib
80117531Smarcel		st8		[r14]=ENVP
81117531Smarcel(p7)		cmp.eq		p6,p0=0,r15
82117531Smarcel(p6)		br.dpnt		.L1
83117531Smarcel		;;
84117531Smarcel}
85117531Smarcel		/* Normalize __progname. */
86117531Smarcel{		.mmi
87117531Smarcel		st8		[r16]=r15
88117531Smarcel		ld1		r14=[r15],1
89117531Smarcel		nop		0
90117531Smarcel		;;
91117531Smarcel}
92117531Smarcel.L0:
93117531Smarcel{		.mib
94117531Smarcel		cmp4.eq		p7,p0=0,r14
95117531Smarcel		cmp4.eq		p6,p0=0x2f,r14
96117531Smarcel(p7)		br.dptk		.L1
97117531Smarcel		;;
98117531Smarcel}
99117531Smarcel{		.mmb
100117531Smarcel(p6)		st8		[r16]=r15
101117531Smarcel		ld1		r14=[r15],1
102117531Smarcel		br.dptk.many	.L0
103117531Smarcel}
104117531Smarcel.L1:
105117531Smarcel{		.mib
106117531Smarcel		cmp.ne		p7,p0=0,CLEANUP
107117531Smarcel		mov		out0=CLEANUP
108117531Smarcel(p7)		br.call.sptk	b0=atexit
109117531Smarcel		;;
110117531Smarcel}
111133754Sdfr{		.mfb
112133989Smarcel		mov		gp=GP
113133754Sdfr		nop		0
114133754Sdfr		br.call.sptk	b0=_init_tls
115133754Sdfr}
116117531Smarcel#ifdef GCRT
117117531Smarcel{		.mmi
118117531Smarcel		mov		gp=GP
119117531Smarcel		;;
120117531Smarcel		addl		r14=@ltoff(@fptr(_mcleanup)),gp
121117531Smarcel		nop		0
122117531Smarcel		;;
123117531Smarcel}
124117531Smarcel{		.mfb
125117531Smarcel		ld8		out0=[r14]
126117531Smarcel		nop		0
127117531Smarcel		br.call.sptk	b0=atexit
128117531Smarcel		;;
129117531Smarcel}
130117531Smarcel#endif
131117531Smarcel{		.mmi
132117531Smarcel		mov		gp=GP
133117531Smarcel		;;
134117531Smarcel		addl		r14=@ltoff(@fptr(_fini)),gp
135117531Smarcel		nop		0
136117531Smarcel		;;
137117531Smarcel}
138117531Smarcel{		.mfb
139117531Smarcel		ld8		out0=[r14]
140117531Smarcel		nop		0
141117531Smarcel		br.call.sptk	b0=atexit
142117531Smarcel		;;
143117531Smarcel}
144117531Smarcel#ifdef GCRT
145117531Smarcel{		.mmi
146117531Smarcel		mov		gp=GP
147117531Smarcel		;;
148117531Smarcel		addl		r14=@ltoff(eprol),gp
149117531Smarcel		addl		r15=@ltoff(etext),gp
150117531Smarcel		;;
151117531Smarcel}
152117531Smarcel{		.mmb
153117531Smarcel		ld8		out0=[r14]
154117531Smarcel		ld8		out1=[r15]
155117531Smarcel		br.call.sptk	b0=monstartup
156117531Smarcel		;;
157117531Smarcel}
158117531Smarcel#endif
159117531Smarcel{		.mfb
160117531Smarcel		mov		gp=GP
161117531Smarcel		nop		0
162117531Smarcel		br.call.sptk	b0=_init
163117531Smarcel		;;
164117531Smarcel}
165117531Smarcel{		.mmi
166117531Smarcel		mov		gp=GP
167117531Smarcel		mov		out0=ARGC
168117531Smarcel		mov		out1=ARGV
169117531Smarcel}
170117531Smarcel{		.mfb
171117531Smarcel		mov		out2=ENVP
172117531Smarcel		nop		0
173117531Smarcel		br.call.sptk	b0=main
174117531Smarcel		;;
175117531Smarcel}
176117531Smarcel{		.mib
177117531Smarcel		mov		gp=GP
178117606Smarcel		mov		out0=r8
179117531Smarcel		br.call.sptk	b0=exit
180117531Smarcel		;;
181117531Smarcel}
182117531Smarcel		.endp		_start
183117531Smarcel
184117531Smarcel#ifdef GCRT
185117531Smarceleprol:
186117531Smarcel#endif
187117531Smarcel
188117531Smarcel		.rodata
189117531Smarcel.empty:		stringz		""
190117531Smarcel
191117531Smarcel		.sdata
192117531Smarcel		.global		__progname
193117531Smarcel		.size		__progname,8
194117531Smarcel		.type		__progname,@object
195117531Smarcel__progname:	data8		.empty
196117531Smarcel
197117531Smarcel		.common		environ,8,8
198