diff mbox series

linux-user: Add translation for argument of msync()

Message ID Y5rMcts4qe15RaVN@p100 (mailing list archive)
State New, archived
Headers show
Series linux-user: Add translation for argument of msync() | expand

Commit Message

Helge Deller Dec. 15, 2022, 7:27 a.m. UTC
msync() uses the flags MS_ASYNC, MS_INVALIDATE and MS_SYNC, which differ
between platforms, specifcally on alpha and hppa.

Add a target to host translation for those and wire up a nicer strace
output.

This fixes the testsuite of the macaulay2 debian package with a hppa-linux
guest on a x86-64 host.

Signed-off-by: Helge Deller <deller@gmx.de>

Comments

Philippe Mathieu-Daudé Dec. 15, 2022, 7:58 a.m. UTC | #1
On 15/12/22 08:27, Helge Deller wrote:
> msync() uses the flags MS_ASYNC, MS_INVALIDATE and MS_SYNC, which differ
> between platforms, specifcally on alpha and hppa.
> 
> Add a target to host translation for those and wire up a nicer strace
> output.
> 
> This fixes the testsuite of the macaulay2 debian package with a hppa-linux
> guest on a x86-64 host.
> 
> Signed-off-by: Helge Deller <deller@gmx.de>
> 
> diff --git a/linux-user/alpha/target_mman.h b/linux-user/alpha/target_mman.h
> index cd6e3d70a6..051544f5ab 100644
> --- a/linux-user/alpha/target_mman.h
> +++ b/linux-user/alpha/target_mman.h
> @@ -3,6 +3,10 @@
> 
>   #define TARGET_MADV_DONTNEED 6
> 
> +#define TARGET_MS_ASYNC 1
> +#define TARGET_MS_SYNC 2
> +#define TARGET_MS_INVALIDATE 4
> +
>   #include "../generic/target_mman.h"
> 
>   #endif
> diff --git a/linux-user/generic/target_mman.h b/linux-user/generic/target_mman.h
> index 1436a3c543..32bf1a52d0 100644
> --- a/linux-user/generic/target_mman.h
> +++ b/linux-user/generic/target_mman.h
> @@ -89,4 +89,17 @@
>   #define TARGET_MADV_DONTNEED_LOCKED 24
>   #endif
> 
> +
> +#ifndef TARGET_MS_ASYNC
> +#define TARGET_MS_ASYNC 1

Hmm don't we want to keep the host flag instead?

    #define TARGET_MS_ASYNC MS_ASYNC

> +#endif
> +
> +#ifndef TARGET_MS_INVALIDATE
> +#define TARGET_MS_INVALIDATE 2

Ditto,

> +#endif
> +
> +#ifndef TARGET_MS_SYNC
> +#define TARGET_MS_SYNC 4

ditto.

LGTM otherwise.

> +#endif
> +
>   #endif
> diff --git a/linux-user/hppa/target_mman.h b/linux-user/hppa/target_mman.h
> index 66dd9f7941..f9b6b97032 100644
> --- a/linux-user/hppa/target_mman.h
> +++ b/linux-user/hppa/target_mman.h
> @@ -10,6 +10,10 @@
>   #define TARGET_MADV_WIPEONFORK 71
>   #define TARGET_MADV_KEEPONFORK 72
> 
> +#define TARGET_MS_SYNC 1
> +#define TARGET_MS_ASYNC 2
> +#define TARGET_MS_INVALIDATE 4
> +
>   #include "../generic/target_mman.h"
> 
>   #endif
> diff --git a/linux-user/strace.list b/linux-user/strace.list
> index a75101fca1..ac8f872371 100644
> --- a/linux-user/strace.list
> +++ b/linux-user/strace.list
> @@ -650,7 +650,7 @@
>   { TARGET_NR_msgsnd, "msgsnd" , NULL, NULL, NULL },
>   #endif
>   #ifdef TARGET_NR_msync
> -{ TARGET_NR_msync, "msync" , NULL, NULL, NULL },
> +{ TARGET_NR_msync, "msync" , "%s(%p,%u,%d)", NULL, NULL },
>   #endif
>   #ifdef TARGET_NR_multiplexer
>   { TARGET_NR_multiplexer, "multiplexer" , NULL, NULL, NULL },
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index d58e9b8d10..e541fbe09a 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -22,6 +22,7 @@
>   #include "qemu/path.h"
>   #include "qemu/memfd.h"
>   #include "qemu/queue.h"
> +#include "target_mman.h"
>   #include <elf.h>
>   #include <endian.h>
>   #include <grp.h>
> @@ -7667,6 +7668,14 @@ static inline int target_to_host_mlockall_arg(int arg)
>   }
>   #endif
> 
> +static inline int target_to_host_msync_arg(abi_long arg)
> +{
> +    return ((arg & TARGET_MS_ASYNC) ? MS_ASYNC : 0) |
> +           ((arg & TARGET_MS_INVALIDATE) ? MS_INVALIDATE : 0) |
> +           ((arg & TARGET_MS_SYNC) ? MS_SYNC : 0) |
> +           (arg & ~(TARGET_MS_ASYNC | TARGET_MS_INVALIDATE | TARGET_MS_SYNC));
> +}
> +
>   #if (defined(TARGET_NR_stat64) || defined(TARGET_NR_lstat64) ||     \
>        defined(TARGET_NR_fstat64) || defined(TARGET_NR_fstatat64) ||  \
>        defined(TARGET_NR_newfstatat))
> @@ -10163,7 +10172,8 @@ static abi_long do_syscall1(CPUArchState *cpu_env, int num, abi_long arg1,
>           /* ??? msync/mlock/munlock are broken for softmmu.  */
>   #ifdef TARGET_NR_msync
>       case TARGET_NR_msync:
> -        return get_errno(msync(g2h(cpu, arg1), arg2, arg3));
> +        return get_errno(msync(g2h(cpu, arg1), arg2,
> +                               target_to_host_msync_arg(arg3)));
>   #endif
>   #ifdef TARGET_NR_mlock
>       case TARGET_NR_mlock:
>
Helge Deller Dec. 15, 2022, 8:15 a.m. UTC | #2
On 12/15/22 08:58, Philippe Mathieu-Daudé wrote:
> On 15/12/22 08:27, Helge Deller wrote:
>> msync() uses the flags MS_ASYNC, MS_INVALIDATE and MS_SYNC, which differ
>> between platforms, specifcally on alpha and hppa.
>>
>> Add a target to host translation for those and wire up a nicer strace
>> output.
>>
>> This fixes the testsuite of the macaulay2 debian package with a hppa-linux
>> guest on a x86-64 host.
>>
>> Signed-off-by: Helge Deller <deller@gmx.de>
>>
>> diff --git a/linux-user/alpha/target_mman.h b/linux-user/alpha/target_mman.h
>> index cd6e3d70a6..051544f5ab 100644
>> --- a/linux-user/alpha/target_mman.h
>> +++ b/linux-user/alpha/target_mman.h
>> @@ -3,6 +3,10 @@
>>
>>   #define TARGET_MADV_DONTNEED 6
>>
>> +#define TARGET_MS_ASYNC 1
>> +#define TARGET_MS_SYNC 2
>> +#define TARGET_MS_INVALIDATE 4
>> +
>>   #include "../generic/target_mman.h"
>>
>>   #endif
>> diff --git a/linux-user/generic/target_mman.h b/linux-user/generic/target_mman.h
>> index 1436a3c543..32bf1a52d0 100644
>> --- a/linux-user/generic/target_mman.h
>> +++ b/linux-user/generic/target_mman.h
>> @@ -89,4 +89,17 @@
>>   #define TARGET_MADV_DONTNEED_LOCKED 24
>>   #endif
>>
>> +
>> +#ifndef TARGET_MS_ASYNC
>> +#define TARGET_MS_ASYNC 1
>
> Hmm don't we want to keep the host flag instead?
>
>     #define TARGET_MS_ASYNC MS_ASYNC

Yes, that would be possible, but the value is the same.
In the <arch>/*h files you usually want to have numerical values
which makes it easier to search for conversion bugs.

I'd prefer to keep it as is, it's done for the other
files/values like that.

Helge


>
>> +#endif
>> +
>> +#ifndef TARGET_MS_INVALIDATE
>> +#define TARGET_MS_INVALIDATE 2
>
> Ditto,
>
>> +#endif
>> +
>> +#ifndef TARGET_MS_SYNC
>> +#define TARGET_MS_SYNC 4
>
> ditto.
>
> LGTM otherwise.
>
>> +#endif
>> +
>>   #endif
>> diff --git a/linux-user/hppa/target_mman.h b/linux-user/hppa/target_mman.h
>> index 66dd9f7941..f9b6b97032 100644
>> --- a/linux-user/hppa/target_mman.h
>> +++ b/linux-user/hppa/target_mman.h
>> @@ -10,6 +10,10 @@
>>   #define TARGET_MADV_WIPEONFORK 71
>>   #define TARGET_MADV_KEEPONFORK 72
>>
>> +#define TARGET_MS_SYNC 1
>> +#define TARGET_MS_ASYNC 2
>> +#define TARGET_MS_INVALIDATE 4
>> +
>>   #include "../generic/target_mman.h"
>>
>>   #endif
>> diff --git a/linux-user/strace.list b/linux-user/strace.list
>> index a75101fca1..ac8f872371 100644
>> --- a/linux-user/strace.list
>> +++ b/linux-user/strace.list
>> @@ -650,7 +650,7 @@
>>   { TARGET_NR_msgsnd, "msgsnd" , NULL, NULL, NULL },
>>   #endif
>>   #ifdef TARGET_NR_msync
>> -{ TARGET_NR_msync, "msync" , NULL, NULL, NULL },
>> +{ TARGET_NR_msync, "msync" , "%s(%p,%u,%d)", NULL, NULL },
>>   #endif
>>   #ifdef TARGET_NR_multiplexer
>>   { TARGET_NR_multiplexer, "multiplexer" , NULL, NULL, NULL },
>> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
>> index d58e9b8d10..e541fbe09a 100644
>> --- a/linux-user/syscall.c
>> +++ b/linux-user/syscall.c
>> @@ -22,6 +22,7 @@
>>   #include "qemu/path.h"
>>   #include "qemu/memfd.h"
>>   #include "qemu/queue.h"
>> +#include "target_mman.h"
>>   #include <elf.h>
>>   #include <endian.h>
>>   #include <grp.h>
>> @@ -7667,6 +7668,14 @@ static inline int target_to_host_mlockall_arg(int arg)
>>   }
>>   #endif
>>
>> +static inline int target_to_host_msync_arg(abi_long arg)
>> +{
>> +    return ((arg & TARGET_MS_ASYNC) ? MS_ASYNC : 0) |
>> +           ((arg & TARGET_MS_INVALIDATE) ? MS_INVALIDATE : 0) |
>> +           ((arg & TARGET_MS_SYNC) ? MS_SYNC : 0) |
>> +           (arg & ~(TARGET_MS_ASYNC | TARGET_MS_INVALIDATE | TARGET_MS_SYNC));
>> +}
>> +
>>   #if (defined(TARGET_NR_stat64) || defined(TARGET_NR_lstat64) ||     \
>>        defined(TARGET_NR_fstat64) || defined(TARGET_NR_fstatat64) ||  \
>>        defined(TARGET_NR_newfstatat))
>> @@ -10163,7 +10172,8 @@ static abi_long do_syscall1(CPUArchState *cpu_env, int num, abi_long arg1,
>>           /* ??? msync/mlock/munlock are broken for softmmu.  */
>>   #ifdef TARGET_NR_msync
>>       case TARGET_NR_msync:
>> -        return get_errno(msync(g2h(cpu, arg1), arg2, arg3));
>> +        return get_errno(msync(g2h(cpu, arg1), arg2,
>> +                               target_to_host_msync_arg(arg3)));
>>   #endif
>>   #ifdef TARGET_NR_mlock
>>       case TARGET_NR_mlock:
>>
>
Richard Henderson Dec. 15, 2022, 3:58 p.m. UTC | #3
On 12/14/22 23:58, Philippe Mathieu-Daudé wrote:
>> --- a/linux-user/alpha/target_mman.h
>> +++ b/linux-user/alpha/target_mman.h
>> @@ -3,6 +3,10 @@
>>
>>   #define TARGET_MADV_DONTNEED 6
>>
>> +#define TARGET_MS_ASYNC 1
>> +#define TARGET_MS_SYNC 2
>> +#define TARGET_MS_INVALIDATE 4
>> +
>>   #include "../generic/target_mman.h"
>>
>>   #endif
>> diff --git a/linux-user/generic/target_mman.h b/linux-user/generic/target_mman.h
>> index 1436a3c543..32bf1a52d0 100644
>> --- a/linux-user/generic/target_mman.h
>> +++ b/linux-user/generic/target_mman.h
>> @@ -89,4 +89,17 @@
>>   #define TARGET_MADV_DONTNEED_LOCKED 24
>>   #endif
>>
>> +
>> +#ifndef TARGET_MS_ASYNC
>> +#define TARGET_MS_ASYNC 1
> 
> Hmm don't we want to keep the host flag instead?
> 
>     #define TARGET_MS_ASYNC MS_ASYNC

No.  What if the host has an odd value, like Alpha.


r~
Philippe Mathieu-Daudé Dec. 15, 2022, 8:58 p.m. UTC | #4
On 15/12/22 16:58, Richard Henderson wrote:
> On 12/14/22 23:58, Philippe Mathieu-Daudé wrote:
>>> --- a/linux-user/alpha/target_mman.h
>>> +++ b/linux-user/alpha/target_mman.h
>>> @@ -3,6 +3,10 @@
>>>
>>>   #define TARGET_MADV_DONTNEED 6
>>>
>>> +#define TARGET_MS_ASYNC 1
>>> +#define TARGET_MS_SYNC 2
>>> +#define TARGET_MS_INVALIDATE 4
>>> +
>>>   #include "../generic/target_mman.h"
>>>
>>>   #endif
>>> diff --git a/linux-user/generic/target_mman.h 
>>> b/linux-user/generic/target_mman.h
>>> index 1436a3c543..32bf1a52d0 100644
>>> --- a/linux-user/generic/target_mman.h
>>> +++ b/linux-user/generic/target_mman.h
>>> @@ -89,4 +89,17 @@
>>>   #define TARGET_MADV_DONTNEED_LOCKED 24
>>>   #endif
>>>
>>> +
>>> +#ifndef TARGET_MS_ASYNC
>>> +#define TARGET_MS_ASYNC 1
>>
>> Hmm don't we want to keep the host flag instead?
>>
>>     #define TARGET_MS_ASYNC MS_ASYNC
> 
> No.  What if the host has an odd value, like Alpha.

But TARGET_MS_ASYNC  would be defined in linux-user/alpha/target_mman.h
so this path won't apply... What am I missing?
Richard Henderson Dec. 15, 2022, 11:23 p.m. UTC | #5
Host!

r~

On Thu, 15 Dec 2022, 12:58 Philippe Mathieu-Daudé, <philmd@linaro.org>
wrote:

> On 15/12/22 16:58, Richard Henderson wrote:
> > On 12/14/22 23:58, Philippe Mathieu-Daudé wrote:
> >>> --- a/linux-user/alpha/target_mman.h
> >>> +++ b/linux-user/alpha/target_mman.h
> >>> @@ -3,6 +3,10 @@
> >>>
> >>>   #define TARGET_MADV_DONTNEED 6
> >>>
> >>> +#define TARGET_MS_ASYNC 1
> >>> +#define TARGET_MS_SYNC 2
> >>> +#define TARGET_MS_INVALIDATE 4
> >>> +
> >>>   #include "../generic/target_mman.h"
> >>>
> >>>   #endif
> >>> diff --git a/linux-user/generic/target_mman.h
> >>> b/linux-user/generic/target_mman.h
> >>> index 1436a3c543..32bf1a52d0 100644
> >>> --- a/linux-user/generic/target_mman.h
> >>> +++ b/linux-user/generic/target_mman.h
> >>> @@ -89,4 +89,17 @@
> >>>   #define TARGET_MADV_DONTNEED_LOCKED 24
> >>>   #endif
> >>>
> >>> +
> >>> +#ifndef TARGET_MS_ASYNC
> >>> +#define TARGET_MS_ASYNC 1
> >>
> >> Hmm don't we want to keep the host flag instead?
> >>
> >>     #define TARGET_MS_ASYNC MS_ASYNC
> >
> > No.  What if the host has an odd value, like Alpha.
>
> But TARGET_MS_ASYNC  would be defined in linux-user/alpha/target_mman.h
> so this path won't apply... What am I missing?
>
Laurent Vivier March 7, 2023, 4:19 p.m. UTC | #6
Le 15/12/2022 à 08:27, Helge Deller a écrit :
> msync() uses the flags MS_ASYNC, MS_INVALIDATE and MS_SYNC, which differ
> between platforms, specifcally on alpha and hppa.
> 
> Add a target to host translation for those and wire up a nicer strace
> output.
> 
> This fixes the testsuite of the macaulay2 debian package with a hppa-linux
> guest on a x86-64 host.
> 
> Signed-off-by: Helge Deller <deller@gmx.de>
> 
> diff --git a/linux-user/alpha/target_mman.h b/linux-user/alpha/target_mman.h
> index cd6e3d70a6..051544f5ab 100644
> --- a/linux-user/alpha/target_mman.h
> +++ b/linux-user/alpha/target_mman.h
> @@ -3,6 +3,10 @@
> 
>   #define TARGET_MADV_DONTNEED 6
> 
> +#define TARGET_MS_ASYNC 1
> +#define TARGET_MS_SYNC 2
> +#define TARGET_MS_INVALIDATE 4
> +
>   #include "../generic/target_mman.h"
> 
>   #endif
> diff --git a/linux-user/generic/target_mman.h b/linux-user/generic/target_mman.h
> index 1436a3c543..32bf1a52d0 100644
> --- a/linux-user/generic/target_mman.h
> +++ b/linux-user/generic/target_mman.h
> @@ -89,4 +89,17 @@
>   #define TARGET_MADV_DONTNEED_LOCKED 24
>   #endif
> 
> +
> +#ifndef TARGET_MS_ASYNC
> +#define TARGET_MS_ASYNC 1
> +#endif
> +
> +#ifndef TARGET_MS_INVALIDATE
> +#define TARGET_MS_INVALIDATE 2
> +#endif
> +
> +#ifndef TARGET_MS_SYNC
> +#define TARGET_MS_SYNC 4
> +#endif
> +
>   #endif
> diff --git a/linux-user/hppa/target_mman.h b/linux-user/hppa/target_mman.h
> index 66dd9f7941..f9b6b97032 100644
> --- a/linux-user/hppa/target_mman.h
> +++ b/linux-user/hppa/target_mman.h
> @@ -10,6 +10,10 @@
>   #define TARGET_MADV_WIPEONFORK 71
>   #define TARGET_MADV_KEEPONFORK 72
> 
> +#define TARGET_MS_SYNC 1
> +#define TARGET_MS_ASYNC 2
> +#define TARGET_MS_INVALIDATE 4
> +
>   #include "../generic/target_mman.h"
> 
>   #endif
> diff --git a/linux-user/strace.list b/linux-user/strace.list
> index a75101fca1..ac8f872371 100644
> --- a/linux-user/strace.list
> +++ b/linux-user/strace.list
> @@ -650,7 +650,7 @@
>   { TARGET_NR_msgsnd, "msgsnd" , NULL, NULL, NULL },
>   #endif
>   #ifdef TARGET_NR_msync
> -{ TARGET_NR_msync, "msync" , NULL, NULL, NULL },
> +{ TARGET_NR_msync, "msync" , "%s(%p,%u,%d)", NULL, NULL },
>   #endif
>   #ifdef TARGET_NR_multiplexer
>   { TARGET_NR_multiplexer, "multiplexer" , NULL, NULL, NULL },
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index d58e9b8d10..e541fbe09a 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -22,6 +22,7 @@
>   #include "qemu/path.h"
>   #include "qemu/memfd.h"
>   #include "qemu/queue.h"
> +#include "target_mman.h"
>   #include <elf.h>
>   #include <endian.h>
>   #include <grp.h>
> @@ -7667,6 +7668,14 @@ static inline int target_to_host_mlockall_arg(int arg)
>   }
>   #endif
> 
> +static inline int target_to_host_msync_arg(abi_long arg)
> +{
> +    return ((arg & TARGET_MS_ASYNC) ? MS_ASYNC : 0) |
> +           ((arg & TARGET_MS_INVALIDATE) ? MS_INVALIDATE : 0) |
> +           ((arg & TARGET_MS_SYNC) ? MS_SYNC : 0) |
> +           (arg & ~(TARGET_MS_ASYNC | TARGET_MS_INVALIDATE | TARGET_MS_SYNC));
> +}
> +
>   #if (defined(TARGET_NR_stat64) || defined(TARGET_NR_lstat64) ||     \
>        defined(TARGET_NR_fstat64) || defined(TARGET_NR_fstatat64) ||  \
>        defined(TARGET_NR_newfstatat))
> @@ -10163,7 +10172,8 @@ static abi_long do_syscall1(CPUArchState *cpu_env, int num, abi_long arg1,
>           /* ??? msync/mlock/munlock are broken for softmmu.  */
>   #ifdef TARGET_NR_msync
>       case TARGET_NR_msync:
> -        return get_errno(msync(g2h(cpu, arg1), arg2, arg3));
> +        return get_errno(msync(g2h(cpu, arg1), arg2,
> +                               target_to_host_msync_arg(arg3)));
>   #endif
>   #ifdef TARGET_NR_mlock
>       case TARGET_NR_mlock:
> 

Reviewed-by: Laurent Vivier <laurent@vivier.eu>
Laurent Vivier March 7, 2023, 4:21 p.m. UTC | #7
Le 15/12/2022 à 08:27, Helge Deller a écrit :
> msync() uses the flags MS_ASYNC, MS_INVALIDATE and MS_SYNC, which differ
> between platforms, specifcally on alpha and hppa.
> 
> Add a target to host translation for those and wire up a nicer strace
> output.
> 
> This fixes the testsuite of the macaulay2 debian package with a hppa-linux
> guest on a x86-64 host.
> 
> Signed-off-by: Helge Deller <deller@gmx.de>
> 
> diff --git a/linux-user/alpha/target_mman.h b/linux-user/alpha/target_mman.h
> index cd6e3d70a6..051544f5ab 100644
> --- a/linux-user/alpha/target_mman.h
> +++ b/linux-user/alpha/target_mman.h
> @@ -3,6 +3,10 @@
> 
>   #define TARGET_MADV_DONTNEED 6
> 
> +#define TARGET_MS_ASYNC 1
> +#define TARGET_MS_SYNC 2
> +#define TARGET_MS_INVALIDATE 4
> +
>   #include "../generic/target_mman.h"
> 
>   #endif
> diff --git a/linux-user/generic/target_mman.h b/linux-user/generic/target_mman.h
> index 1436a3c543..32bf1a52d0 100644
> --- a/linux-user/generic/target_mman.h
> +++ b/linux-user/generic/target_mman.h
> @@ -89,4 +89,17 @@
>   #define TARGET_MADV_DONTNEED_LOCKED 24
>   #endif
> 
> +
> +#ifndef TARGET_MS_ASYNC
> +#define TARGET_MS_ASYNC 1
> +#endif
> +
> +#ifndef TARGET_MS_INVALIDATE
> +#define TARGET_MS_INVALIDATE 2
> +#endif
> +
> +#ifndef TARGET_MS_SYNC
> +#define TARGET_MS_SYNC 4
> +#endif
> +
>   #endif
> diff --git a/linux-user/hppa/target_mman.h b/linux-user/hppa/target_mman.h
> index 66dd9f7941..f9b6b97032 100644
> --- a/linux-user/hppa/target_mman.h
> +++ b/linux-user/hppa/target_mman.h
> @@ -10,6 +10,10 @@
>   #define TARGET_MADV_WIPEONFORK 71
>   #define TARGET_MADV_KEEPONFORK 72
> 
> +#define TARGET_MS_SYNC 1
> +#define TARGET_MS_ASYNC 2
> +#define TARGET_MS_INVALIDATE 4
> +
>   #include "../generic/target_mman.h"
> 
>   #endif
> diff --git a/linux-user/strace.list b/linux-user/strace.list
> index a75101fca1..ac8f872371 100644
> --- a/linux-user/strace.list
> +++ b/linux-user/strace.list
> @@ -650,7 +650,7 @@
>   { TARGET_NR_msgsnd, "msgsnd" , NULL, NULL, NULL },
>   #endif
>   #ifdef TARGET_NR_msync
> -{ TARGET_NR_msync, "msync" , NULL, NULL, NULL },
> +{ TARGET_NR_msync, "msync" , "%s(%p,%u,%d)", NULL, NULL },
>   #endif
>   #ifdef TARGET_NR_multiplexer
>   { TARGET_NR_multiplexer, "multiplexer" , NULL, NULL, NULL },
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index d58e9b8d10..e541fbe09a 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -22,6 +22,7 @@
>   #include "qemu/path.h"
>   #include "qemu/memfd.h"
>   #include "qemu/queue.h"
> +#include "target_mman.h"
>   #include <elf.h>
>   #include <endian.h>
>   #include <grp.h>
> @@ -7667,6 +7668,14 @@ static inline int target_to_host_mlockall_arg(int arg)
>   }
>   #endif
> 
> +static inline int target_to_host_msync_arg(abi_long arg)
> +{
> +    return ((arg & TARGET_MS_ASYNC) ? MS_ASYNC : 0) |
> +           ((arg & TARGET_MS_INVALIDATE) ? MS_INVALIDATE : 0) |
> +           ((arg & TARGET_MS_SYNC) ? MS_SYNC : 0) |
> +           (arg & ~(TARGET_MS_ASYNC | TARGET_MS_INVALIDATE | TARGET_MS_SYNC));
> +}
> +
>   #if (defined(TARGET_NR_stat64) || defined(TARGET_NR_lstat64) ||     \
>        defined(TARGET_NR_fstat64) || defined(TARGET_NR_fstatat64) ||  \
>        defined(TARGET_NR_newfstatat))
> @@ -10163,7 +10172,8 @@ static abi_long do_syscall1(CPUArchState *cpu_env, int num, abi_long arg1,
>           /* ??? msync/mlock/munlock are broken for softmmu.  */
>   #ifdef TARGET_NR_msync
>       case TARGET_NR_msync:
> -        return get_errno(msync(g2h(cpu, arg1), arg2, arg3));
> +        return get_errno(msync(g2h(cpu, arg1), arg2,
> +                               target_to_host_msync_arg(arg3)));
>   #endif
>   #ifdef TARGET_NR_mlock
>       case TARGET_NR_mlock:
> 

Applied to my linux-user-for-8.0 branch.

Thanks,
Laurent
diff mbox series

Patch

diff --git a/linux-user/alpha/target_mman.h b/linux-user/alpha/target_mman.h
index cd6e3d70a6..051544f5ab 100644
--- a/linux-user/alpha/target_mman.h
+++ b/linux-user/alpha/target_mman.h
@@ -3,6 +3,10 @@ 

 #define TARGET_MADV_DONTNEED 6

+#define TARGET_MS_ASYNC 1
+#define TARGET_MS_SYNC 2
+#define TARGET_MS_INVALIDATE 4
+
 #include "../generic/target_mman.h"

 #endif
diff --git a/linux-user/generic/target_mman.h b/linux-user/generic/target_mman.h
index 1436a3c543..32bf1a52d0 100644
--- a/linux-user/generic/target_mman.h
+++ b/linux-user/generic/target_mman.h
@@ -89,4 +89,17 @@ 
 #define TARGET_MADV_DONTNEED_LOCKED 24
 #endif

+
+#ifndef TARGET_MS_ASYNC
+#define TARGET_MS_ASYNC 1
+#endif
+
+#ifndef TARGET_MS_INVALIDATE
+#define TARGET_MS_INVALIDATE 2
+#endif
+
+#ifndef TARGET_MS_SYNC
+#define TARGET_MS_SYNC 4
+#endif
+
 #endif
diff --git a/linux-user/hppa/target_mman.h b/linux-user/hppa/target_mman.h
index 66dd9f7941..f9b6b97032 100644
--- a/linux-user/hppa/target_mman.h
+++ b/linux-user/hppa/target_mman.h
@@ -10,6 +10,10 @@ 
 #define TARGET_MADV_WIPEONFORK 71
 #define TARGET_MADV_KEEPONFORK 72

+#define TARGET_MS_SYNC 1
+#define TARGET_MS_ASYNC 2
+#define TARGET_MS_INVALIDATE 4
+
 #include "../generic/target_mman.h"

 #endif
diff --git a/linux-user/strace.list b/linux-user/strace.list
index a75101fca1..ac8f872371 100644
--- a/linux-user/strace.list
+++ b/linux-user/strace.list
@@ -650,7 +650,7 @@ 
 { TARGET_NR_msgsnd, "msgsnd" , NULL, NULL, NULL },
 #endif
 #ifdef TARGET_NR_msync
-{ TARGET_NR_msync, "msync" , NULL, NULL, NULL },
+{ TARGET_NR_msync, "msync" , "%s(%p,%u,%d)", NULL, NULL },
 #endif
 #ifdef TARGET_NR_multiplexer
 { TARGET_NR_multiplexer, "multiplexer" , NULL, NULL, NULL },
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index d58e9b8d10..e541fbe09a 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -22,6 +22,7 @@ 
 #include "qemu/path.h"
 #include "qemu/memfd.h"
 #include "qemu/queue.h"
+#include "target_mman.h"
 #include <elf.h>
 #include <endian.h>
 #include <grp.h>
@@ -7667,6 +7668,14 @@  static inline int target_to_host_mlockall_arg(int arg)
 }
 #endif

