about summary refs log tree commit diff
path: root/sysdeps/i386/elf
diff options
context:
space:
mode:
authorGreg McGary <greg@mcgary.org>2000-06-29 22:55:31 +0000
committerGreg McGary <greg@mcgary.org>2000-06-29 22:55:31 +0000
commite5f88e0ca0d2762ca87263ee01d13e9950de403d (patch)
tree88f266651d99e6be69fd69c46935bfb81bf33676 /sysdeps/i386/elf
parentd3d89ab3a83ad036d7ea4794d044a1e710598fcd (diff)
downloadglibc-e5f88e0ca0d2762ca87263ee01d13e9950de403d.tar.gz
glibc-e5f88e0ca0d2762ca87263ee01d13e9950de403d.tar.xz
glibc-e5f88e0ca0d2762ca87263ee01d13e9950de403d.zip
* sysdeps/i386/bp-asm.h (PCOFF): New constant.
(POP_ERRNO_LOCATION_RETURN): Fold insns. 
* sysdeps/i386/bits/setjmp.h (JB_SIZE): New constant. 
(PUSH_SIGNAL_MASK): New macro. 
* sysdeps/i386/__longjmp.S (__longjmp): Wrap symbol in BP_SYM (). 
LEAVE is unnecessary.  Check bounds of jmp_buf. 
* sysdeps/i386/elf/setjmp.S: Call PUSH_SIGNAL_MASK.  Wrap symbols 
in BP_SYM ().  Check bounds of jmp_buf.  Don't call LEAVE until 
immediately before tail-call. 
* sysdeps/i386/setjmp.S: Likewise. 
* sysdeps/i386/bsd-_setjmp.S: Likewise. 
* sysdeps/i386/bsd-setjmp.S: Likewise.
2000-06-29  Greg McGary  <greg@mcgary.org>

	* sysdeps/i386/bp-asm.h (PCOFF): New constant.
	(POP_ERRNO_LOCATION_RETURN): Fold insns.
	* sysdeps/i386/bits/setjmp.h (JB_SIZE): New constant.
	(PUSH_SIGNAL_MASK): New macro.
	* sysdeps/i386/__longjmp.S (__longjmp): Wrap symbol in BP_SYM ().
	LEAVE is unnecessary.  Check bounds of jmp_buf.
	* sysdeps/i386/elf/setjmp.S: Call PUSH_SIGNAL_MASK.  Wrap symbols
	in BP_SYM ().  Check bounds of jmp_buf.  Don't call LEAVE until
	immediately before tail-call.
	* sysdeps/i386/setjmp.S: Likewise.
	* sysdeps/i386/bsd-_setjmp.S: Likewise.
	* sysdeps/i386/bsd-setjmp.S: Likewise.
Diffstat (limited to 'sysdeps/i386/elf')
-rw-r--r--sysdeps/i386/elf/setjmp.S55
1 files changed, 27 insertions, 28 deletions
diff --git a/sysdeps/i386/elf/setjmp.S b/sysdeps/i386/elf/setjmp.S
index e734809bf8..1d600a489f 100644
--- a/sysdeps/i386/elf/setjmp.S
+++ b/sysdeps/i386/elf/setjmp.S
@@ -21,50 +21,49 @@
 #define _ASM
 #define _SETJMP_H
 #include <bits/setjmp.h>
+#include "bp-sym.h"
 #include "bp-asm.h"
 
-#define PARMS	LINKAGE		/* no space for saved regs */
-#define JBUF	PARMS
-#define SGMSK	JBUF+PRT_SIZE
-
 	/* We include the BSD entry points here as well but we make
 	   them weak.  */
-ENTRY (setjmp)
-	.weak C_SYMBOL_NAME (setjmp)
-	popl %eax		/* Pop return PC.  */
-	popl %ecx		/* Pop jmp_buf argument.  */
-	pushl $1		/* Push second argument of zero.  */
-	pushl %ecx		/* Push back first argument.  */
-	pushl %eax		/* Push back return PC.  */
+ENTRY (BP_SYM (setjmp))
+	.weak C_SYMBOL_NAME (BP_SYM (setjmp))
+	PUSH_SIGNAL_MASK (1)
 	/* Note that we have to use a non-exported symbol in the next
 	   jump since otherwise gas will emit it as a jump through the
 	   PLT which is what we cannot use here.  */
 	jmp .Linternal_sigsetjmp
-END (setjmp)
+END (BP_SYM (setjmp))
 
 	/* Binary compatibility entry point.  */
-ENTRY (_setjmp)
-	.weak C_SYMBOL_NAME (_setjmp)
-ENTRY (__setjmp)
-	popl %eax		/* Pop return address.  */
-	popl %ecx		/* Pop jmp_buf.  */
-	pushl $0		/* Push zero argument.  */
-	pushl %ecx		/* Push jmp_buf.  */
-	pushl %eax		/* Push back return address.  */
+ENTRY (BP_SYM (_setjmp))
+	.weak C_SYMBOL_NAME (BP_SYM (_setjmp))
+ENTRY (BP_SYM (__setjmp))
+	PUSH_SIGNAL_MASK (0)
+	/* FALL THROUGH */
+
+#define PARMS	LINKAGE		/* no space for saved regs */
+#define JMPBUF	PARMS
+#define SIGMSK	JMPBUF+PTR_SIZE
+
+ENTRY (BP_SYM (__sigsetjmp))
+.Linternal_sigsetjmp = BP_SYM (__sigsetjmp)
+	ENTER
+
+	movl JMPBUF(%esp), %eax
+	CHECK_BOUNDS_BOTH_WIDE (%eax, JMPBUF(%esp), $JB_SIZE)
 
-ENTRY (__sigsetjmp)
-.Linternal_sigsetjmp = __sigsetjmp
-	movl 4(%esp), %eax	/* User's jmp_buf in %eax.  */
      	/* Save registers.  */
 	movl %ebx, (JB_BX*4)(%eax)
 	movl %esi, (JB_SI*4)(%eax)
 	movl %edi, (JB_DI*4)(%eax)
 	movl %ebp, (JB_BP*4)(%eax)
-	leal JBUF(%esp), %ecx	/* Save SP as it will be after we return.  */
+	leal JMPBUF(%esp), %ecx	/* Save SP as it will be after we return.  */
      	movl %ecx, (JB_SP*4)(%eax)
-	movl 0(%esp), %ecx	/* Save PC we are returning to now.  */
+	movl PCOFF(%esp), %ecx	/* Save PC we are returning to now.  */
      	movl %ecx, (JB_PC*4)(%eax)
 
+	LEAVE /* pop frame pointer to prepare for tail-call.  */
 	/* Make a tail call to __sigjmp_save; it takes the same args.  */
 #ifdef	PIC
 	/* We cannot use the PLT, because it requires that %ebx be set, but
@@ -74,9 +73,9 @@ ENTRY (__sigsetjmp)
 	call here
 here:	popl %ecx
 	addl $_GLOBAL_OFFSET_TABLE_+[.-here], %ecx
-	movl C_SYMBOL_NAME(__sigjmp_save@GOT)(%ecx), %ecx
+	movl C_SYMBOL_NAME (BP_SYM (__sigjmp_save)@GOT)(%ecx), %ecx
 	jmp *%ecx
 #else
-	jmp __sigjmp_save
+	jmp BP_SYM (__sigjmp_save)
 #endif
-END (__sigsetjmp)
+END (BP_SYM (__sigsetjmp))