about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog15
-rw-r--r--linuxthreads/signals.c2
-rw-r--r--sysdeps/generic/sigcontextinfo.h2
-rw-r--r--sysdeps/mach/hurd/i386/sigcontextinfo.h2
-rw-r--r--sysdeps/unix/sysv/linux/alpha/sigcontextinfo.h2
-rw-r--r--sysdeps/unix/sysv/linux/arm/sigcontextinfo.h2
-rw-r--r--sysdeps/unix/sysv/linux/i386/sigcontextinfo.h29
-rw-r--r--sysdeps/unix/sysv/linux/m68k/sigcontextinfo.h4
-rw-r--r--sysdeps/unix/sysv/linux/mips/sigcontextinfo.h2
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/sigcontextinfo.h4
-rw-r--r--sysdeps/unix/sysv/linux/s390/sigcontextinfo.h4
-rw-r--r--sysdeps/unix/sysv/linux/sh/sigcontextinfo.h2
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/sigcontextinfo.h2
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/sigcontextinfo.h2
14 files changed, 69 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index db343511e0..76e0263824 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2001-02-26  Jakub Jelinek  <jakub@redhat.com>
+
+	* sysdeps/generic/sigcontextinfo.h (CALL_SIGHANDLER): Define.
+	* sysdeps/mach/hurd/i386/sigcontextinfo.h: Likewise.
+	* sysdeps/unix/sysv/linux/alpha/sigcontextinfo.h: Likewise.
+	* sysdeps/unix/sysv/linux/arm/sigcontextinfo.h: Likewise.
+	* sysdeps/unix/sysv/linux/i386/sigcontextinfo.h: Likewise.
+	* sysdeps/unix/sysv/linux/m68k/sigcontextinfo.h: Likewise.
+	* sysdeps/unix/sysv/linux/mips/sigcontextinfo.h: Likewise.
+	* sysdeps/unix/sysv/linux/powerpc/sigcontextinfo.h: Likewise.
+	* sysdeps/unix/sysv/linux/s390/sigcontextinfo.h: Likewise.
+	* sysdeps/unix/sysv/linux/sh/sigcontextinfo.h: Likewise.
+	* sysdeps/unix/sysv/linux/sparc/sparc32/sigcontextinfo.h: Likewise.
+	* sysdeps/unix/sysv/linux/sparc/sparc64/sigcontextinfo.h: Likewise.
+
 2001-03-16  Ulrich Drepper  <drepper@redhat.com>
 
 	* sysdeps/ieee754/ldbl-96/s_erfl.c: New file.
diff --git a/linuxthreads/signals.c b/linuxthreads/signals.c
index 9824b2f4e7..714e346fab 100644
--- a/linuxthreads/signals.c
+++ b/linuxthreads/signals.c
@@ -94,7 +94,7 @@ static void pthread_sighandler(int signo, SIGCONTEXT ctx)
   in_sighandler = THREAD_GETMEM(self, p_in_sighandler);
   if (in_sighandler == NULL)
     THREAD_SETMEM(self, p_in_sighandler, CURRENT_STACK_FRAME);
-  sighandler[signo].old(signo, SIGCONTEXT_EXTRA_ARGS ctx);
+  CALL_SIGHANDLER(sighandler[signo].old, signo, ctx);
   if (in_sighandler == NULL)
     THREAD_SETMEM(self, p_in_sighandler, NULL);
 }
diff --git a/sysdeps/generic/sigcontextinfo.h b/sysdeps/generic/sigcontextinfo.h
index a33aadfed1..8a6c93aabc 100644
--- a/sysdeps/generic/sigcontextinfo.h
+++ b/sysdeps/generic/sigcontextinfo.h
@@ -23,3 +23,5 @@
 #define GET_PC(ctx)	((void *) 0)
 #define GET_FRAME(ctx)	((void *) 0)
 #define GET_STACK(ctx)	((void *) 0)
+#define CALL_SIGHANDLER(handler, signo, ctx) \
+  (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx))
diff --git a/sysdeps/mach/hurd/i386/sigcontextinfo.h b/sysdeps/mach/hurd/i386/sigcontextinfo.h
index 008be70706..68a36bf92d 100644
--- a/sysdeps/mach/hurd/i386/sigcontextinfo.h
+++ b/sysdeps/mach/hurd/i386/sigcontextinfo.h
@@ -21,3 +21,5 @@
 #define GET_PC(ctx)	((void *) (ctx).sc_eip)
 #define GET_FRAME(ctx)	((void *) (ctx).sc_ebp)
 #define GET_STACK(ctx)	((void *) (ctx).sc_uesp)
