Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 22 Jun 2015 19:43:08 +0000 (UTC)
From:      Andrew Turner <andrew@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r284707 - in head: lib/csu/aarch64 libexec/rtld-elf/aarch64
Message-ID:  <201506221943.t5MJh8ZY064085@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: andrew
Date: Mon Jun 22 19:43:08 2015
New Revision: 284707
URL: https://svnweb.freebsd.org/changeset/base/284707

Log:
  Add a workaround to correctly align the stack before calling into C code.
  When enough time has passed for users to update their userland the kernel
  fix will be applied. This will change the ABI to have x0 point to the args
  and sp be correctly aligned.
  
  It is expected this compatibility code can be removed when the kernel and
  qemu usermode emulation have both been updated for the new ABI.
  
  This fixes clang failures, and most likely other crashes.
  
  Obtained from:	ABT Systems Ltd
  Sponsored by:	The FreeBSD Foundation

Modified:
  head/lib/csu/aarch64/crt1.c
  head/libexec/rtld-elf/aarch64/rtld_start.S

Modified: head/lib/csu/aarch64/crt1.c
==============================================================================
--- head/lib/csu/aarch64/crt1.c	Mon Jun 22 19:37:04 2015	(r284706)
+++ head/lib/csu/aarch64/crt1.c	Mon Jun 22 19:43:08 2015	(r284707)
@@ -58,9 +58,13 @@ __asm("	.text			\n"
 "	.align	0		\n"
 "	.globl	_start		\n"
 "	_start:			\n"
-"	mov	x3, x2		\n" /* cleanup */
-"	ldr	x0, [sp]	\n" /* Load argc */
-"	add	x1, sp, #8	\n" /* load argv */
+/* TODO: Remove this when the kernel correctly aligns the stack */
+"	cbnz	x0, 1f		\n" /* Are we using a new kernel? */
+"	mov	x0, sp		\n" /* No, load the args from sp */
+"	and	sp, x0, #~0xf	\n" /* And align the stack */
+"1:	mov	x3, x2		\n" /* cleanup */
+"	add	x1, x0, #8	\n" /* load argv */
+"	ldr	x0, [x0]	\n" /* load argc */
 "	add	x2, x1, x0, lsl #3 \n" /* env is after argv */
 "	add	x2, x2, #8	\n" /* argv is null terminated */
 "	b	 __start  ");

Modified: head/libexec/rtld-elf/aarch64/rtld_start.S
==============================================================================
--- head/libexec/rtld-elf/aarch64/rtld_start.S	Mon Jun 22 19:37:04 2015	(r284706)
+++ head/libexec/rtld-elf/aarch64/rtld_start.S	Mon Jun 22 19:43:08 2015	(r284707)
@@ -34,10 +34,14 @@ ENTRY(.rtld_start)
 	mov	x19, x0		/* Put ps_strings in a callee-saved register */
 	mov	x20, sp		/* And the stack pointer */
 
-	sub	x8, x20, #16	/* Make room for obj_main & exit proc */
-	mov	sp, x8		/* Update the stack pointer */
+	/* Handle the old style stack */
+	/* TODO: Remove this when the kernel correctly aligns the stack */
+	cbnz	x0, 1f
+	mov	x0, sp		/* sp points to the args */
+	and	sp, x0, #~0xf	/* Align the stack as needed */
+
+1:	sub	sp, sp, #16	/* Make room for obj_main & exit proc */
 
-	mov	x0, x20		/* Pass the stack we were given to _rtld */
 	mov	x1, sp		/* exit_proc */
 	add	x2, x1, #8	/* obj_main */
 	bl	_rtld		/* Call the loader */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201506221943.t5MJh8ZY064085>