* [PATCH v2 0/2] linux-user: fix clock_nanosleep()
@ 2020-07-22 17:46 Laurent Vivier
2020-07-22 17:46 ` [PATCH v2 1/2] " Laurent Vivier
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Laurent Vivier @ 2020-07-22 17:46 UTC (permalink / raw)
To: qemu-devel
Cc: Thomas Huth, Alex Bennée, Philippe Mathieu-Daudé,
Laurent Vivier
Update the "remain" time only if errno is EINTR and flags is TIMER_ABSTIME.
The v2 restores the get_errno() as our safe_clock_nanosleep() uses
errno to return the error value (and not ret).
As we use errno, we don't need the special case for ppc here, the CRF
bit is correctly managed in cpu_loop.c if ret is -errno.
Laurent Vivier (2):
linux-user: fix clock_nanosleep()
linux-user,ppc: fix clock_nanosleep() for linux-user-ppc
linux-user/syscall.c | 15 +++++++--------
1 file changed, 7 insertions(+), 8 deletions(-)
--
2.26.2
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v2 1/2] linux-user: fix clock_nanosleep()
2020-07-22 17:46 [PATCH v2 0/2] linux-user: fix clock_nanosleep() Laurent Vivier
@ 2020-07-22 17:46 ` Laurent Vivier
2020-07-22 17:46 ` [PATCH v2 2/2] linux-user, ppc: fix clock_nanosleep() for linux-user-ppc Laurent Vivier
2020-07-23 13:17 ` [PATCH v2 0/2] linux-user: fix clock_nanosleep() Alex Bennée
2 siblings, 0 replies; 4+ messages in thread
From: Laurent Vivier @ 2020-07-22 17:46 UTC (permalink / raw)
To: qemu-devel
Cc: Thomas Huth, Alex Bennée, Philippe Mathieu-Daudé,
Laurent Vivier
If the call is interrupted by a signal handler, it fails with error EINTR
and if "remain" is not NULL and "flags" is not TIMER_ABSTIME, it returns
the remaining unslept time in "remain".
Update linux-user to not overwrite the "remain" structure if there is no
error.
Found with "make check-tcg", linux-test fails on nanosleep test:
TEST linux-test on x86_64
.../tests/tcg/multiarch/linux-test.c:242: nanosleep
Reported-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
---
Notes:
v2: safe_clock_nanosleep() returns -1 and update errno,
so we need get_errno()
linux-user/syscall.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 1211e759c26c..43a6e283961b 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -11831,8 +11831,14 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
target_to_host_timespec(&ts, arg3);
ret = get_errno(safe_clock_nanosleep(arg1, arg2,
&ts, arg4 ? &ts : NULL));
- if (arg4)
+ /*
+ * if the call is interrupted by a signal handler, it fails
+ * with error -TARGET_EINTR and if arg4 is not NULL and arg2 is not
+ * TIMER_ABSTIME, it returns the remaining unslept time in arg4.
+ */
+ if (ret == -TARGET_EINTR && arg4 && arg2 != TIMER_ABSTIME) {
host_to_target_timespec(arg4, &ts);
+ }
#if defined(TARGET_PPC)
/* clock_nanosleep is odd in that it returns positive errno values.
--
2.26.2
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v2 2/2] linux-user, ppc: fix clock_nanosleep() for linux-user-ppc
2020-07-22 17:46 [PATCH v2 0/2] linux-user: fix clock_nanosleep() Laurent Vivier
2020-07-22 17:46 ` [PATCH v2 1/2] " Laurent Vivier
@ 2020-07-22 17:46 ` Laurent Vivier
2020-07-23 13:17 ` [PATCH v2 0/2] linux-user: fix clock_nanosleep() Alex Bennée
2 siblings, 0 replies; 4+ messages in thread
From: Laurent Vivier @ 2020-07-22 17:46 UTC (permalink / raw)
To: qemu-devel
Cc: Thomas Huth, Alex Bennée, Philippe Mathieu-Daudé,
Laurent Vivier
Our safe_clock_nanosleep() returns -1 and updates errno.
We don't need to update the CRF bit in syscall.c because it will
be updated in ppc/cpu_loop.c as the return value is negative.
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
---
Notes:
v2: new patch, remove the PPC part as ret is < 0,
CRF will be updated in cpu_loop.c
linux-user/syscall.c | 7 -------
1 file changed, 7 deletions(-)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 43a6e283961b..f5c4f6b95db4 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -11840,13 +11840,6 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
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;
}
#endif
--
2.26.2
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v2 0/2] linux-user: fix clock_nanosleep()
2020-07-22 17:46 [PATCH v2 0/2] linux-user: fix clock_nanosleep() Laurent Vivier
2020-07-22 17:46 ` [PATCH v2 1/2] " Laurent Vivier
2020-07-22 17:46 ` [PATCH v2 2/2] linux-user, ppc: fix clock_nanosleep() for linux-user-ppc Laurent Vivier
@ 2020-07-23 13:17 ` Alex Bennée
2 siblings, 0 replies; 4+ messages in thread
From: Alex Bennée @ 2020-07-23 13:17 UTC (permalink / raw)
To: Laurent Vivier; +Cc: Thomas Huth, qemu-devel, Philippe Mathieu-Daudé
Laurent Vivier <laurent@vivier.eu> writes:
> Update the "remain" time only if errno is EINTR and flags is TIMER_ABSTIME.
>
> The v2 restores the get_errno() as our safe_clock_nanosleep() uses
> errno to return the error value (and not ret).
>
> As we use errno, we don't need the special case for ppc here, the CRF
> bit is correctly managed in cpu_loop.c if ret is -errno.
>
> Laurent Vivier (2):
> linux-user: fix clock_nanosleep()
> linux-user,ppc: fix clock_nanosleep() for linux-user-ppc
>
> linux-user/syscall.c | 15 +++++++--------
> 1 file changed, 7 insertions(+), 8 deletions(-)
Queued to for-5.1/fixes-for-rc1-v3, thanks.
--
Alex Bennée
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2020-07-23 13:18 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-07-22 17:46 [PATCH v2 0/2] linux-user: fix clock_nanosleep() Laurent Vivier
2020-07-22 17:46 ` [PATCH v2 1/2] " Laurent Vivier
2020-07-22 17:46 ` [PATCH v2 2/2] linux-user, ppc: fix clock_nanosleep() for linux-user-ppc Laurent Vivier
2020-07-23 13:17 ` [PATCH v2 0/2] linux-user: fix clock_nanosleep() Alex Bennée
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).