Changeset View
Changeset View
Standalone View
Standalone View
lib/csu/riscv/crt1_s.S
- This file was moved from lib/csu/riscv/crt1.c.
Show All 27 Lines | |||||
* 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. | ||||
*/ | */ | ||||
#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" | mv a3, a2 # cleanup | ||||
#include "ignore_init.c" | addi a1, a0, 8 # get argv | ||||
ld a0, 0(a0) # load argc | |||||
slli t0, a0, 3 # mult by arg size | |||||
add a2, a1, t0 # env is after argv | |||||
addi a2, a2, 8 # argv is null terminated | |||||
.option push | |||||
.option norelax | |||||
lla gp, __global_pointer$ | |||||
.option pop | |||||
call __start | |||||
END(_start) | |||||
typedef void (*fptr)(void); | .section .note.GNU-stack,"",%progbits | ||||
#ifdef GCRT | |||||
extern void _mcleanup(void); | |||||
extern void monstartup(void *, void *); | |||||
extern int eprol; | |||||
extern int etext; | |||||
#endif | |||||
void __start(int argc, char **argv, char **env, void (*cleanup)(void)); | |||||
/* The entry function. */ | |||||
__asm(" .text \n" | |||||
" .align 0 \n" | |||||
" .globl _start \n" | |||||
" _start: \n" | |||||
" mv a3, a2 \n" /* cleanup */ | |||||
" addi a1, a0, 8 \n" /* get argv */ | |||||
" ld a0, 0(a0) \n" /* load argc */ | |||||
" slli t0, a0, 3 \n" /* mult by arg size */ | |||||
" add a2, a1, t0 \n" /* env is after argv */ | |||||
" addi a2, a2, 8 \n" /* argv is null terminated */ | |||||
" .option push \n" | |||||
" .option norelax \n" | |||||
" lla gp, __global_pointer$\n" | |||||
" .option pop \n" | |||||
" call __start"); | |||||
void | |||||
__start(int argc, char **argv, char **env, void (*cleanup)(void)) | |||||
{ | |||||
handle_argv(argc, argv, env); | |||||
if (&_DYNAMIC != NULL) | |||||
atexit(cleanup); | |||||
else | |||||
_init_tls(); | |||||
#ifdef GCRT | |||||
atexit(_mcleanup); | |||||
monstartup(&eprol, &etext); | |||||
__asm__("eprol:"); | |||||
#endif | |||||
handle_static_init(argc, argv, env); | |||||
exit(main(argc, argv, env)); | |||||
} |