+static inline int target_to_host_msync_arg(abi_long arg)
+{
+    return ((arg & TARGET_MS_ASYNC) ? MS_ASYNC : 0) |
+           ((arg & TARGET_MS_INVALIDATE) ? MS_INVALIDATE : 0) |
+           ((arg & TARGET_MS_SYNC) ? MS_SYNC : 0) |
+           (arg & ~(TARGET_MS_ASYNC | TARGET_MS_INVALIDATE | TARGET_MS_SYNC));
+}
+
 #if (defined(TARGET_NR_stat64) || defined(TARGET_NR_lstat64) ||     \
      defined(TARGET_NR_fstat64) || defined(TARGET_NR_fstatat64) ||  \
      defined(TARGET_NR_newfstatat))
@@ -10163,7 +10172,8 @@  static abi_long do_syscall1(CPUArchState *cpu_env, int num, abi_long arg1,
         /* ??? msync/mlock/munlock are broken for softmmu.  */
 #ifdef TARGET_NR_msync
     case TARGET_NR_msync:
-        return get_errno(msync(g2h(cpu, arg1), arg2, arg3));
+        return get_errno(msync(g2h(cpu, arg1), arg2,
+                               target_to_host_msync_arg(arg3)));
 #endif
 #ifdef TARGET_NR_mlock
     case TARGET_NR_mlock: