mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-22 10:50:07 +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>
|
||||
|
||||
* 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. */
|
||||
|
||||
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])
|
||||
|
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
|
||||
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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user