Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 25 Sep 2002 07:20:03 -0700 (PDT)
From:      Bruce Evans <bde@zeta.org.au>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: i386/41528: better stack alignment patch for lib/csu/i386-elf/
Message-ID:  <200209251420.g8PEK35G074297@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR i386/41528; it has been noted by GNATS.

From: Bruce Evans <bde@zeta.org.au>
To: NIIMI Satoshi <sa2c@sa2c.net>
Cc: FreeBSD-gnats-submit@FreeBSD.ORG
Subject: Re: i386/41528: better stack alignment patch for lib/csu/i386-elf/
Date: Thu, 26 Sep 2002 00:28:06 +1000 (EST)

 On 13 Aug 2002, NIIMI Satoshi wrote:
 
 > Bruce Evans <bde@zeta.org.au> writes:
 > > ...
 > > I would only use this fix or one like it in RELENG_4.  Maybe my kernel
 > > hack is better since it "fixes" most applications without a recompile.
 > > It is simpler because it doesn't use any assembly code or have to recover
 > > from the kernel pushing the args in a misaligned place.
 >
 > Thanks.  But is it possible?  I attached a patch for -current so that
 > it can be commited into -current then MFC'ed to -stable.
 
 I just got around to preparing this for commit (hopefully just before 4.7),
 and found a small problem.  There seems to be an off-by-8 error.
 
 Original patch:
 
 % Index: stable/lib/csu/i386-elf/crt1.c
 % ===================================================================
 % RCS file: /home/ncvs/src/lib/csu/i386-elf/crt1.c,v
 % retrieving revision 1.4.2.1
 % diff -u -r1.4.2.1 crt1.c
 % --- stable/lib/csu/i386-elf/crt1.c	30 Oct 2000 20:32:24 -0000	1.4.2.1
 % +++ stable/lib/csu/i386-elf/crt1.c	10 Aug 2002 19:40:54 -0000
 % @@ -93,7 +93,33 @@
 %      monstartup(&eprol, &etext);
 %  #endif
 %      _init();
 % +#if 0
 %      exit( main(argc, argv, env) );
 % +#else
 % +    /*
 % +     * GCC expects stack frame to be aligned like following figure.
 % +     *
 % +     *  +--------------+
 % +     *  |%ebp (if any) |
 % +     *  +--------------+
 % +     *  |return address|
 % +     *  +--------------+ --- aligned by PREFERRED_STACK_BOUNDARY
 % +     *  |  arguments   |
 % +     *  |      :       |
 % +     *  |      :       |
 % +     */
 
 This is where gcc-3 wants the stack aligned, but gcc-2 apparently wants
 it defined 8 bytes lower (higher in the diagram), after pushing %ebp.
 
 I am now testing the following patch:
 
 %%%
 Index: crt1.c
 ===================================================================
 RCS file: /home/ncvs/src/lib/csu/i386-elf/crt1.c,v
 retrieving revision 1.9
 diff -u -2 -r1.9 crt1.c
 --- crt1.c	16 Jul 2002 12:28:49 -0000	1.9
 +++ crt1.c	25 Sep 2002 14:23:24 -0000
 @@ -101,5 +101,34 @@
  #endif
  	_init();
 +#ifndef __GNUC__
  	exit( main(argc, argv, env) );
 +#else
 +	/*
 +	 * gcc-2 expects the stack frame to be aligned as follows after it
 +	 * is set up in main():
 +	 *
 +	 *  +--------------+ <--- aligned by PREFERRED_STACK_BOUNDARY
 +	 *  +%ebp (if any) +
 +	 *  +--------------+
 +	 *  |return address|
 +	 *  +--------------+
 +	 *  |  arguments   |
 +	 *  |      :       |
 +	 *  |      :       |
 +	 *  +--------------+
 +	 *
 +	 * The call must be written in assembler to implement this.
 +	 */
 +	__asm__("
 +	andl	$~0xf, %%esp		# align stack to 16-byte boundary
 +	subl	$12+12, %%esp		# space for args and padding
 +	movl	%0, 0(%%esp)
 +	movl	%1, 4(%%esp)
 +	movl	%2, 8(%%esp)
 +	call	main
 +	movl	%%eax, 0(%%esp)
 +	call	exit
 +	" : : "r" (argc), "r" (argv), "r" (env) : "ax", "cx", "dx", "memory");
 +#endif
  }
 
 %%%
 
 Bruce
 

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




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