Commit 1d9d8b551dba064006f730dbe29a28124dd58418
1 parent
aaf4ad39
Translate signal values in exit status.
Signed-off-by: Paul Brook <paul@codesourcery.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@7131 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
18 additions
and
2 deletions
linux-user/qemu.h
... | ... | @@ -201,6 +201,7 @@ int queue_signal(CPUState *env, int sig, target_siginfo_t *info); |
201 | 201 | void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info); |
202 | 202 | void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo); |
203 | 203 | int target_to_host_signal(int sig); |
204 | +int host_to_target_signal(int sig); | |
204 | 205 | long do_sigreturn(CPUState *env); |
205 | 206 | long do_rt_sigreturn(CPUState *env); |
206 | 207 | abi_long do_sigaltstack(abi_ulong uss_addr, abi_ulong uoss_addr, abi_ulong sp); | ... | ... |
linux-user/signal.c
linux-user/syscall.c
... | ... | @@ -3643,6 +3643,20 @@ static int do_futex(target_ulong uaddr, int op, int val, target_ulong timeout, |
3643 | 3643 | } |
3644 | 3644 | #endif |
3645 | 3645 | |
3646 | +/* Map host to target signal numbers for the wait family of syscalls. | |
3647 | + Assume all other status bits are the same. */ | |
3648 | +static int host_to_target_waitstatus(int status) | |
3649 | +{ | |
3650 | + if (WIFSIGNALED(status)) { | |
3651 | + return host_to_target_signal(WTERMSIG(status)) | (status & ~0x7f); | |
3652 | + } | |
3653 | + if (WIFSTOPPED(status)) { | |
3654 | + return (host_to_target_signal(WSTOPSIG(status)) << 8) | |
3655 | + | (status & 0xff); | |
3656 | + } | |
3657 | + return status; | |
3658 | +} | |
3659 | + | |
3646 | 3660 | int get_osversion(void) |
3647 | 3661 | { |
3648 | 3662 | static int osversion; |
... | ... | @@ -3786,7 +3800,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, |
3786 | 3800 | int status; |
3787 | 3801 | ret = get_errno(waitpid(arg1, &status, arg3)); |
3788 | 3802 | if (!is_error(ret) && arg2 |
3789 | - && put_user_s32(status, arg2)) | |
3803 | + && put_user_s32(host_to_target_waitstatus(status), arg2)) | |
3790 | 3804 | goto efault; |
3791 | 3805 | } |
3792 | 3806 | break; |
... | ... | @@ -5136,6 +5150,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, |
5136 | 5150 | ret = get_errno(wait4(arg1, &status, arg3, rusage_ptr)); |
5137 | 5151 | if (!is_error(ret)) { |
5138 | 5152 | if (status_ptr) { |
5153 | + status = host_to_target_waitstatus(status); | |
5139 | 5154 | if (put_user_s32(status, status_ptr)) |
5140 | 5155 | goto efault; |
5141 | 5156 | } | ... | ... |