+#define CALL_SIGHANDLER(handler, signo, ctx) \
+  (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx))
diff --git a/sysdeps/unix/sysv/linux/alpha/sigcontextinfo.h b/sysdeps/unix/sysv/linux/alpha/sigcontextinfo.h
index 19c35a4624..4613bd51ac 100644
--- a/sysdeps/unix/sysv/linux/alpha/sigcontextinfo.h
+++ b/sysdeps/unix/sysv/linux/alpha/sigcontextinfo.h
@@ -21,3 +21,5 @@
 #define GET_PC(ctx)	((void *) (ctx).sc_pc)
 #define GET_FRAME(ctx)	((void *) (ctx).sc_regs[15])
 #define GET_STACK(ctx)	((void *) (ctx).sc_regs[30])
+#define CALL_SIGHANDLER(handler, signo, ctx) \
+  (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx))
diff --git a/sysdeps/unix/sysv/linux/arm/sigcontextinfo.h b/sysdeps/unix/sysv/linux/arm/sigcontextinfo.h
index 1aaca1e155..cc8f2f765c 100644
--- a/sysdeps/unix/sysv/linux/arm/sigcontextinfo.h
+++ b/sysdeps/unix/sysv/linux/arm/sigcontextinfo.h
@@ -31,3 +31,5 @@
 			 ctx.v20.reg.ARM_sp : ctx.v21.arm_sp))
 #define ADVANCE_STACK_FRAME(frm)	\
 			((struct layout *)frm - 1)
+#define CALL_SIGHANDLER(handler, signo, ctx) \
+  (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx))
diff --git a/sysdeps/unix/sysv/linux/i386/sigcontextinfo.h b/sysdeps/unix/sysv/linux/i386/sigcontextinfo.h
index 42c18b22bb..d4ee73cede 100644
--- a/sysdeps/unix/sysv/linux/i386/sigcontextinfo.h
+++ b/sysdeps/unix/sysv/linux/i386/sigcontextinfo.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
 
@@ -22,3 +22,30 @@
 #define GET_PC(ctx)	((void *) ctx.eip)
 #define GET_FRAME(ctx)	((void *) ctx.ebp)
 #define GET_STACK(ctx)	((void *) ctx.esp_at_signal)
+#define CALL_SIGHANDLER(handler, signo, ctx) \
+do {									      \
+  int __tmp1, __tmp2, __tmp3, __tmp4;					      \
+  __asm __volatile ("movl\t%%esp, %%edi\n\t"				      \
+		    "andl\t$-16, %%esp\n\t"				      \
+		    "subl\t%8, %%esp\n\t"				      \
+		    "movl\t%%edi, %c8-4(%%esp)\n\t"			      \
+		    "movl\t%1, 0(%%esp)\n\t"				      \
+		    "leal\t4(%%esp), %%edi\n\t"				      \
+		    "cld\n\t"						      \
+		    "rep\tmovsl\n\t"					      \
+		    "call\t*%0\n\t"					      \
+		    "cld\n\t"						      \
+		    "movl\t%9, %%ecx\n\t"				      \
+		    "subl\t%%edi, %%esi\n\t"				      \
+		    "leal\t4(%%esp,%%esi,1), %%edi\n\t"			      \
+		    "leal\t4(%%esp), %%esi\n\t"				      \
+		    "rep\tmovsl\n\t"					      \
+		    "movl\t%c8-4(%%esp), %%esp\n\t"			      \
+		    : "=a" (__tmp1), "=d" (__tmp2), "=S" (__tmp3),	      \
+		      "=c" (__tmp4)					      \
+		    : "0" (handler), "1" (signo), "2" (&ctx),		      \
+		      "3" (sizeof (struct sigcontext) / 4),		      \
+		      "n" ((sizeof (struct sigcontext) + 19) & ~15),	      \
+		      "i" (sizeof (struct sigcontext) / 4)		      \
+		    : "cc", "edi");					      \
+} while (0)
diff --git a/sysdeps/unix/sysv/linux/m68k/sigcontextinfo.h b/sysdeps/unix/sysv/linux/m68k/sigcontextinfo.h
index 86bf934c51..b7e6f375e5 100644
--- a/sysdeps/unix/sysv/linux/m68k/sigcontextinfo.h
+++ b/sysdeps/unix/sysv/linux/m68k/sigcontextinfo.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>, 1998.
 
@@ -22,3 +22,5 @@
 #define GET_PC(ctx)	((void *) (ctx)->sc_pc)
 #define GET_FRAME(ctx)	((void *) __builtin_frame_address (1))
 #define GET_STACK(ctx)	((void *) (ctx)->sc_usp)
