diff --git a/linux-user/qemu.h b/linux-user/qemu.h index 5106d4526ddb1b22ed7b7b15f7c9a8e544526f34..cc44c9a19a87dfb80e5c0cf04ea5533caf949c3a 100644 --- a/linux-user/qemu.h +++ b/linux-user/qemu.h @@ -187,6 +187,7 @@ void signal_init(void); int queue_signal(int sig, target_siginfo_t *info); void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info); void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo); +int target_to_host_signal(int sig); long do_sigreturn(CPUState *env); long do_rt_sigreturn(CPUState *env); abi_long do_sigaltstack(abi_ulong uss_addr, abi_ulong uoss_addr, abi_ulong sp); diff --git a/linux-user/signal.c b/linux-user/signal.c index ef9b7356c2802e43c1fe0e6aee098a2607432edc..c3b0cde3b96b90e6ec3ac6471a7632a5ecadb17a 100644 --- a/linux-user/signal.c +++ b/linux-user/signal.c @@ -113,11 +113,15 @@ static inline int sas_ss_flags(unsigned long sp) static inline int host_to_target_signal(int sig) { + if (sig > 64) + return sig; return host_to_target_signal_table[sig]; } -static inline int target_to_host_signal(int sig) +int target_to_host_signal(int sig) { + if (sig > 64) + return sig; return target_to_host_signal_table[sig]; } diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 3c39e9f82cd0001dacf614e287cebaee10abf1a9..7548ea79592b53fe7f5826708d4ab45057d7246e 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -3488,7 +3488,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, ret = 0; break; case TARGET_NR_kill: - ret = get_errno(kill(arg1, arg2)); + ret = get_errno(kill(arg1, target_to_host_signal(arg2))); break; case TARGET_NR_rename: { @@ -5583,13 +5583,14 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, #if defined(TARGET_NR_tkill) && defined(__NR_tkill) case TARGET_NR_tkill: - ret = get_errno(sys_tkill((int)arg1, (int)arg2)); + ret = get_errno(sys_tkill((int)arg1, target_to_host_signal(arg2))); break; #endif #if defined(TARGET_NR_tgkill) && defined(__NR_tgkill) case TARGET_NR_tgkill: - ret = get_errno(sys_tgkill((int)arg1, (int)arg2, (int)arg3)); + ret = get_errno(sys_tgkill((int)arg1, (int)arg2, + target_to_host_signal(arg3))); break; #endif