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

czankel at uclibc.org czankel at uclibc.org
Wed Feb 20 00:30:55 UTC 2008


Author: czankel
Date: 2008-02-19 16:30:54 -0800 (Tue, 19 Feb 2008)
New Revision: 21072

Log:
Xtensa: Provide an architecture specific sigaction and sa_restorer function in libc to avoid having to place executable code on stack.

Signed-off-by: Chris Zankel <chris at zankel.net>


Added:
   trunk/uClibc/libc/sysdeps/linux/xtensa/sigaction.c
   trunk/uClibc/libc/sysdeps/linux/xtensa/sigrestorer.S

Modified:
   trunk/uClibc/libc/sysdeps/linux/xtensa/Makefile.arch


Changeset:
Modified: trunk/uClibc/libc/sysdeps/linux/xtensa/Makefile.arch
===================================================================
--- trunk/uClibc/libc/sysdeps/linux/xtensa/Makefile.arch	2008-02-19 23:42:22 UTC (rev 21071)
+++ trunk/uClibc/libc/sysdeps/linux/xtensa/Makefile.arch	2008-02-20 00:30:54 UTC (rev 21072)
@@ -1,14 +1,14 @@
 # Makefile for uClibc
 #
-# Copyright (C) 2007 Tensilica Inc.
+# Copyright (C) 2007, 2008 Tensilica Inc.
 #
 # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
 #
 
 CSRC := brk.c fork.c posix_fadvise.c posix_fadvise64.c pread_write.c \
-     	__syscall_error.c
+     	sigaction.c __syscall_error.c
 
 SSRC := bsd-_setjmp.S bsd-setjmp.S setjmp.S clone.S \
-	syscall.S mmap.S windowspill.S __longjmp.S vfork.S
+	sigrestorer.S syscall.S mmap.S windowspill.S __longjmp.S vfork.S
 
 include $(top_srcdir)libc/sysdeps/linux/Makefile.commonarch

Added: trunk/uClibc/libc/sysdeps/linux/xtensa/sigaction.c
===================================================================
--- trunk/uClibc/libc/sysdeps/linux/xtensa/sigaction.c	                        (rev 0)
+++ trunk/uClibc/libc/sysdeps/linux/xtensa/sigaction.c	2008-02-20 00:30:54 UTC (rev 21072)
@@ -0,0 +1,59 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * sigaction() for Xtensa uClibc
+ *
+ * Copyright (C) 2007, 2008 Tensilica Inc.
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */ 
+
+#include <errno.h>
+#include <signal.h>
+#include <sys/syscall.h>
+#include <string.h>
+#include <bits/kernel_sigaction.h>
+
+#define SA_RESTORER	0x04000000	
+
+extern void __default_sa_restorer (void);
+
+libc_hidden_proto(memcpy)
+
+int __libc_sigaction (int signum, const struct sigaction *act, 
+					  struct sigaction *oldact)
+{
+	struct kernel_sigaction kact, koldact;
+	int result;
+
+	if (act) {
+		kact.k_sa_handler = act->sa_handler;
+		memcpy(&kact.sa_mask, &act->sa_mask, sizeof (kact.sa_mask));
+		kact.sa_flags = act->sa_flags;
+
+		if (kact.sa_flags & SA_RESTORER) {
+			kact.sa_restorer = act->sa_restorer;
+		} else {
+			kact.sa_restorer = __default_sa_restorer;
+			kact.sa_flags |= SA_RESTORER;
+		}
+	}
+
+	result = __syscall_rt_sigaction(signum, act ? __ptrvalue (&kact) : NULL,
+									oldact ? __ptrvalue (&koldact) : NULL,
+									_NSIG / 8);
+
+	if (oldact && result >= 0) {
+		oldact->sa_handler = koldact.k_sa_handler;
+		memcpy(&oldact->sa_mask, &koldact.sa_mask, sizeof(oldact->sa_mask));
+		oldact->sa_flags = koldact.sa_flags;
+		oldact->sa_restorer = koldact.sa_restorer;
+	}
+
+	return result;
+}
+
+#ifndef LIBC_SIGACTION
+libc_hidden_proto (sigaction)
+weak_alias (__libc_sigaction, sigaction)
+libc_hidden_weak (sigaction)
+#endif

Added: trunk/uClibc/libc/sysdeps/linux/xtensa/sigrestorer.S
===================================================================
--- trunk/uClibc/libc/sysdeps/linux/xtensa/sigrestorer.S	                        (rev 0)
+++ trunk/uClibc/libc/sysdeps/linux/xtensa/sigrestorer.S	2008-02-20 00:30:54 UTC (rev 21072)
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2008 Tensilica Inc.
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */ 
+
+#include <sys/syscall.h>
+
+#if __NR_rt_sigreturn > 255
+# error value of __NR_rt_sigreturn is too big!
+#endif
+
+	.text
+	.align	4
+	.global	__default_sa_restorer
+	.type	__default_sa_restorer, @function
+__default_sa_restorer:
+	movi	a2, __NR_rt_sigreturn
+	syscall




More information about the uClibc-cvs mailing list