|
|
(192 intermediate revisions by 2 users not shown) |
Line 1: |
Line 1: |
| build-shared and build-static successful for i686.
| |
|
| |
|
| No binary differences.
| |
|
| |
| OK?
| |
|
| |
| 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.
| |
|
| |
| Index: sysdeps/i386/__longjmp.S
| |
| ===================================================================
| |
|
| |
| ===================================================================
| |
| RCS file: /cvs/glibc/libc/sysdeps/i386/bp-asm.h,v
| |
| retrieving revision 1.1
| |
| diff -u -p -r1.1 bp-asm.h
| |
| --- bp-asm.h 2000/06/09 06:14:39 1.1
| |
| +++ bp-asm.h 2000/06/29 22:38:49
| |
| @@ -43,6 +43,8 @@
| |
| /* Stack space overhead of procedure-call linkage: return address and
| |
| frame pointer. */
| |
| # define LINKAGE 8
| |
| +/* Stack offset of return address after calling ENTER. */
| |
| +# define PCOFF 4
| |
|
| |
| /* Int 5 is the "bound range" exception also raised by the "bound"
| |
| instruction. */
| |
| @@ -106,8 +108,7 @@
| |
| argument, but we must pop the space for the BP itself. We also
| |
| dereference the return value in order to dig out the pointer value. */
| |
| # define POP_ERRNO_LOCATION_RETURN \
| |
| - movl (%esp), %eax; \
| |
| - addl $4, %esp; \
| |
| + popl %eax; \
| |
| addl $8, %esp
| |
|
| |
| # else /* !__BOUNDED_POINTERS__ */
| |
| @@ -123,6 +124,8 @@
| |
| # define LEAVE
| |
| /* Stack space overhead of procedure-call linkage: return address only. */
| |
| # define LINKAGE 4
| |
| +/* Stack offset of return address after calling ENTER. */
| |
| +# define PCOFF 0
| |
|
| |
| # define CHECK_BOUNDS_LOW(VAL_REG, BP_MEM)
| |
| # define CHECK_BOUNDS_HIGH(VAL_REG, BP_MEM, Jcc)
| |
| Index: sysdeps/i386/bsd-_setjmp.S
| |
| ===================================================================
| |
| RCS file: /cvs/glibc/libc/sysdeps/i386/bsd-_setjmp.S,v
| |
| retrieving revision 1.6
| |
| diff -u -p -r1.6 bsd-_setjmp.S
| |
| --- bsd-_setjmp.S 1997/03/20 02:14:01 1.6
| |
| +++ bsd-_setjmp.S 2000/06/29 22:38:49
| |
| @@ -1,5 +1,5 @@
| |
| /* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'. i386 version.
| |
| - Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
| |
| + Copyright (C) 1994, 1995, 1996, 1997, 2000 Free Software Foundation, Inc.
| |
| This file is part of the GNU C Library.
| |
|
| |
| The GNU C Library is free software; you can redistribute it and/or
| |
| @@ -22,13 +22,14 @@
| |
| in setjmp doesn't clobber the state restored by longjmp. */
| |
|
| |
| #include <sysdep.h>
| |
| +#define _ASM
| |
| +#define _SETJMP_H
| |
| +#include <bits/setjmp.h>
| |
| +#include "bp-sym.h"
| |
| +#include "bp-asm.h"
| |
|
| |
| -ENTRY (_setjmp)
| |
| - popl %eax /* Pop return PC. */
| |
| - popl %ecx /* Pop jmp_buf argument. */
| |
| - pushl $0 /* Push second argument of zero. */
| |
| - pushl %ecx /* Push back first argument. */
| |
| - pushl %eax /* Push back return PC. */
| |
| +ENTRY (BP_SYM (_setjmp))
| |
| + PUSH_SIGNAL_MASK (0)
| |
| #ifdef PIC
| |
| /* We cannot use the PLT, because it requires that %ebx be set, but
| |
| we can't save and restore our caller's value. Instead, we do an
| |
| @@ -37,9 +38,9 @@ ENTRY (_setjmp)
| |
| call here
| |
| here: popl %ecx
| |
| addl $_GLOBAL_OFFSET_TABLE_+[.-here], %ecx
| |
| - movl C_SYMBOL_NAME(__sigsetjmp@GOT)(%ecx), %ecx
| |
| + movl C_SYMBOL_NAME (BP_SYM (__sigsetjmp)@GOT)(%ecx), %ecx
| |
| jmp *%ecx
| |
| #else
| |
| - jmp __sigsetjmp
| |
| + jmp BP_SYM (__sigsetjmp)
| |
| #endif
| |
| -END (_setjmp)
| |
| +END (BP_SYM (_setjmp))
| |
| Index: sysdeps/i386/bsd-setjmp.S
| |
| ===================================================================
| |
| RCS file: /cvs/glibc/libc/sysdeps/i386/bsd-setjmp.S,v
| |
| retrieving revision 1.5
| |
| diff -u -p -r1.5 bsd-setjmp.S
| |
| --- bsd-setjmp.S 1997/03/20 02:14:04 1.5
| |
| +++ bsd-setjmp.S 2000/06/29 22:38:49
| |
| @@ -1,5 +1,5 @@
| |
| /* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. i386 version.
| |
| - Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
| |
| + Copyright (C) 1994, 1995, 1996, 1997, 2000 Free Software Foundation, Inc.
| |
| This file is part of the GNU C Library.
| |
|
| |
| The GNU C Library is free software; you can redistribute it and/or
| |
| @@ -22,13 +22,14 @@
| |
| in setjmp doesn't clobber the state restored by longjmp. */
| |
|
| |
| #include <sysdep.h>
| |
| +#define _ASM
| |
| +#define _SETJMP_H
| |
| +#include <bits/setjmp.h>
| |
| +#include "bp-sym.h"
| |
| +#include "bp-asm.h"
| |
|
| |
| -ENTRY (setjmp)
| |
| - popl %eax /* Pop return PC. */
| |
| - popl %ecx /* Pop jmp_buf argument. */
| |
| - pushl $1 /* Push second argument of one. */
| |
| - pushl %ecx /* Push back first argument. */
| |
| - pushl %eax /* Push back return PC. */
| |
| +ENTRY (BP_SYM (setjmp))
| |
| + PUSH_SIGNAL_MASK (1)
| |
| #ifdef PIC
| |
| /* We cannot use the PLT, because it requires that %ebx be set, but
| |
| we can't save and restore our caller's value. Instead, we do an
| |
| @@ -37,9 +38,9 @@ ENTRY (setjmp)
| |
| call here
| |
| here: popl %ecx
| |
| addl $_GLOBAL_OFFSET_TABLE_+[.-here], %ecx
| |
| - movl C_SYMBOL_NAME(__sigsetjmp@GOT)(%ecx), %ecx
| |
| + movl C_SYMBOL_NAME (BP_SYM (__sigsetjmp)@GOT)(%ecx), %ecx
| |
| jmp *%ecx
| |
| #else
| |
| - jmp __sigsetjmp
| |
| + jmp BP_SYM (__sigsetjmp)
| |
| #endif
| |
| -END (setjmp)
| |
| +END (BP_SYM (setjmp))
| |
| Index: sysdeps/i386/setjmp.S
| |
| ===================================================================
| |
| RCS file: /cvs/glibc/libc/sysdeps/i386/setjmp.S,v
| |
| retrieving revision 1.10
| |
| diff -u -p -r1.10 setjmp.S
| |
| --- setjmp.S 1998/04/20 18:32:48 1.10
| |
| +++ setjmp.S 2000/06/29 22:38:49
| |
| @@ -1,5 +1,5 @@
| |
| /* setjmp for i386.
| |
| - Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
| |
| + Copyright (C) 1995, 1996, 1997, 2000 Free Software Foundation, Inc.
| |
| This file is part of the GNU C Library.
| |
|
| |
| The GNU C Library is free software; you can redistribute it and/or
| |
| @@ -19,29 +19,38 @@
| |
|
| |
| #include <sysdep.h>
| |
| #define _ASM
| |
| +#define _SETJMP_H
| |
| #include <bits/setjmp.h>
| |
| #include <asm-syntax.h>
| |
| +#include "bp-sym.h"
| |
| +#include "bp-asm.h"
| |
|
| |
| /* Binary compatibility entry point. */
| |
| -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))
| |
| + PUSH_SIGNAL_MASK (0)
| |
| + /* FALL THROUGH */
| |
| +
| |
| +#define PARMS LINKAGE /* no space for saved regs */
| |
| +#define JMPBUF PARMS
| |
| +#define SIGMSK JMPBUF+PTR_SIZE
| |
|
| |
| -ENTRY (__sigsetjmp)
| |
| - movl 4(%esp), %eax /* User's jmp_buf in %eax. */
| |
| +ENTRY (BP_SYM (__sigsetjmp))
| |
| + ENTER
| |
| +
| |
| + movl JMPBUF(%esp), %eax
| |
| + CHECK_BOUNDS_BOTH_WIDE (%eax, JMPBUF(%esp), $JB_SIZE)
| |
| +
| |
| /* 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 4(%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
| |
| @@ -52,9 +61,9 @@ ENTRY (__sigsetjmp)
| |
| L(here):
| |
| popl %ecx
| |
| addl $_GLOBAL_OFFSET_TABLE_+[.-L(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))
| |
| Index: sysdeps/i386/bits/setjmp.h
| |
| ===================================================================
| |
| RCS file: /cvs/glibc/libc/sysdeps/i386/bits/setjmp.h,v
| |
| retrieving revision 1.4
| |
| diff -u -p -r1.4 setjmp.h
| |
| --- setjmp.h 1998/04/22 09:27:22 1.4
| |
| +++ setjmp.h 2000/06/29 22:38:49
| |
| @@ -1,4 +1,4 @@
| |
| -/* Copyright (C) 1997, 1998 Free Software Foundation, Inc.
| |
| +/* Copyright (C) 1997, 1998, 2000 Free Software Foundation, Inc.
| |
| This file is part of the GNU C Library.
| |
|
| |
| The GNU C Library is free software; you can redistribute it and/or
| |
| @@ -29,9 +29,31 @@
| |
| # define JB_BP 3
| |
| # define JB_SP 4
| |
| # define JB_PC 5
| |
| +# define JB_SIZE 24
| |
| #endif
| |
|
| |
| -#ifndef _ASM
| |
| +#ifdef _ASM
| |
| +/* We internally convert all setjmp (buf) calls to sigsetjmp (buf, mask),
| |
| + so we must shift with the call frame to insert the mask argument. */
| |
| +# if __BOUNDED_POINTERS__
| |
| +# define PUSH_SIGNAL_MASK(MASK) \
| |
| + popl %eax; /* return address */ \
| |
| + popl %ecx; /* jmp_buf value */ \
| |
| + popl %edx; /* jmp_buf low bound */ \
| |
| + pushl 0(%esp); /* jmp_buf high bound */ \
| |
| + movel $MASK, 4(%esp); \
| |
| + pushl %edx; \
| |
| + pushl %ecx; \
| |
| + pushl %eax
| |
| +# else
| |
| +# define PUSH_SIGNAL_MASK(MASK) \
| |
| + popl %eax; /* return address */ \
| |
| + popl %ecx; /* jmp_buf */ \
| |
| + pushl $MASK; \
| |
| + pushl %ecx; \
| |
| + pushl %eax
| |
| +# endif
| |
| +#else
| |
| typedef int __jmp_buf[6];
| |
| #endif
| |
|
| |
| Index: sysdeps/i386/elf/setjmp.S
| |
| ===================================================================
| |
| RCS file: /cvs/glibc/libc/sysdeps/i386/elf/setjmp.S,v
| |
| retrieving revision 1.4
| |
| diff -u -p -r1.4 setjmp.S
| |
| --- setjmp.S 2000/06/09 06:14:39 1.4
| |
| +++ setjmp.S 2000/06/29 22:38:49
| |
| @@ -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 (__sigsetjmp)
| |
| -.Linternal_sigsetjmp = __sigsetjmp
| |
| - movl 4(%esp), %eax /* User's jmp_buf in %eax. */
| |
| +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)
| |
| +
| |
| /* 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))
| |
|
| |
|
| |
| --------------------------------------------------------------------------------
| |
|
| |
| Follow-Ups:
| |
| Re: PATCH: BPs for ix86 setjmp/longjmp
| |
| From: Ulrich Drepper
| |
| Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
| |
| Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
| |