| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 | /* * This file is subject to the terms and conditions of the LGPL V2.1 * License.  See the file "COPYING" in the main directory of this archive * for more details. * * Copyright (C) 2018 Kalray Inc. *//* Startup code compliant to the ELF KVX ABI */#include <libc-symbols.h>#include <features.h>.type	    main,@function.type	    __uClibc_main,@function	/* * When we enter this piece of code, the program stack has been * layed out by the kernel like this: *        argc            argument counter (integer) *        argv[0]         program name (pointer) *        argv[1...N]     program args (pointers) *        argv[argc-1]    end of args (integer) *        NULL *        env[0...N]      environment variables (pointers) *        NULL *  *  Moreover, when using dynamic loader, $r0 contains the rtld_fini *  address * * And we need to call the following function: *  __uClibc_main (int (*main) (int, char **, char **), int argc, *		char **argv, void (*init) (void), void (*fini) (void), *		void (*rtld_fini) (void), void *stack_end) */.text.globl	_start.type	_start,@function.align 	8C_SYMBOL_NAME(_start):	/* Load argc from stack */	ld $r1 = 0[$sp]	/* Load argv addr from stack */	addd $r2 = $sp, 0x8#ifdef __PIC__	pcrel $r7 = @gotaddr()#endif	;;	/* $r0 contains rtld_fini when run by dynamic loader */	copyd $r5 = $r0	/* prepare __uClibc_main arg */#ifndef __PIC__	make $r3 = _init	make $r4 = _fini#endif	;;	/* Align stack to 32-byte boundary */	andd $sp = $sp, -32	make $r8 = 0	make $fp = 0	/* prepare __uClibc_main arg */#ifdef __PIC__	ld $r3 = @got(_init)[$r7]#endif	;;	/* Setup stack_end for __uClibc_main */	copyd $r6 = $sp	/* Clear compute status */	set $cs = $r8#ifdef __PIC__	ld $r4 = @got(_fini)[$r7]#endif	;;#ifdef __PIC__	ld $r0 = @got(main)[$r7]#else	make $r0 = main#endif	goto __uClibc_main	;;	/* We should never return ! */	errop	;;
 |