diff --git a/ChangeLog b/ChangeLog index 37fdf9f7e2..7e96a8824b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +Thu Aug 31 13:23:35 1995 Roland McGrath + + * sysdeps/unix/i386/brk.S [PIC]: Set __curbrk through the GOT. + + Rewrote i386 setjmp code in assembly, so as to avoid fighting + with the compiler for the register values. + * sysdeps/i386/setjmp.S, sysdeps/i386/__longjmp.S: New files. + * sysdeps/i386/setjmp.c, sysdeps/i386/__longjmp.c: Files removed. + * sysdeps/i386/jmp_buf.h [! _ASM] (__jmp_buf): Define as array of ints. + [__USE_MISC || _ASM] (JB_*): New macros, for indices therein. + (_JMPBUF_UNWINDS): Use JB_SP. + Wed Aug 30 16:44:55 1995 Roland McGrath * sysdeps/mach/hurd/select.c: Deal with out of order replies diff --git a/sysdeps/i386/__longjmp.S b/sysdeps/i386/__longjmp.S new file mode 100644 index 0000000000..f546622828 --- /dev/null +++ b/sysdeps/i386/__longjmp.S @@ -0,0 +1,35 @@ +/* longjmp for i386. +Copyright (C) 1995 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 +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C Library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include +#define _ASM +#include + +ENTRY (__longjmp) + movl 4(%esp), %ecx /* User's jmp_buf in %ecx. */ + movl 8(%esp), %eax /* Second argument is return value. */ + /* Restore registers. */ + movl JB_BX(%ecx), %ebx + movl JB_SI(%ecx), %esi + movl JB_DI(%ecx), %edi + movl JB_BP(%ecx), %ebp + movl JB_SP(%ecx), %esp + /* Jump to saved PC. */ + movl JB_PC(%ecx), %ecx + jmp *%ecx diff --git a/sysdeps/i386/__longjmp.c b/sysdeps/i386/__longjmp.c deleted file mode 100644 index 65d6ec18ec..0000000000 --- a/sysdeps/i386/__longjmp.c +++ /dev/null @@ -1,66 +0,0 @@ -/* Copyright (C) 1991, 1992, 1994, 1995 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 -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. - -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. */ - -#ifndef __GNUC__ - #error This file uses GNU C extensions; you must compile with GCC. -#endif - -/* Put these global register declarations first, because we get an error if - they come after any function definition, including inlines which might - be in some header. */ - -#define REGS \ - REG (bx);\ - REG (si);\ - REG (di);\ - REG (bp);\ - REG (sp) - -#define REG(xx) register long int xx asm (#xx) -REGS; -#undef REG - -#include -#include -#include -#include - -/* Jump to the position specified by ENV, causing the - setjmp call there to return VAL, or 1 if VAL is 0. */ -void -DEFUN(__longjmp, (env, val), - __jmp_buf env AND int val) -{ - /* We specify explicit registers because, when not optimizing, - the compiler will generate code that uses the frame pointer - after it's been munged. */ - - register CONST __typeof (env[0]) *e asm ("cx"); - register int v asm ("ax"); - - e = env; - v = val == 0 ? 1 : val; - -#define REG(xx) xx = (long int) e->__##xx - REGS; - - asm volatile ("jmp %*%0" : : "g" (e->__pc), "a" (v)); - - /* NOTREACHED */ - abort (); -} diff --git a/sysdeps/i386/jmp_buf.h b/sysdeps/i386/jmp_buf.h index 7949883b60..0c03073b36 100644 --- a/sysdeps/i386/jmp_buf.h +++ b/sysdeps/i386/jmp_buf.h @@ -1,14 +1,19 @@ /* Define the machine-dependent type `jmp_buf'. Intel 386 version. */ -typedef struct - { - long int __bx, __si, __di; - __ptr_t __bp; - __ptr_t __sp; - __ptr_t __pc; - } __jmp_buf[1]; +#if defined (__USE_MISC) || defined (_ASM) +#define JB_BX 0 +#define JB_SI 1 +#define JB_DI 2 +#define JB_BP 3 +#define JB_SP 4 +#define JB_PC 5 +#endif + +#ifndef _ASM +typedef int __jmp_buf[6]; +#endif /* Test if longjmp to JMPBUF would unwind the frame containing a local variable at ADDRESS. */ #define _JMPBUF_UNWINDS(jmpbuf, address) \ - ((__ptr_t) (address) < (jmpbuf)[0].__sp) + ((int) (address) < (jmpbuf)[JB_SP]) diff --git a/sysdeps/i386/setjmp.S b/sysdeps/i386/setjmp.S new file mode 100644 index 0000000000..a07d6f1137 --- /dev/null +++ b/sysdeps/i386/setjmp.S @@ -0,0 +1,36 @@ +/* setjmp for i386. +Copyright (C) 1995 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 +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C Library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include +#define _ASM +#include + +ENTRY (__sigsetjmp) + movl 4(%esp), %eax /* User's jmp_buf in %eax. */ + /* Save registers. */ + movl %ebx, JB_BX(%eax) + movl %esi, JB_SI(%eax) + movl %edi, JB_DI(%eax) + movl %ebp, JB_BP(%eax) + leal 4(%esp), %ecx /* Save SP as it will be after we return. */ + movl %ecx, JB_SP(%eax) + movl 0(%esp), %ecx /* Save PC we are returning to now. */ + movl %ecx, JB_PC(%eax) + xorl %eax, %eax /* Return zero. */ + ret diff --git a/sysdeps/i386/setjmp.c b/sysdeps/i386/setjmp.c deleted file mode 100644 index fb8fc98659..0000000000 --- a/sysdeps/i386/setjmp.c +++ /dev/null @@ -1,55 +0,0 @@ -/* Copyright (C) 1991, 1992, 1994 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 -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. - -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. */ - -/* Put these global register declarations first, because we get an error if - they come after any function definition, including inlines which might - be in some header. */ - -#define REGS \ - REG (bx);\ - REG (si);\ - REG (di) - -#define REG(xx) register long int xx asm (#xx) -REGS; -#undef REG - -#include -#include - -/* Save the current program position in ENV and return 0. */ -int -__sigsetjmp (jmp_buf env, int savemask) -{ - /* Save the general registers. */ -#define REG(xx) env[0].__jmpbuf[0].__##xx = xx - REGS; -#undef REG - - /* Save the return PC. */ - env[0].__jmpbuf[0].__pc = ((void **) &env)[-1]; - - /* Save caller's FP, not our own. */ - env[0].__jmpbuf[0].__bp = ((void **) &env)[-2]; - - /* Save caller's SP, not our own. */ - env[0].__jmpbuf[0].__sp = (void *) &env; - - /* Save the signal mask if requested. */ - return __sigjmp_save (env, savemask); -} diff --git a/sysdeps/unix/i386/brk.S b/sysdeps/unix/i386/brk.S index f55ac7c775..f1717bbf8e 100644 --- a/sysdeps/unix/i386/brk.S +++ b/sysdeps/unix/i386/brk.S @@ -34,7 +34,16 @@ C_LABEL(__curbrk) .text SYSCALL__ (brk, 1) movl 4(%esp), %eax +#ifdef PIC + /* Standard PIC nonsense to store into `__curbrk' through the GOT. */ + call here +here: popl %ecx + addl $_GLOBAL_OFFSET_TABLE_+[.-here], %ecx + movl C_SYMBOL_NAME(__curbrk@GOT)(%ecx), %ecx + movl %eax, (%ecx) +#else movl %eax, C_SYMBOL_NAME(__curbrk) +#endif xorl %eax, %eax ret