Re: [Qemu-devel] [PATCH] linux-user/syscall.c: Notice about lock bitmask translation for fcntl

2015-12-20 Thread Chen Gang

On 2015年12月18日 18:47, Chen Gang wrote:
> 
> On 2015年12月18日 17:41, Laurent Vivier wrote:
>>
>> Le 18/12/2015 07:51, Chen Gang a écrit :

[...]

>>>
>>> +++ b/linux-user/mmap.c
>>> @@ -567,6 +567,10 @@ abi_long target_mmap(abi_ulong start, abi_ulong len, 
>>> int prot,
>>>  printf("\n");
>>>  #endif
>>>  tb_invalidate_phys_range(start, start + len);
>>> +if ((prot & PROT_WRITE) && (flags & MAP_ANONYMOUS)
>>> +&& ((flags & MAP_PRIVATE) || (fd == -1))) {
>>> +memset(g2h(start), 0, len);
>>> +}
>>
>> IMHO, their kernel needs a fix, mmap(2):
>>
>> MAP_ANONYMOUS
>> The mapping is not backed by any file; its contents are initial‐
>> ized to zero.
>>

Oh, sorry, after check again, it is not kernel's issue: mmap() will
always zero the ANONYMOUS memory for kernel 3.8 in sw_64 arch.

It is still our qemu's issue in mmap_frag (do not zero ANONYMOUS memory
fragments), so I sent patch v2 for it, please help check.

Thanks.

> 
> OK, Thanks.
> 
> 

-- 
Chen Gang (陈刚)

Open, share, and attitude like air, water, and life which God blessed



Re: [Qemu-devel] [PATCH] linux-user/syscall.c: Notice about lock bitmask translation for fcntl

2015-12-18 Thread Laurent Vivier


