diff options
Diffstat (limited to 'libc/sysdeps/linux')
-rw-r--r-- | libc/sysdeps/linux/arm/Makefile | 6 | ||||
-rw-r--r-- | libc/sysdeps/linux/arm/crt0.S | 30 | ||||
-rw-r--r-- | libc/sysdeps/linux/arm/crt0pic.S | 65 |
3 files changed, 31 insertions, 70 deletions
diff --git a/libc/sysdeps/linux/arm/Makefile b/libc/sysdeps/linux/arm/Makefile index 009d7d8e1..1e08d094b 100644 --- a/libc/sysdeps/linux/arm/Makefile +++ b/libc/sysdeps/linux/arm/Makefile @@ -26,11 +26,7 @@ ASFLAGS=$(CFLAGS) TARGET_MACHINE_TYPE=$(shell $(CC) -dumpmachine) -ifeq ($(DOPIC),true) - CRT0=crt0pic.S -else - CRT0=crt0.S -endif +CRT0=crt0.S CRT0_OBJ=crt0.o SSRC=longjmp.S setjmp.S vfork.S diff --git a/libc/sysdeps/linux/arm/crt0.S b/libc/sysdeps/linux/arm/crt0.S index 65253881c..de7ef7848 100644 --- a/libc/sysdeps/linux/arm/crt0.S +++ b/libc/sysdeps/linux/arm/crt0.S @@ -6,6 +6,18 @@ NULL env[0...N] environment variables (pointers) NULL + + For uClinux it looks like this: + + argc argument counter (integer) + argv char *argv[] + envp char *envp[] + 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 When we are done here, we want a1=argc @@ -34,6 +46,7 @@ ARM register quick reference: pc r15 program counter */ +#include <features.h> .text .global _start @@ -44,10 +57,17 @@ ARM register quick reference: .text _start: +#if 0 /* some old code the I feel should not be here - davidm */ + @ adjust the data segment base pointer + ldr r3,=__data_start + sub sl,sl,r3 + mov BASEREG,sl +#endif /* clear the frame pointer */ mov fp, #0 +#ifdef __UCLIBC_HAS_MMU__ /* Load register r0 (argc) from the stack to its final resting place */ ldr r0, [sp], #4 @@ -58,6 +78,16 @@ _start: we find there (hopefully the environment) in r2 */ add r2, r1, r0, lsl #2 add r2, r2, #4 +#else + /* + * uClinux stacks look a little different to MMU stacks + * for no good reason + */ + /* pull argc, argv and envp off the stack */ + ldr r0,[sp, #0] + ldr r1,[sp, #4] + ldr r2,[sp, #8] +#endif /* Ok, now run uClibc's main() -- shouldn't return */ bl __uClibc_main diff --git a/libc/sysdeps/linux/arm/crt0pic.S b/libc/sysdeps/linux/arm/crt0pic.S deleted file mode 100644 index 7cb26e80e..000000000 --- a/libc/sysdeps/linux/arm/crt0pic.S +++ /dev/null @@ -1,65 +0,0 @@ -/* When we enter this piece of code, the program stack looks 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 - - When we are done here, we want - a1=argc - a2=argv[0] - a3=argv[argc+1] - -ARM register quick reference: - - Name Number ARM Procedure Calling Standard Role - - a1 r0 argument 1 / integer result / scratch register / argc - a2 r1 argument 2 / scratch register / argv - a3 r2 argument 3 / scratch register / envp - a4 r3 argument 4 / scratch register - v1 r4 register variable - v2 r5 register variable - v3 r6 register variable - v4 r7 register variable - v5 r8 register variable - sb/v6 r9 static base / register variable - sl/v7 r10 stack limit / stack chunk handle / reg. variable - fp r11 frame pointer - ip r12 scratch register / new-sb in inter-link-unit calls - sp r13 lower end of current stack frame - lr r14 link address / scratch register - pc r15 program counter -*/ - -.text - .global _start - .global __uClibc_main - - .type _start,%function - .type __uClibc_main,%function - - -@ r0 = argc -@ r1 = argv -@ r2 = envp -@ sl = data segment -#define BASEREG r9 - -.text -_start: - @ adjust the data segment base pointer - ldr r3,=__data_start - sub sl,sl,r3 - mov BASEREG,sl - - /* pull argc, argv and envp off the stack */ - ldr r0,[sp, #0] - ldr r1,[sp, #4] - ldr r2,[sp, #8] - - /* Ok, now run uClibc's main() -- shouldn't return */ - bl __uClibc_main - |