crt1.c revision 330897
1/* LINTLIBRARY */
2/*-
3 * SPDX-License-Identifier: BSD-3-Clause
4 *
5 * Copyright 2001 David E. O'Brien.
6 * All rights reserved.
7 * Copyright (c) 1995, 1998 Berkeley Software Design, Inc.
8 * All rights reserved.
9 * Copyright 1996-1998 John D. Polstra.
10 * All rights reserved.
11 *
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
14 * are met:
15 * 1. Redistributions of source code must retain the above copyright
16 *    notice, this list of conditions and the following disclaimer.
17 * 2. Redistributions in binary form must reproduce the above copyright
18 *    notice, this list of conditions and the following disclaimer in the
19 *    documentation and/or other materials provided with the distribution.
20 * 3. The name of the authors may not be used to endorse or promote products
21 *    derived from this software without specific prior written permission
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 */
34
35#include <sys/cdefs.h>
36__FBSDID("$FreeBSD: stable/11/lib/csu/sparc64/crt1.c 330897 2018-03-14 03:19:51Z eadler $");
37
38#include <stdlib.h>
39
40#include "libc_private.h"
41#include "crtbrand.c"
42#include "ignore_init.c"
43
44struct Struct_Obj_Entry;
45struct ps_strings;
46
47extern void __sparc_utrap_setup(void);
48
49#ifdef GCRT
50extern void _mcleanup(void);
51extern void monstartup(void *, void *);
52extern int eprol;
53extern int etext;
54#endif
55
56void _start(char **, void (*)(void), struct Struct_Obj_Entry *,
57    struct ps_strings *);
58
59/* The entry function. */
60/*
61 * %o0 holds ps_strings pointer.
62 *
63 * Note: kernel may (is not set in stone yet) pass ELF aux vector in %o1,
64 * but for now we do not use it here.
65 *
66 * The SPARC compliance definitions specifies that the kernel pass the
67 * address of a function to be executed on exit in %g1. We do not make
68 * use of it as it is quite broken, because gcc can use this register
69 * as a temporary, so it is not safe from C code. Its even more broken
70 * for dynamic executables since rtld runs first.
71 */
72/* ARGSUSED */
73void
74_start(char **ap, void (*cleanup)(void), struct Struct_Obj_Entry *obj __unused,
75    struct ps_strings *ps_strings __unused)
76{
77	int argc;
78	char **argv;
79	char **env;
80
81	argc = *(long *)(void *)ap;
82	argv = ap + 1;
83	env  = ap + 2 + argc;
84	handle_argv(argc, argv, env);
85
86	if (&_DYNAMIC != NULL)
87		atexit(cleanup);
88	else {
89		__sparc_utrap_setup();
90		_init_tls();
91	}
92#ifdef GCRT
93	atexit(_mcleanup);
94	monstartup(&eprol, &etext);
95#endif
96
97	handle_static_init(argc, argv, env);
98	exit(main(argc, argv, env));
99}
100
101#ifdef GCRT
102__asm__(".text");
103__asm__("eprol:");
104__asm__(".previous");
105#endif
106