mirror of
https://sourceware.org/git/glibc.git
synced 2025-01-03 08:11:08 +00:00
Rewrote i386 setjmp in assembly.
Thu Aug 31 13:23:35 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu> * 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.
This commit is contained in:
parent
a993273c0d
commit
e3726b056b
12
ChangeLog
12
ChangeLog
@ -1,3 +1,15 @@
|
|||||||
|
Thu Aug 31 13:23:35 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
|
||||||
|
|
||||||
|
* 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 <roland@churchy.gnu.ai.mit.edu>
|
Wed Aug 30 16:44:55 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
|
||||||
|
|
||||||
* sysdeps/mach/hurd/select.c: Deal with out of order replies
|
* sysdeps/mach/hurd/select.c: Deal with out of order replies
|
||||||
|
35
sysdeps/i386/__longjmp.S
Normal file
35
sysdeps/i386/__longjmp.S
Normal file
@ -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 <sysdep.h>
|
||||||
|
#define _ASM
|
||||||
|
#include <jmp_buf.h>
|
||||||
|
|
||||||
|
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
|
@ -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 <ansidecl.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <setjmp.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
/* 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 ();
|
|
||||||
}
|
|
@ -1,14 +1,19 @@
|
|||||||
/* Define the machine-dependent type `jmp_buf'. Intel 386 version. */
|
/* Define the machine-dependent type `jmp_buf'. Intel 386 version. */
|
||||||
|
|
||||||
typedef struct
|
#if defined (__USE_MISC) || defined (_ASM)
|
||||||
{
|
#define JB_BX 0
|
||||||
long int __bx, __si, __di;
|
#define JB_SI 1
|
||||||
__ptr_t __bp;
|
#define JB_DI 2
|
||||||
__ptr_t __sp;
|
#define JB_BP 3
|
||||||
__ptr_t __pc;
|
#define JB_SP 4
|
||||||
} __jmp_buf[1];
|
#define JB_PC 5
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _ASM
|
||||||
|
typedef int __jmp_buf[6];
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Test if longjmp to JMPBUF would unwind the frame
|
/* Test if longjmp to JMPBUF would unwind the frame
|
||||||
containing a local variable at ADDRESS. */
|
containing a local variable at ADDRESS. */
|
||||||
#define _JMPBUF_UNWINDS(jmpbuf, address) \
|
#define _JMPBUF_UNWINDS(jmpbuf, address) \
|
||||||
((__ptr_t) (address) < (jmpbuf)[0].__sp)
|
((int) (address) < (jmpbuf)[JB_SP])
|
||||||
|
36
sysdeps/i386/setjmp.S
Normal file
36
sysdeps/i386/setjmp.S
Normal file
@ -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 <sysdep.h>
|
||||||
|
#define _ASM
|
||||||
|
#include <jmp_buf.h>
|
||||||
|
|
||||||
|
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
|
@ -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 <errno.h>
|
|
||||||
#include <setjmp.h>
|
|
||||||
|
|
||||||
/* 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);
|
|
||||||
}
|
|
@ -34,7 +34,16 @@ C_LABEL(__curbrk)
|
|||||||
.text
|
.text
|
||||||
SYSCALL__ (brk, 1)
|
SYSCALL__ (brk, 1)
|
||||||
movl 4(%esp), %eax
|
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)
|
movl %eax, C_SYMBOL_NAME(__curbrk)
|
||||||
|
#endif
|
||||||
xorl %eax, %eax
|
xorl %eax, %eax
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user