From bda825012e189a6dfcae0f0bd761ebe0e20b93f4 Mon Sep 17 00:00:00 2001
From: Alexander Paramonov <widgetcartman@gmail.com>
Date: Mon, 21 Mar 2011 16:49:23 +0100
Subject: [PATCH 2/2] linux-user: Both uClibc and gLibc use 32 and 33 signals and conflict.
Signed-off-by: Alexander Paramonov <widgetcartman@gmail.com>
Signed-off-by: Laurent Vivier <Laurent@Vivier.EU>
---
linux-user/signal.c | 2 ++
linux-user/syscall.c | 7 +++++++
2 files changed, 9 insertions(+), 0 deletions(-)
@@ -314,6 +314,8 @@ void signal_init(void)
for(i = 1; i < _NSIG; i++) {
if (host_to_target_signal_table[i] == 0)
host_to_target_signal_table[i] = i;
+ if (i >= SIGRTMIN && i <= SIGRTMAX)
+ host_to_target_signal_table[i] = __SIGRTMIN + (i - SIGRTMIN);
}
for(i = 1; i < _NSIG; i++) {
j = host_to_target_signal_table[i];
@@ -91,6 +91,7 @@ int __clone2(int (*fn)(void *), void *child_stack_base,
#endif
#include <linux/fb.h>
#include <linux/vt.h>
+#include <bits/signum.h>
#include "linux_loop.h"
#include "cpu-uname.h"
@@ -3845,6 +3846,12 @@ static int do_fork(CPUState *env, unsigned int flags, abi_ulong newsp,
#ifdef __ia64__
ret = __clone2(clone_func, new_stack, NEW_STACK_SIZE, flags, new_env);
#else
+ unsigned int clone_sig = flags & CSIGNAL;
+ if (clone_sig >= __SIGRTMIN && clone_sig <= __SIGRTMIN+2)
+ {
+ flags &= ~CSIGNAL;
+ flags |= SIGRTMIN + (clone_sig - __SIGRTMIN);
+ }
ret = clone(clone_func, new_stack + NEW_STACK_SIZE, flags, new_env);
#endif
#endif
--
1.7.1