+#define CALL_SIGHANDLER(handler, signo, ctx) \
+  (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx))
diff --git a/sysdeps/unix/sysv/linux/mips/sigcontextinfo.h b/sysdeps/unix/sysv/linux/mips/sigcontextinfo.h
index 1b67ce39af..36d57dcabf 100644
--- a/sysdeps/unix/sysv/linux/mips/sigcontextinfo.h
+++ b/sysdeps/unix/sysv/linux/mips/sigcontextinfo.h
@@ -23,3 +23,5 @@
 #define GET_PC(ctx)	((void *) ctx->sc_pc)
 #define GET_FRAME(ctx)	((void *) ctx->sc_regs[30])
 #define GET_STACK(ctx)	((void *) ctx->sc_regs[29])
+#define CALL_SIGHANDLER(handler, signo, ctx) \
+  (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx))
diff --git a/sysdeps/unix/sysv/linux/powerpc/sigcontextinfo.h b/sysdeps/unix/sysv/linux/powerpc/sigcontextinfo.h
index 644a0c259b..5a077e40e7 100644
--- a/sysdeps/unix/sysv/linux/powerpc/sigcontextinfo.h
+++ b/sysdeps/unix/sysv/linux/powerpc/sigcontextinfo.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 1999, 2001 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
@@ -23,3 +23,5 @@
 #define GET_PC(ctx)	((void *)((ctx)->regs->nip))
 #define GET_FRAME(ctx)	(*(void **)((ctx)->regs->gpr[1]))
 #define GET_STACK(ctx)	((void *)((ctx)->regs->gpr[1]))
+#define CALL_SIGHANDLER(handler, signo, ctx) \
+  (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx))
diff --git a/sysdeps/unix/sysv/linux/s390/sigcontextinfo.h b/sysdeps/unix/sysv/linux/s390/sigcontextinfo.h
index ccd5a41354..47985b4724 100644
--- a/sysdeps/unix/sysv/linux/s390/sigcontextinfo.h
+++ b/sysdeps/unix/sysv/linux/s390/sigcontextinfo.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2001 Free Software Foundation, Inc.
    Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
    This file is part of the GNU C Library.
 
@@ -24,3 +24,5 @@
 #define GET_PC(ctx)	((void *)((ctx)->sregs->regs.psw.addr))
 #define GET_FRAME(ctx)	(*(void **)((ctx)->sregs->regs.gprs[11]))
 #define GET_STACK(ctx)	((void *)((ctx)->sregs->regs.gprs[15]))
+#define CALL_SIGHANDLER(handler, signo, ctx) \
+  (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx))
diff --git a/sysdeps/unix/sysv/linux/sh/sigcontextinfo.h b/sysdeps/unix/sysv/linux/sh/sigcontextinfo.h
index f35322fef0..6a97cdab05 100644
--- a/sysdeps/unix/sysv/linux/sh/sigcontextinfo.h
+++ b/sysdeps/unix/sysv/linux/sh/sigcontextinfo.h
@@ -23,3 +23,5 @@
 #define GET_PC(ctx)	((void *) ctx.sc_pc)
 #define GET_FRAME(ctx)	((void *) ctx.sc_regs[14])
 #define GET_STACK(ctx)	((void *) ctx.sc_regs[15])
+#define CALL_SIGHANDLER(handler, signo, ctx) \
+  (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx))
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/sigcontextinfo.h b/sysdeps/unix/sysv/linux/sparc/sparc32/sigcontextinfo.h
index 9c6b924319..0ce30b6470 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/sigcontextinfo.h
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/sigcontextinfo.h
@@ -25,3 +25,5 @@
 
 #define GET_STACK(__ctx)	((void *) (__ctx)->si_regs.u_regs[14])
 #define GET_FRAME(__ctx)	ADVANCE_STACK_FRAME (GET_STACK(__ctx))
+#define CALL_SIGHANDLER(handler, signo, ctx) \
+  (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx))
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/sigcontextinfo.h b/sysdeps/unix/sysv/linux/sparc/sparc64/sigcontextinfo.h
index 2bb563cc81..f645c4e387 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/sigcontextinfo.h
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/sigcontextinfo.h
@@ -28,3 +28,5 @@
 					   + STACK_BIAS))+14))
 #define GET_STACK(__ctx)	((void *) ((__ctx)->sigc_regs.u_regs[14]))
 #define GET_FRAME(__ctx)	ADVANCE_STACK_FRAME (GET_STACK (__ctx))
+#define CALL_SIGHANDLER(handler, signo, ctx) \
+  (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx))