[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 090/108] linux-user: Fix clock_nanosleep
From: |
Richard Henderson |
Subject: |
[Qemu-devel] [PATCH v2 090/108] linux-user: Fix clock_nanosleep |
Date: |
Sat, 9 Jun 2018 17:02:02 -1000 |
When we switched from using clock_nanosleep to safe_clock_nanosleep,
we changed from the user-level API to the kernel-level ABI. These
have different senses of the errno value.
The special handling for PowerPC is not requied while we're following
the kernel ABI.
Fixes: 9e518226f43
Signed-off-by: Richard Henderson <address@hidden>
---
linux-user/syscall.c | 24 +++++++++++++-----------
1 file changed, 13 insertions(+), 11 deletions(-)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 6f19f75c67..1c1e05dc26 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -7884,18 +7884,20 @@ IMPL(clock_nanosleep)
struct timespec ts;
abi_long ret;
- target_to_host_timespec(&ts, arg3);
- ret = get_errno(safe_clock_nanosleep(arg1, arg2, &ts, arg4 ? &ts : NULL));
- if (arg4) {
- host_to_target_timespec(arg4, &ts);
+ /* Note that while the user-level api for clock_nanosleep
+ * returns a positive errno values, the kernel-level api
+ * continues to return negative errno values. Also note
+ * that safe_clock_nanosleep mirrors the kernel api.
+ */
+ ret = target_to_host_timespec(&ts, arg3);
+ if (ret == 0) {
+ ret = safe_clock_nanosleep(arg1, arg2, &ts, arg4 ? &ts : NULL);
+ if (ret) {
+ ret = -host_to_target_errno(-ret);
+ } else if (arg4) {
+ ret = host_to_target_timespec(arg4, &ts);
+ }
}
-#if defined(TARGET_PPC)
- /* clock_nanosleep is odd in that it returns positive errno values.
- * On PPC, CR0 bit 3 should be set in such a situation. */
- if (ret && ret != -TARGET_ERESTARTSYS) {
- ((CPUPPCState *)cpu_env)->crf[0] |= 1;
- }
-#endif
return ret;
}
--
2.17.1
- [Qemu-devel] [PATCH v2 080/108] linux-user: Split out fchown32, getgroups32, setgroups32, (continued)
- [Qemu-devel] [PATCH v2 080/108] linux-user: Split out fchown32, getgroups32, setgroups32, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 078/108] linux-user: Split out osf_getsysinfo, osf_setsysinfo, osf_sigprocmask, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 081/108] linux-user: Split out getresgid32, getresuid32, setresgid32, setresuid32, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 082/108] linux-user: Split out chown32, setfsgid32, setfsuid32, setgid32, setuid32, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 083/108] linux-user: Split out mincore, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 084/108] linux-user: Split out fadvise64, fadvise64_64, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 085/108] linux-user: Split out cacheflush, fcntl64, getpagesize, madvise, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 086/108] linux-user: Split out gettid, readahead, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 087/108] linux-user: Split out xattr syscalls, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 089/108] linux-user: Split out clock syscalls, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 090/108] linux-user: Fix clock_nanosleep,
Richard Henderson <=
- [Qemu-devel] [PATCH v2 088/108] linux-user: Split out getdomainname, get_thread_area, set_thread_area, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 091/108] linux-user: Split out set_tid_address, tgkill, tkill, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 092/108] linux-user: Split out futex, utimensat, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 093/108] linux-user: Remove sys_futex, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 094/108] linux-user: Split out inotify syscalls, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 095/108] linux-user: Split out mq syscalls, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 096/108] linux-user: Split out splice, tee, vmsplice, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 097/108] linux-user: Split out eventfd, eventfd2, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 099/108] linux-user: Split out signalfd, signalfd4, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 098/108] linux-user: Split out fallocate, sync_file_range/2, Richard Henderson, 2018/06/09