Le 18/12/2015 07:51, Chen Gang a écrit :
> 
> I found this issue during my working time, it is about sw_64 (almost the
> same as alpha) host running i386 wine programs.
> 
> I also found another issue, but I am not quite sure whether it is worth
> enough for our upstream: The related fix patch is below, which will let
> the initialization slower, but for most archs, they have no this issue.
> 
> linux-user/mmap.c: Always zero MAP_ANONYMOUS memory in target_mmap()
> 
> In some architectures, they have no policy to zero MAP_ANONYMOUS memory,
> which will cause issue for qemu target_mmap.
> 
> Signed-off-by: Chen Gang 
> 
> diff --git a/linux-user/mmap.c b/linux-user/mmap.c
> index 7b459d5..9c9152d 100644
> --- a/linux-user/mmap.c
> +++ b/linux-user/mmap.c
> @@ -567,6 +567,10 @@ abi_long target_mmap(abi_ulong start, abi_ulong len, int 
> prot,
>  printf("\n");
>  #endif
>  tb_invalidate_phys_range(start, start + len);
> +if ((prot & PROT_WRITE) && (flags & MAP_ANONYMOUS)
> +&& ((flags & MAP_PRIVATE) || (fd == -1))) {
> +memset(g2h(start), 0, len);
> +}

IMHO, their kernel needs a fix, mmap(2):

MAP_ANONYMOUS
The mapping is not backed by any file; its contents are initial‐
ized to zero.


>  mmap_unlock();
>  return start;
>  fail:
> 
> 
> Thanks.

Laurent



Re: [Qemu-devel] [PATCH] linux-user/syscall.c: Notice about lock bitmask translation for fcntl

2015-12-18 Thread Laurent Vivier

Le 18/12/2015 07:26, Chen Gang a écrit :
> 
> For fcntl, it always needs to notice about it, just like do_fcntl() has
> done, or it will cause issue (e.g. alpha host run i386 guest).
> 
> Signed-off-by: Chen Gang 
> ---
>  linux-user/syscall.c |   18 --
>  1 files changed, 12 insertions(+), 6 deletions(-)
> 
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index 0f8adeb..1a60e6f 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -9007,7 +9007,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long 
> arg1,
>  if (((CPUARMState *)cpu_env)->eabi) {
>  if (!lock_user_struct(VERIFY_READ, target_efl, arg3, 1)) 
>  goto efault;
> -fl.l_type = tswap16(target_efl->l_type);
> +fl.l_type = 
> target_to_host_bitmask(tswap16(target_fl->l_type),
> +   flock_tbl);
>  fl.l_whence = tswap16(target_efl->l_whence);
>  fl.l_start = tswap64(target_efl->l_start);
>  fl.l_len = tswap64(target_efl->l_len);
> @@ -9018,7 +9019,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long 
> arg1,
>  {
>  if (!lock_user_struct(VERIFY_READ, target_fl, arg3, 1)) 
>  goto efault;
> -fl.l_type = tswap16(target_fl->l_type);
> +fl.l_type = 
> target_to_host_bitmask(tswap16(target_fl->l_type),
> +   flock_tbl);
>  fl.l_whence = tswap16(target_fl->l_whence);
>  fl.l_start = tswap64(target_fl->l_start);
>  fl.l_len = tswap64(target_fl->l_len);
> @@ -9031,7 +9033,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long 
> arg1,
>  if (((CPUARMState *)cpu_env)->eabi) {
>  if (!lock_user_struct(VERIFY_WRITE, target_efl, arg3, 
> 0)) 
>  goto efault;
> -target_efl->l_type = tswap16(fl.l_type);
> +target_efl->l_type = host_to_target_bitmask(
> + tswap16(fl.l_type), 
> flock_tbl);
>  target_efl->l_whence = tswap16(fl.l_whence);
>  target_efl->l_start = tswap64(fl.l_start);
>  target_efl->l_len = tswap64(fl.l_len);
> @@ -9042,7 +9045,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long 
> arg1,
>  {
>  if (!lock_user_struct(VERIFY_WRITE, target_fl, arg3, 0)) 
>  goto efault;
> -target_fl->l_type = tswap16(fl.l_type);
> +target_fl->l_type = host_to_target_bitmask(
> + tswap16(fl.l_type), 
> flock_tbl);
>  target_fl->l_whence = tswap16(fl.l_whence);
>  target_fl->l_start = tswap64(fl.l_start);
>  target_fl->l_len = tswap64(fl.l_len);
> @@ -9058,7 +9062,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long 
> arg1,
>  if (((CPUARMState *)cpu_env)->eabi) {
>  if (!lock_user_struct(VERIFY_READ, target_efl, arg3, 1)) 
>  goto efault;
> -fl.l_type = tswap16(target_efl->l_type);
> +fl.l_type = 
> target_to_host_bitmask(tswap16(target_fl->l_type),
> +   flock_tbl);
>  fl.l_whence = tswap16(target_efl->l_whence);
>  fl.l_start = tswap64(target_efl->l_start);
>  fl.l_len = tswap64(target_efl->l_len);
> @@ -9069,7 +9074,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long 
> arg1,
>  {
>  if (!lock_user_struct(VERIFY_READ, target_fl, arg3, 1)) 
>  goto efault;
> -fl.l_type = tswap16(target_fl->l_type);
> +fl.l_type = 
> target_to_host_bitmask(tswap16(target_fl->l_type),
> +   flock_tbl);
>  fl.l_whence = tswap16(target_fl->l_whence);
>  fl.l_start = tswap64(target_fl->l_start);
>  fl.l_len = tswap64(target_fl->l_len);
> 

This patch looks good to me, except that script/checkpatch.pl complains
about "DOS line ending" and "line over 80 characters".

Reviewed-by: Laurent Vivier 



Re: [Qemu-devel] [PATCH] linux-user/syscall.c: Notice about lock bitmask translation for fcntl

2015-12-18 Thread Chen Gang

On 2015年12月18日 17:41, Laurent Vivier wrote:
> 
> 
> Le 18/12/2015 07:51, Chen Gang a écrit :
>>
>> I found this issue during my working time, it is about sw_64 (almost the
>> same as alpha) host running i386 wine programs.
>>
>> I also found another issue, but I am not quite sure whether it is worth
>> enough for our upstream: The related fix patch is below, which will let
>> the initialization slower, but for most archs, they have no this issue.
>>
>> linux-user/mmap.c: Always zero MAP_ANONYMOUS memory in target_mmap()
>> 
>> In some architectures, they have no policy to zero MAP_ANONYMOUS memory,
>> which will cause issue for qemu target_mmap.
>> 
>> Signed-off-by: Chen Gang 
>>
>> diff --git a/linux-user/mmap.c b/linux-user/mmap.c
>> index 7b459d5..9c9152d 100644
>> --- a/linux-user/mmap.c
>> +++ b/linux-user/mmap.c
>> @@ -567,6 +567,10 @@ abi_long target_mmap(abi_ulong start, abi_ulong len, 
>> int prot,
>>  printf("\n");
>>  #endif
>>  tb_invalidate_phys_range(start, start + len);
>> +if ((prot & PROT_WRITE) && (flags & MAP_ANONYMOUS)
>> +&& ((flags & MAP_PRIVATE) || (fd == -1))) {
>> +memset(g2h(start), 0, len);
>> +}
> 
> IMHO, their kernel needs a fix, mmap(2):
> 
> MAP_ANONYMOUS
> The mapping is not backed by any file; its contents are initial‐
> ized to zero.
> 

OK, Thanks.


-- 
Chen Gang (陈刚)

Open, share, and attitude like air, water, and life which God blessed



Re: [Qemu-devel] [PATCH] linux-user/syscall.c: Notice about lock bitmask translation for fcntl

2015-12-18 Thread Chen Gang

On 12/18/15 17:37, Laurent Vivier wrote:
> 
> Le 18/12/2015 07:26, Chen Gang a écrit :
>>
>> For fcntl, it always needs to notice about it, just like do_fcntl() has
>> done, or it will cause issue (e.g. alpha host run i386 guest).
>>
>> Signed-off-by: Chen Gang 
>> ---
>>  linux-user/syscall.c |   18 --
>>  1 files changed, 12 insertions(+), 6 deletions(-)
>>
>> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
>> index 0f8adeb..1a60e6f 100644
>> --- a/linux-user/syscall.c
>> +++ b/linux-user/syscall.c
>> @@ -9007,7 +9007,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long 
>> arg1,
>>  if (((CPUARMState *)cpu_env)->eabi) {
>>  if (!lock_user_struct(VERIFY_READ, target_efl, arg3, 1)) 
>>  goto efault;
>> -fl.l_type = tswap16(target_efl->l_type);
>> +fl.l_type = 
>> target_to_host_bitmask(tswap16(target_fl->l_type),
>> +   flock_tbl);
>>  fl.l_whence = tswap16(target_efl->l_whence);
>>  fl.l_start = tswap64(target_efl->l_start);
>>  fl.l_len = tswap64(target_efl->l_len);
>> @@ -9018,7 +9019,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long 
>> arg1,
>>  {
>>  if (!lock_user_struct(VERIFY_READ, target_fl, arg3, 1)) 
>>  goto efault;
>> -fl.l_type = tswap16(target_fl->l_type);
>> +fl.l_type = 
>> target_to_host_bitmask(tswap16(target_fl->l_type),
>> +   flock_tbl);
>>  fl.l_whence = tswap16(target_fl->l_whence);
>>  fl.l_start = tswap64(target_fl->l_start);
>>  fl.l_len = tswap64(target_fl->l_len);
>> @@ -9031,7 +9033,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long 
>> arg1,
>>  if (((CPUARMState *)cpu_env)->eabi) {
>>  if (!lock_user_struct(VERIFY_WRITE, target_efl, arg3, 
>> 0)) 
>>  goto efault;
>> -target_efl->l_type = tswap16(fl.l_type);
>> +target_efl->l_type = host_to_target_bitmask(
>> + tswap16(fl.l_type), 
>> flock_tbl);
>>  target_efl->l_whence = tswap16(fl.l_whence);
>>  target_efl->l_start = tswap64(fl.l_start);
>>  target_efl->l_len = tswap64(fl.l_len);
>> @@ -9042,7 +9045,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long 
>> arg1,
>>  {
>>  if (!lock_user_struct(VERIFY_WRITE, target_fl, arg3, 
>> 0)) 
>>  goto efault;
>> -target_fl->l_type = tswap16(fl.l_type);
>> +target_fl->l_type = host_to_target_bitmask(
>> + tswap16(fl.l_type), 
>> flock_tbl);
>>  target_fl->l_whence = tswap16(fl.l_whence);
>>  target_fl->l_start = tswap64(fl.l_start);
>>  target_fl->l_len = tswap64(fl.l_len);
>> @@ -9058,7 +9062,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long 
>> arg1,
>>  if (((CPUARMState *)cpu_env)->eabi) {
>>  if (!lock_user_struct(VERIFY_READ, target_efl, arg3, 1)) 
>>  goto efault;
>> -fl.l_type = tswap16(target_efl->l_type);
>> +fl.l_type = 
>> target_to_host_bitmask(tswap16(target_fl->l_type),
>> +   flock_tbl);
>>  fl.l_whence = tswap16(target_efl->l_whence);
>>  fl.l_start = tswap64(target_efl->l_start);
>>  fl.l_len = tswap64(target_efl->l_len);
>> @@ -9069,7 +9074,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long 
>> arg1,
>>  {
>>  if (!lock_user_struct(VERIFY_READ, target_fl, arg3, 1)) 
>>  goto efault;
>> -fl.l_type = tswap16(target_fl->l_type);
>> +fl.l_type = 
>> target_to_host_bitmask(tswap16(target_fl->l_type),
>> +   flock_tbl);
>>  fl.l_whence = tswap16(target_fl->l_whence);
>>  fl.l_start = tswap64(target_fl->l_start);
>>  fl.l_len = tswap64(target_fl->l_len);
>>
> 
> This patch looks good to me, except that script/checkpatch.pl complains
> about "DOS line ending" and "line over 80 characters".
> 

I did not get any script/checkpatch.pl complains, originally.

Does my email client configuration is incorrect, then cause incorrect
mail format? I guess not. The related reason is below.

 - I copy your full reply mail contents to a new file (diff.patch).

 - Remove all '> ' in vi editor (1,% s/^> //g) (so get the original
   patch contents).

 - ./script/checkpatch.pl diff.patch, it has no 

Re: [Qemu-devel] [PATCH] linux-user/syscall.c: Notice about lock bitmask translation for fcntl

2015-12-18 Thread Chen Gang

On 12/19/15 06:15, Laurent Vivier wrote:
> 
> Le 18/12/2015 23:12, Chen Gang a écrit :
>>

[...]

>>
>> OK, thank you very much. I shall config my email client again to notice
>> about it.
> 
> You should not use your email client to send patches, you should use
> "git send-email":
> 
> http://wiki.qemu.org/Contribute/SubmitAPatch
> 

OK, thanks.

-- 
Chen Gang

Open, share, and attitude like air, water, and life which God blessed



Re: [Qemu-devel] [PATCH] linux-user/syscall.c: Notice about lock bitmask translation for fcntl

2015-12-18 Thread Laurent Vivier


Le 18/12/2015 22:40, Chen Gang a écrit :
> 
> On 12/18/15 17:37, Laurent Vivier wrote:
>>
>> Le 18/12/2015 07:26, Chen Gang a écrit :
>>>
>>> For fcntl, it always needs to notice about it, just like do_fcntl() has
>>> done, or it will cause issue (e.g. alpha host run i386 guest).
>>>
>>> Signed-off-by: Chen Gang 
>>> ---
>>>  linux-user/syscall.c |   18 --
>>>  1 files changed, 12 insertions(+), 6 deletions(-)
>>>
>>> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
>>> index 0f8adeb..1a60e6f 100644
>>> --- a/linux-user/syscall.c
>>> +++ b/linux-user/syscall.c
>>> @@ -9007,7 +9007,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long 
>>> arg1,
>>>  if (((CPUARMState *)cpu_env)->eabi) {
>>>  if (!lock_user_struct(VERIFY_READ, target_efl, arg3, 1)) 
>>>  goto efault;
>>> -fl.l_type = tswap16(target_efl->l_type);
>>> +fl.l_type = 
>>> target_to_host_bitmask(tswap16(target_fl->l_type),
>>> +   flock_tbl);
>>>  fl.l_whence = tswap16(target_efl->l_whence);
>>>  fl.l_start = tswap64(target_efl->l_start);
>>>  fl.l_len = tswap64(target_efl->l_len);
>>> @@ -9018,7 +9019,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long 
>>> arg1,
>>>  {
>>>  if (!lock_user_struct(VERIFY_READ, target_fl, arg3, 1)) 
>>>  goto efault;
>>> -fl.l_type = tswap16(target_fl->l_type);
>>> +fl.l_type = 
>>> target_to_host_bitmask(tswap16(target_fl->l_type),
>>> +   flock_tbl);
>>>  fl.l_whence = tswap16(target_fl->l_whence);
>>>  fl.l_start = tswap64(target_fl->l_start);
>>>  fl.l_len = tswap64(target_fl->l_len);
>>> @@ -9031,7 +9033,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long 
>>> arg1,
>>>  if (((CPUARMState *)cpu_env)->eabi) {
>>>  if (!lock_user_struct(VERIFY_WRITE, target_efl, arg3, 
>>> 0)) 
>>>  goto efault;
>>> -target_efl->l_type = tswap16(fl.l_type);
>>> +target_efl->l_type = host_to_target_bitmask(
>>> + tswap16(fl.l_type), 
>>> flock_tbl);
>>>  target_efl->l_whence = tswap16(fl.l_whence);
>>>  target_efl->l_start = tswap64(fl.l_start);
>>>  target_efl->l_len = tswap64(fl.l_len);
>>> @@ -9042,7 +9045,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long 
>>> arg1,
>>>  {
>>>  if (!lock_user_struct(VERIFY_WRITE, target_fl, arg3, 
>>> 0)) 
>>>  goto efault;
>>> -target_fl->l_type = tswap16(fl.l_type);
>>> +target_fl->l_type = host_to_target_bitmask(
>>> + tswap16(fl.l_type), 
>>> flock_tbl);
>>>  target_fl->l_whence = tswap16(fl.l_whence);
>>>  target_fl->l_start = tswap64(fl.l_start);
>>>  target_fl->l_len = tswap64(fl.l_len);
>>> @@ -9058,7 +9062,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long 
>>> arg1,
>>>  if (((CPUARMState *)cpu_env)->eabi) {
>>>  if (!lock_user_struct(VERIFY_READ, target_efl, arg3, 1)) 
>>>  goto efault;
>>> -fl.l_type = tswap16(target_efl->l_type);
>>> +fl.l_type = 
>>> target_to_host_bitmask(tswap16(target_fl->l_type),
>>> +   flock_tbl);
>>>  fl.l_whence = tswap16(target_efl->l_whence);
>>>  fl.l_start = tswap64(target_efl->l_start);
>>>  fl.l_len = tswap64(target_efl->l_len);
>>> @@ -9069,7 +9074,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long 
>>> arg1,
>>>  {
>>>  if (!lock_user_struct(VERIFY_READ, target_fl, arg3, 1)) 
>>>  goto efault;
>>> -fl.l_type = tswap16(target_fl->l_type);
>>> +fl.l_type = 
>>> target_to_host_bitmask(tswap16(target_fl->l_type),
>>> +   flock_tbl);
>>>  fl.l_whence = tswap16(target_fl->l_whence);
>>>  fl.l_start = tswap64(target_fl->l_start);
>>>  fl.l_len = tswap64(target_fl->l_len);
>>>
>>
>> This patch looks good to me, except that script/checkpatch.pl complains
>> about "DOS line ending" and "line over 80 characters".
>>
> 
> I did not get any script/checkpatch.pl complains, originally.
> 
> Does my email client configuration is incorrect, then cause incorrect
> mail format? I guess not. The related reason is below.
> 
>  - I copy your full reply mail contents to a new file 

Re: [Qemu-devel] [PATCH] linux-user/syscall.c: Notice about lock bitmask translation for fcntl

2015-12-18 Thread Chen Gang

On 12/19/15 05:58, Laurent Vivier wrote:
> 
> Le 18/12/2015 22:40, Chen Gang a écrit :
>>

[...]

>> I did not get any script/checkpatch.pl complains, originally.
>>
>> Does my email client configuration is incorrect, then cause incorrect
>> mail format? I guess not. The related reason is below.
>>
>>  - I copy your full reply mail contents to a new file (diff.patch).
> 
> If you copy, you loose the special characters. I do a "Save as".
> 
>>
>>  - Remove all '> ' in vi editor (1,% s/^> //g) (so get the original
>>patch contents).
>>
>>  - ./script/checkpatch.pl diff.patch, it has no any complains.
> 
> If I run "file" on the saved file, I have:
> 
> $ file orig.eml
> orig.eml: SMTP mail, ASCII text, with CRLF line terminators
> 
> I can convert it with "tr":
> 
> $ tr "\r" "\n" < orig.eml > new.eml
> 
> $ file new.eml
> new.eml: SMTP mail, ASCII text
> 
> $ ./scripts/checkpatch.pl new.eml
> total: 0 errors, 0 warnings, 54 lines checked
> 
> new.eml has no obvious style problems and is ready for submission.
> 
> Laurent
> 

OK, thank you very much. I shall config my email client again to notice
about it.


Thanks.
-- 
Chen Gang

Open, share, and attitude like air, water, and life which God blessed.



Re: [Qemu-devel] [PATCH] linux-user/syscall.c: Notice about lock bitmask translation for fcntl

2015-12-18 Thread Laurent Vivier


Le 18/12/2015 23:12, Chen Gang a écrit :
> 
> On 12/19/15 05:58, Laurent Vivier wrote:
>>
>> Le 18/12/2015 22:40, Chen Gang a écrit :
>>>
> 
> [...]
> 
>>> I did not get any script/checkpatch.pl complains, originally.
>>>
>>> Does my email client configuration is incorrect, then cause incorrect
>>> mail format? I guess not. The related reason is below.
>>>
>>>  - I copy your full reply mail contents to a new file (diff.patch).
>>
>> If you copy, you loose the special characters. I do a "Save as".
>>
>>>
>>>  - Remove all '> ' in vi editor (1,% s/^> //g) (so get the original
>>>patch contents).
>>>
>>>  - ./script/checkpatch.pl diff.patch, it has no any complains.
>>
>> If I run "file" on the saved file, I have:
>>
>> $ file orig.eml
>> orig.eml: SMTP mail, ASCII text, with CRLF line terminators
>>
>> I can convert it with "tr":
>>
>> $ tr "\r" "\n" < orig.eml > new.eml
>>
>> $ file new.eml
>> new.eml: SMTP mail, ASCII text
>>
>> $ ./scripts/checkpatch.pl new.eml
>> total: 0 errors, 0 warnings, 54 lines checked
>>
>> new.eml has no obvious style problems and is ready for submission.
>>
>> Laurent
>>
> 
> OK, thank you very much. I shall config my email client again to notice
> about it.

You should not use your email client to send patches, you should use
"git send-email":

http://wiki.qemu.org/Contribute/SubmitAPatch

Laurent



[Qemu-devel] [PATCH] linux-user/syscall.c: Notice about lock bitmask translation for fcntl

2015-12-17 Thread Chen Gang

For fcntl, it always needs to notice about it, just like do_fcntl() has
done, or it will cause issue (e.g. alpha host run i386 guest).

Signed-off-by: Chen Gang 
---
 linux-user/syscall.c |   18 --
 1 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 0f8adeb..1a60e6f 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -9007,7 +9007,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
 if (((CPUARMState *)cpu_env)->eabi) {
 if (!lock_user_struct(VERIFY_READ, target_efl, arg3, 1)) 
 goto efault;
-fl.l_type = tswap16(target_efl->l_type);
+fl.l_type = target_to_host_bitmask(tswap16(target_fl->l_type),
+   flock_tbl);
 fl.l_whence = tswap16(target_efl->l_whence);
 fl.l_start = tswap64(target_efl->l_start);
 fl.l_len = tswap64(target_efl->l_len);
@@ -9018,7 +9019,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
 {
 if (!lock_user_struct(VERIFY_READ, target_fl, arg3, 1)) 
 goto efault;
-fl.l_type = tswap16(target_fl->l_type);
+fl.l_type = target_to_host_bitmask(tswap16(target_fl->l_type),
+   flock_tbl);
 fl.l_whence = tswap16(target_fl->l_whence);
 fl.l_start = tswap64(target_fl->l_start);
 fl.l_len = tswap64(target_fl->l_len);
@@ -9031,7 +9033,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
 if (((CPUARMState *)cpu_env)->eabi) {
 if (!lock_user_struct(VERIFY_WRITE, target_efl, arg3, 0)) 
 goto efault;
-target_efl->l_type = tswap16(fl.l_type);
+target_efl->l_type = host_to_target_bitmask(
+ tswap16(fl.l_type), 
flock_tbl);
 target_efl->l_whence = tswap16(fl.l_whence);
 target_efl->l_start = tswap64(fl.l_start);
 target_efl->l_len = tswap64(fl.l_len);
@@ -9042,7 +9045,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
 {
 if (!lock_user_struct(VERIFY_WRITE, target_fl, arg3, 0)) 
 goto efault;
-target_fl->l_type = tswap16(fl.l_type);
+target_fl->l_type = host_to_target_bitmask(
+ tswap16(fl.l_type), 
flock_tbl);
 target_fl->l_whence = tswap16(fl.l_whence);
 target_fl->l_start = tswap64(fl.l_start);
 target_fl->l_len = tswap64(fl.l_len);
@@ -9058,7 +9062,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
 if (((CPUARMState *)cpu_env)->eabi) {
 if (!lock_user_struct(VERIFY_READ, target_efl, arg3, 1)) 
 goto efault;
-fl.l_type = tswap16(target_efl->l_type);
+fl.l_type = target_to_host_bitmask(tswap16(target_fl->l_type),
+   flock_tbl);
 fl.l_whence = tswap16(target_efl->l_whence);
 fl.l_start = tswap64(target_efl->l_start);
 fl.l_len = tswap64(target_efl->l_len);
@@ -9069,7 +9074,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
 {
 if (!lock_user_struct(VERIFY_READ, target_fl, arg3, 1)) 
 goto efault;
-fl.l_type = tswap16(target_fl->l_type);
+fl.l_type = target_to_host_bitmask(tswap16(target_fl->l_type),
+   flock_tbl);
 fl.l_whence = tswap16(target_fl->l_whence);
 fl.l_start = tswap64(target_fl->l_start);
 fl.l_len = tswap64(target_fl->l_len);
-- 
1.7.3.4



Re: [Qemu-devel] [PATCH] linux-user/syscall.c: Notice about lock bitmask translation for fcntl

2015-12-17 Thread Chen Gang

I found this issue during my working time, it is about sw_64 (almost the
same as alpha) host running i386 wine programs.

I also found another issue, but I am not quite sure whether it is worth
enough for our upstream: The related fix patch is below, which will let
the initialization slower, but for most archs, they have no this issue.

linux-user/mmap.c: Always zero MAP_ANONYMOUS memory in target_mmap()

In some architectures, they have no policy to zero MAP_ANONYMOUS memory,
which will cause issue for qemu target_mmap.

Signed-off-by: Chen Gang 

diff --git a/linux-user/mmap.c b/linux-user/mmap.c
index 7b459d5..9c9152d 100644
--- a/linux-user/mmap.c
+++ b/linux-user/mmap.c
@@ -567,6 +567,10 @@ abi_long target_mmap(abi_ulong start, abi_ulong len, int 
prot,
 printf("\n");
 #endif
 tb_invalidate_phys_range(start, start + len);
+if ((prot & PROT_WRITE) && (flags & MAP_ANONYMOUS)
+&& ((flags & MAP_PRIVATE) || (fd == -1))) {
+memset(g2h(start), 0, len);
+}
 mmap_unlock();
 return start;
 fail:


Thanks.

On 2015年12月18日 14:26, Chen Gang wrote:
> 
> For fcntl, it always needs to notice about it, just like do_fcntl() has
> done, or it will cause issue (e.g. alpha host run i386 guest).
> 
> Signed-off-by: Chen Gang 
> ---
>  linux-user/syscall.c |   18 --
>  1 files changed, 12 insertions(+), 6 deletions(-)
> 
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index 0f8adeb..1a60e6f 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -9007,7 +9007,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long 
> arg1,
>  if (((CPUARMState *)cpu_env)->eabi) {
>  if (!lock_user_struct(VERIFY_READ, target_efl, arg3, 1)) 
>  goto efault;
> -fl.l_type = tswap16(target_efl->l_type);
> +fl.l_type = 
> target_to_host_bitmask(tswap16(target_fl->l_type),
> +   flock_tbl);
>  fl.l_whence = tswap16(target_efl->l_whence);
>  fl.l_start = tswap64(target_efl->l_start);
>  fl.l_len = tswap64(target_efl->l_len);
> @@ -9018,7 +9019,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long 
> arg1,
>  {
>  if (!lock_user_struct(VERIFY_READ, target_fl, arg3, 1)) 
>  goto efault;
> -fl.l_type = tswap16(target_fl->l_type);
> +fl.l_type = 
> target_to_host_bitmask(tswap16(target_fl->l_type),
> +   flock_tbl);
>  fl.l_whence = tswap16(target_fl->l_whence);
>  fl.l_start = tswap64(target_fl->l_start);
>  fl.l_len = tswap64(target_fl->l_len);
> @@ -9031,7 +9033,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long 
> arg1,
>  if (((CPUARMState *)cpu_env)->eabi) {
>  if (!lock_user_struct(VERIFY_WRITE, target_efl, arg3, 
> 0)) 
>  goto efault;
> -target_efl->l_type = tswap16(fl.l_type);
> +target_efl->l_type = host_to_target_bitmask(
> + tswap16(fl.l_type), 
> flock_tbl);
>  target_efl->l_whence = tswap16(fl.l_whence);
>  target_efl->l_start = tswap64(fl.l_start);
>  target_efl->l_len = tswap64(fl.l_len);
> @@ -9042,7 +9045,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long 
> arg1,
>  {
>  if (!lock_user_struct(VERIFY_WRITE, target_fl, arg3, 0)) 
>  goto efault;
> -target_fl->l_type = tswap16(fl.l_type);
> +target_fl->l_type = host_to_target_bitmask(
> + tswap16(fl.l_type), 
> flock_tbl);
>  target_fl->l_whence = tswap16(fl.l_whence);
>  target_fl->l_start = tswap64(fl.l_start);
>  target_fl->l_len = tswap64(fl.l_len);
> @@ -9058,7 +9062,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long 
> arg1,
>  if (((CPUARMState *)cpu_env)->eabi) {
>  if (!lock_user_struct(VERIFY_READ, target_efl, arg3, 1)) 
>  goto efault;
> -fl.l_type = tswap16(target_efl->l_type);
> +fl.l_type = 
> target_to_host_bitmask(tswap16(target_fl->l_type),
> +   flock_tbl);
>  fl.l_whence = tswap16(target_efl->l_whence);
>  fl.l_start = tswap64(target_efl->l_start);
>  fl.l_len = tswap64(target_efl->l_len);
> @@ -9069,7 +9074,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long 
> arg1,
>  {
>  if (!lock_user_struct(VERIFY_READ, target_fl,