diff options
| -rw-r--r-- | libc/sysdeps/linux/bfin/crt1.S | 50 | 
1 files changed, 24 insertions, 26 deletions
| diff --git a/libc/sysdeps/linux/bfin/crt1.S b/libc/sysdeps/linux/bfin/crt1.S index 7b6a99de0..dd30370b3 100644 --- a/libc/sysdeps/linux/bfin/crt1.S +++ b/libc/sysdeps/linux/bfin/crt1.S @@ -6,7 +6,7 @@   */  /* When we enter this piece of code, the user stack looks like this: -*      argc            argument counter (integer) +* [SP] argc            argument counter (integer)  *      argv[0]         program name (pointer)  *      argv[1...N]     program args (pointers)  *      NULL @@ -15,8 +15,9 @@  *   When we are done here, we want  *	R0=argc -*	R1=*argv[0] -*	R2=*envp[0] +*	R1=argv +*	R2=__init +*   SP=__fini  */  #include <features.h> @@ -28,31 +29,20 @@  .global ___uClibc_main;  .type	___uClibc_main,STT_FUNC; +#define __UCLIBC_CTOR_DTOR__  #if defined(__UCLIBC_CTOR_DTOR__) -.type   __init,%function -.type   __fini,%function -#else -.weak   __init -.weak   __fini +.weak	__init; +.weak	__fini;  #endif -/* -	When we enter, our stack looks like: -	[ SP ] -	[argc][argv]... - -	Call ___uClibc_main(argc, argv, __init, __fini) -	                     R0    R1     R2    stack - -	Before we call main, we want: -	[ SP ] -	[fini][argc][argv] -*/ -  __start: -/*	clear the frame pointer */ +/*	clear the frame pointer and the L registers.  */  	FP = 0; +	L0 = 0; +	L1 = 0; +	L2 = 0; +	L3 = 0;  /*	Load register R0 (argc) from the stack to its final resting place */  	P0 = SP; @@ -61,14 +51,22 @@ __start:  /*	Copy argv pointer into R1 */  	R1 = P0; +#if defined(__UCLIBC_CTOR_DTOR__)  /*	Load __init into R2 */ -	R2 = __init; +	R2.H = __init; +	R2.L = __init;  /*	Load __fini onto the stack */ -	P0 = __fini; -	[SP--] = P0; +	SP += -16; +	R3.H = __fini; +	R3.L = __fini; +	[SP+12] = R3; +#else +/*	Just fixup the stack */ +	sp += -12; +#endif  /*	Ok, now run uClibc's main() -- shouldn't return */ -	sp += -8;  	jump.l	___uClibc_main; +  .size __start,.-__start | 
