about summary refs log tree commit diff
path: root/sysdeps/x86_64/start.S
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2012-05-14 17:50:41 -0700
committerH.J. Lu <hjl.tools@gmail.com>2012-05-14 17:50:41 -0700
commit6cdef1ab3666b1a0e9c5b3892970bd2fc8211bf8 (patch)
tree8489c0c6aac58241d1b540e63be28779b6522cac /sysdeps/x86_64/start.S
parent245a11d7bd3bc44cd2b9f8598516287393705f76 (diff)
downloadglibc-6cdef1ab3666b1a0e9c5b3892970bd2fc8211bf8.tar.gz
glibc-6cdef1ab3666b1a0e9c5b3892970bd2fc8211bf8.tar.xz
glibc-6cdef1ab3666b1a0e9c5b3892970bd2fc8211bf8.zip
Update sysdeps/x86_64/start.S for x32
Diffstat (limited to 'sysdeps/x86_64/start.S')
-rw-r--r--sysdeps/x86_64/start.S37
1 files changed, 22 insertions, 15 deletions
diff --git a/sysdeps/x86_64/start.S b/sysdeps/x86_64/start.S
index 5e01d21179..e603463044 100644
--- a/sysdeps/x86_64/start.S
+++ b/sysdeps/x86_64/start.S
@@ -44,13 +44,13 @@
 		before this code runs.
 
    %rsp		The stack contains the arguments and environment:
-		0(%rsp)			argc
-		8(%rsp)			argv[0]
+		0(%rsp)				argc
+		LP_SIZE(%rsp)			argv[0]
 		...
-		(8*argc)(%rsp)		NULL
-		(8*(argc+1))(%rsp)	envp[0]
+		(LP_SIZE*argc)(%rsp)		NULL
+		(LP_SIZE*(argc+1))(%rsp)	envp[0]
 		...
-					NULL
+						NULL
 */
 
 #include <sysdep.h>
@@ -81,14 +81,21 @@ _start:
 	rtld_fini:	%r9
 	stack_end:	stack.	*/
 
-	movq %rdx, %r9		/* Address of the shared library termination
+	mov %RDX_LP, %R9_LP	/* Address of the shared library termination
 				   function.  */
+#ifdef __ILP32__
+	mov (%rsp), %esi	/* Simulate popping 4-byte argument count.  */
+	add $4, %esp
+#else
 	popq %rsi		/* Pop the argument count.  */
-	movq %rsp, %rdx		/* argv starts just at the current stack top.  */
+#endif
+	/* argv starts just at the current stack top.  */
+	mov %RSP_LP, %RDX_LP
 	/* Align the stack to a 16 byte boundary to follow the ABI.  */
-	andq  $~15, %rsp
+	and  $~15, %RSP_LP
 
-	pushq %rax		/* Push garbage because we push 8 more bytes.  */
+	/* Push garbage because we push 8 more bytes.  */
+	pushq %rax
 
 	/* Provide the highest stack address to the user code (for stacks
 	   which grow downwards).  */
@@ -96,20 +103,20 @@ _start:
 
 #ifdef SHARED
 	/* Pass address of our own entry points to .fini and .init.  */
-	movq __libc_csu_fini@GOTPCREL(%rip), %r8
-	movq __libc_csu_init@GOTPCREL(%rip), %rcx
+	mov __libc_csu_fini@GOTPCREL(%rip), %R8_LP
+	mov __libc_csu_init@GOTPCREL(%rip), %RCX_LP
 
-	movq BP_SYM (main)@GOTPCREL(%rip), %rdi
+	mov BP_SYM (main)@GOTPCREL(%rip), %RDI_LP
 
 	/* Call the user's main function, and exit with its value.
 	   But let the libc call main.	  */
 	call BP_SYM (__libc_start_main)@PLT
 #else
 	/* Pass address of our own entry points to .fini and .init.  */
-	movq $__libc_csu_fini, %r8
-	movq $__libc_csu_init, %rcx
+	mov $__libc_csu_fini, %R8_LP
+	mov $__libc_csu_init, %RCX_LP
 
-	movq $BP_SYM (main), %rdi
+	mov $BP_SYM (main), %RDI_LP
 
 	/* Call the user's main function, and exit with its value.
 	   But let the libc call main.	  */