Changeset View
Changeset View
Standalone View
Standalone View
lib/csu/aarch64/crt1_s.S
- This file was copied from lib/csu/i386/crt1_c.c.
/* LINTLIBRARY */ | /* LINTLIBRARY */ | ||||
/*- | /*- | ||||
* Copyright 1996-1998 John D. Polstra. | * Copyright 1996-1998 John D. Polstra. | ||||
* Copyright 2014 Andrew Turner. | |||||
* Copyright 2014-2015 The FreeBSD Foundation. | |||||
* All rights reserved. | * All rights reserved. | ||||
* | * | ||||
* Portions of this software were developed by Andrew Turner | |||||
* under sponsorship from the FreeBSD Foundation. | |||||
* | |||||
* Redistribution and use in source and binary forms, with or without | * Redistribution and use in source and binary forms, with or without | ||||
* modification, are permitted provided that the following conditions | * modification, are permitted provided that the following conditions | ||||
* are met: | * are met: | ||||
* 1. Redistributions of source code must retain the above copyright | * 1. Redistributions of source code must retain the above copyright | ||||
* notice, this list of conditions and the following disclaimer. | * notice, this list of conditions and the following disclaimer. | ||||
* 2. Redistributions in binary form must reproduce the above copyright | * 2. Redistributions in binary form must reproduce the above copyright | ||||
* notice, this list of conditions and the following disclaimer in the | * notice, this list of conditions and the following disclaimer in the | ||||
* documentation and/or other materials provided with the distribution. | * documentation and/or other materials provided with the distribution. | ||||
* | * | ||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR | ||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | ||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | ||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
* | |||||
* $FreeBSD$ | |||||
*/ | */ | ||||
#include <sys/cdefs.h> | #include <machine/asm.h> | ||||
__FBSDID("$FreeBSD$"); | __FBSDID("$FreeBSD$"); | ||||
#include <stdlib.h> | #include "crtbrand.S" | ||||
#include "ignore_init_note.S" | |||||
#include "libc_private.h" | ENTRY(_start) | ||||
#include "crtbrand.c" | mov x3, x2 /* cleanup */ | ||||
#include "ignore_init.c" | add x1, x0, #8 /* load argv */ | ||||
ldr x0, [x0] /* load argc */ | |||||
add x2, x1, x0, lsl #3 /* env is after argv */ | |||||
add x2, x2, #8 /* argv is null terminated */ | |||||
b __start | |||||
END(_start) | |||||
typedef void (*fptr)(void); | .section .note.GNU-stack,"",@progbits | ||||
extern void _start(char *, ...); | |||||
#ifdef GCRT | |||||
extern void _mcleanup(void); | |||||
extern void monstartup(void *, void *); | |||||
extern int eprol; | |||||
extern int etext; | |||||
#endif | |||||
void _start1(fptr, int, char *[]) __dead2; | |||||
/* The entry function, C part. */ | |||||
void | |||||
_start1(fptr cleanup, int argc, char *argv[]) | |||||
{ | |||||
char **env; | |||||
env = argv + argc + 1; | |||||
handle_argv(argc, argv, env); | |||||
if (&_DYNAMIC != NULL) { | |||||
atexit(cleanup); | |||||
} else { | |||||
process_irelocs(); | |||||
_init_tls(); | |||||
} | |||||
#ifdef GCRT | |||||
atexit(_mcleanup); | |||||
monstartup(&eprol, &etext); | |||||
__asm__("eprol:"); | |||||
#endif | |||||
handle_static_init(argc, argv, env); | |||||
exit(main(argc, argv, env)); | |||||
} | |||||
__asm(".hidden _start1"); |