svn commit: trunk/uClibc: libc/sysdeps/linux/alpha

vapier at uclibc.org vapier at uclibc.org
Tue Feb 28 05:31:59 UTC 2006


Author: vapier
Date: 2006-02-27 21:31:57 -0800 (Mon, 27 Feb 2006)
New Revision: 14348

Log:
import rt_sigaction from glibc to fix alpha signal handling issues

Added:
   trunk/uClibc/libc/sysdeps/linux/alpha/rt_sigaction.S

Modified:
   trunk/uClibc/TODO
   trunk/uClibc/libc/sysdeps/linux/alpha/Makefile.arch


Changeset:
Modified: trunk/uClibc/TODO
===================================================================
--- trunk/uClibc/TODO	2006-02-28 05:26:13 UTC (rev 14347)
+++ trunk/uClibc/TODO	2006-02-28 05:31:57 UTC (rev 14348)
@@ -31,6 +31,7 @@
 
 TODO list for the uClibc 1.0.0 release:
 -------------------------------------------------
+    *) glob / fnmatch tests fail
     *) Finish hiding uClibc internal symbols from our exported namespace.
     *) Explicity add some sortof CONFIG_LINUX_2_2_ABI, CONFIG_LINUX_2_4_ABI
 	and CONFIG_LINUX_2_6_ABI type options, rather than having the abi
@@ -95,10 +96,7 @@
 Arch specific TODO:
 -------------------------------------------------
   alpha:
-    signal handling is all screwed; common linux versions do not work for us,
-       need to import all the stuff from glibc ...
-    _init/_fini hangs signal-ed (assert test)
-    output from cloned children seems funky (unistd/clone test)
+    
     ldso is not implemented
   arm:
     update crt1 code again for nommu (http://bugs.uclibc.org/view.php?id=538)

Modified: trunk/uClibc/libc/sysdeps/linux/alpha/Makefile.arch
===================================================================
--- trunk/uClibc/libc/sysdeps/linux/alpha/Makefile.arch	2006-02-28 05:26:13 UTC (rev 14347)
+++ trunk/uClibc/libc/sysdeps/linux/alpha/Makefile.arch	2006-02-28 05:31:57 UTC (rev 14348)
@@ -9,6 +9,6 @@
 
 SSRC := \
 	__longjmp.S brk.S bsd-_setjmp.S bsd-setjmp.S clone.S \
-	divl.S divq.S reml.S remq.S setjmp.S syscall.S
+	divl.S divq.S reml.S remq.S rt_sigaction.S setjmp.S syscall.S
 
 include $(top_srcdir)libc/sysdeps/linux/Makefile.commonarch

Added: trunk/uClibc/libc/sysdeps/linux/alpha/rt_sigaction.S
===================================================================
--- trunk/uClibc/libc/sysdeps/linux/alpha/rt_sigaction.S	2006-02-28 05:26:13 UTC (rev 14347)
+++ trunk/uClibc/libc/sysdeps/linux/alpha/rt_sigaction.S	2006-02-28 05:31:57 UTC (rev 14348)
@@ -0,0 +1,82 @@
+/* Copyright (C) 1998, 2003, 2004 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson <rth at cygnus.com>, 1998
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <features.h>
+#include <sys/syscall.h>
+#include <asm/regdef.h>
+#include <asm/pal.h>
+
+/* On Alpha we desparately want to avoid having to issue an imb.  Ordinarily
+   the kernel would have to issue one after setting up the signal return
+   stack, but the Linux rt_sigaction syscall is prepared to accept a pointer
+   to the sigreturn syscall, instead of inlining it on the stack.
+
+   This just about halves signal delivery time.  */
+
+	.text
+
+.globl __syscall_rt_sigaction
+.align 4
+.ent __syscall_rt_sigaction, 0
+__syscall_rt_sigaction:
+	.frame	sp,0,ra,0
+	ldgp	gp,0(pv)
+	.prologue 1
+
+	beq	a1, 0f
+	ldl	t0, 8(a1)			# sa_flags
+
+	/* The unwinder will subtract one from the return address when
+	   attempting to find the call instruction that led us here.
+	   Since we didn't get here via a normal call, if we do nothing
+	   we would pick up the wrong symbol and the wrong FDE.  Account
+	   for this by adding a nop to the start of the function and 
+	   then skipping it here by adding 4.  */
+	ldah	a4, __syscall_sigreturn+4(gp)		!gprelhigh
+	ldah	t1, __syscall_rt_sigreturn+4(gp)	!gprelhigh
+	lda	a4, __syscall_sigreturn+4(a4)		!gprellow
+	lda	t1, __syscall_rt_sigreturn+4(t1)	!gprellow
+	and	t0, 0x40, t0				# SA_SIGINFO
+	cmovne	t0, t1, a4
+
+0:	ldi	v0, __NR_rt_sigaction
+	callsys
+	bne	a3, $error
+	ret
+
+$error:
+	jmp	zero,__syscall_error
+
+.end __syscall_rt_sigaction
+
+__syscall_sigreturn:
+	nop
+	mov	sp, a0
+	ldi	v0, __NR_sigreturn
+	callsys
+	.size	__syscall_sigreturn, .-__syscall_sigreturn
+	.type	__syscall_sigreturn, @function
+
+__syscall_rt_sigreturn:
+	nop
+	mov	sp,a0
+	ldi	v0,__NR_rt_sigreturn
+	callsys
+	.size	__syscall_rt_sigreturn, .-__syscall_rt_sigreturn
+	.type	__syscall_rt_sigreturn, @function




More information about the uClibc-cvs mailing list