summaryrefslogtreecommitdiffstats
path: root/lib/libc/i386/gen/setjmp.S
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/i386/gen/setjmp.S')
-rw-r--r--lib/libc/i386/gen/setjmp.S51
1 files changed, 39 insertions, 12 deletions
diff --git a/lib/libc/i386/gen/setjmp.S b/lib/libc/i386/gen/setjmp.S
index b24da11..6525a16 100644
--- a/lib/libc/i386/gen/setjmp.S
+++ b/lib/libc/i386/gen/setjmp.S
@@ -1,6 +1,6 @@
/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
+ * Copyright (c) 1990 The Regents of the University of California.
+ * All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* William Jolitz.
@@ -32,11 +32,14 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
+ *
+ * $Id$
*/
-#if defined(LIBC_SCCS) && !defined(lint)
- .asciz "@(#)setjmp.s 8.1 (Berkeley) 6/4/93"
-#endif /* LIBC_SCCS and not lint */
+#if defined(LIBC_RCS) && !defined(lint)
+ .text
+ .asciz "$Id$"
+#endif /* LIBC_RCS and not lint */
/*
* C library -- _setjmp, _longjmp
@@ -44,16 +47,27 @@
* longjmp(a,v)
* will generate a "return(v)" from the last call to
* setjmp(a)
- * by restoring registers from the stack.
+ * by restoring registers from the environment 'a'.
* The previous signal state is restored.
*/
#include "DEFS.h"
+#include "SYS.h"
+#ifdef _THREAD_SAFE
+ENTRY(_thread_sys_setjmp)
+#else
ENTRY(setjmp)
+#endif
+ PIC_PROLOGUE
pushl $0
- call _sigblock
+#ifdef _THREAD_SAFE
+ call PIC_PLT(CNAME(_thread_sys_sigblock))
+#else
+ call PIC_PLT(CNAME(sigblock))
+#endif
popl %edx
+ PIC_EPILOGUE
movl 4(%esp),%ecx
movl 0(%esp),%edx
movl %edx, 0(%ecx)
@@ -63,14 +77,25 @@ ENTRY(setjmp)
movl %esi,16(%ecx)
movl %edi,20(%ecx)
movl %eax,24(%ecx)
- movl $0,%eax
+ fnstcw 28(%ecx)
+ xorl %eax,%eax
ret
+#ifdef _THREAD_SAFE
+ENTRY(_thread_sys_longjmp)
+#else
ENTRY(longjmp)
+#endif
movl 4(%esp),%edx
+ PIC_PROLOGUE
pushl 24(%edx)
- call _sigsetmask
+#ifdef _THREAD_SAFE
+ call PIC_PLT(CNAME(_thread_sys_sigsetmask))
+#else
+ call PIC_PLT(CNAME(sigsetmask)) /* XXX this is not reentrant */
+#endif
popl %eax
+ PIC_EPILOGUE
movl 4(%esp),%edx
movl 8(%esp),%eax
movl 0(%edx),%ecx
@@ -79,8 +104,10 @@ ENTRY(longjmp)
movl 12(%edx),%ebp
movl 16(%edx),%esi
movl 20(%edx),%edi
- cmpl $0,%eax
- jne 1f
- movl $1,%eax
+ fninit
+ fldcw 28(%edx)
+ testl %eax,%eax
+ jnz 1f
+ incl %eax
1: movl %ecx,0(%esp)
ret
OpenPOWER on IntegriCloud