about summary refs log tree commit diff
path: root/sysdeps/i386/bits
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/i386/bits')
-rw-r--r--sysdeps/i386/bits/setjmp.h26
1 files changed, 24 insertions, 2 deletions
diff --git a/sysdeps/i386/bits/setjmp.h b/sysdeps/i386/bits/setjmp.h
index 2f5b44531a..327e5670ac 100644
--- a/sysdeps/i386/bits/setjmp.h
+++ b/sysdeps/i386/bits/setjmp.h
@@ -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