diff options
author | pbrook <pbrook@c046a42c-6fe2-441c-8c8c-71466251a162> | 2008-05-30 18:05:19 +0000 |
---|---|---|
committer | pbrook <pbrook@c046a42c-6fe2-441c-8c8c-71466251a162> | 2008-05-30 18:05:19 +0000 |
commit | 4cb05961c2d637d2cad237755e544d725a941b9a (patch) | |
tree | 845e59aad9360c381459d90439ffc57ee3f06b19 /linux-user | |
parent | f8ed7070ea2f314f63e54ddf73eb5e071cf00327 (diff) |
Perform target->host signal mapping for *kill syscalls.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4625 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'linux-user')
-rw-r--r-- | linux-user/qemu.h | 1 | ||||
-rw-r--r-- | linux-user/signal.c | 6 | ||||
-rw-r--r-- | linux-user/syscall.c | 7 |
3 files changed, 10 insertions, 4 deletions
diff --git a/linux-user/qemu.h b/linux-user/qemu.h index 5106d4526..cc44c9a19 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 ef9b7356c..c3b0cde3b 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 3c39e9f82..7548ea795 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 |