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$"); 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