qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [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).