--- uClinux-dist-patch/linux-2.6.x/arch/m68knommu/kernel/signal.c	2006-10-11 03:07:41.000000000 -0400
+++ uClinux-dist-bsp/linux-2.6.x/arch/m68knommu/kernel/signal.c	2007-09-10 10:37:39.000000000 -0400
@@ -51,6 +51,9 @@
 
 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
 
+extern void ret_from_user_signal(void);
+extern void ret_from_user_rt_signal(void);
+
 asmlinkage int do_signal(sigset_t *oldset, struct pt_regs *regs);
 
 /*
@@ -586,16 +589,11 @@
 	err |= copy_to_user (&frame->sc, &context, sizeof(context));
 
 	/* Set up to return from userspace.  */
-	err |= __put_user(frame->retcode, &frame->pretcode);
-	/* moveq #,d0; trap #0 */
-	err |= __put_user(0x70004e40 + (__NR_sigreturn << 16),
-			  (long *)(frame->retcode));
+	err |= __put_user((void *) ret_from_user_signal, &frame->pretcode);
 
 	if (err)
 		goto give_sigsegv;
 
-	push_cache ((unsigned long) &frame->retcode);
-
 	/* Set up registers for signal handler */
 	wrusp ((unsigned long) frame);
 	regs->pc = (unsigned long) ka->sa.sa_handler;
@@ -655,17 +653,11 @@
 	err |= copy_to_user (&frame->uc.uc_sigmask, set, sizeof(*set));
 
 	/* Set up to return from userspace.  */
-	err |= __put_user(frame->retcode, &frame->pretcode);
-	/* moveq #,d0; notb d0; trap #0 */
-	err |= __put_user(0x70004600 + ((__NR_rt_sigreturn ^ 0xff) << 16),
-			  (long *)(frame->retcode + 0));
-	err |= __put_user(0x4e40, (short *)(frame->retcode + 4));
+	err |= __put_user((void *) ret_from_user_rt_signal, &frame->pretcode);
 
 	if (err)
 		goto give_sigsegv;
 
-	push_cache ((unsigned long) &frame->retcode);
-
 	/* Set up registers for signal handler */
 	wrusp ((unsigned long) frame);
 	regs->pc = (unsigned long) ka->sa.sa_handler;
--- uClinux-dist-patch/linux-2.6.x/arch/m68knommu/kernel/entry.S	2006-10-11 03:07:41.000000000 -0400
+++ uClinux-dist-bsp/linux-2.6.x/arch/m68knommu/kernel/entry.S	2007-09-10 10:38:33.000000000 -0400
@@ -32,6 +32,7 @@
 #include <asm/segment.h>
 #include <asm/asm-offsets.h>
 #include <asm/entry.h>
+#include <asm/unistd.h>
 
 .text
 
@@ -42,6 +43,17 @@
 .globl sys_fork
 .globl sys_clone
 .globl sys_vfork
+.globl ret_from_user_signal
+.globl ret_from_user_rt_signal
+
+ret_from_user_signal:
+	moveq #__NR_sigreturn,%d0
+	trap #0
+
+ret_from_user_rt_signal:
+	moveq #82,%d0   /* __NR_rt_sigreturn ^ 0xff = 82 */
+	not.l %d0
+	trap #0
 
 ENTRY(buserr)
 	SAVE_ALL
