diff mbox series

[v2] linux-user: Improve strace output of pread64() and pwrite64()

Message ID Y9Q7BlDc/VX+1SBL@p100 (mailing list archive)
State New, archived
Headers show
Series [v2] linux-user: Improve strace output of pread64() and pwrite64() | expand

Commit Message

Helge Deller Jan. 27, 2023, 8:58 p.m. UTC
Make the strace look nicer for those two syscalls.

Signed-off-by: Helge Deller <deller@gmx.de>
---
v2: Use regpairs_aligned() and target_offset64(), noticed by Laurent Vivier

Comments

Richard Henderson Jan. 27, 2023, 10:56 p.m. UTC | #1
On 1/27/23 10:58, Helge Deller wrote:
> Make the strace look nicer for those two syscalls.
> 
> Signed-off-by: Helge Deller<deller@gmx.de>
> ---
> v2: Use regpairs_aligned() and target_offset64(), noticed by Laurent Vivier

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>

r~
Laurent Vivier Jan. 30, 2023, 9:26 a.m. UTC | #2
Le 27/01/2023 à 21:58, Helge Deller a écrit :
> Make the strace look nicer for those two syscalls.
> 
> Signed-off-by: Helge Deller <deller@gmx.de>
> ---
> v2: Use regpairs_aligned() and target_offset64(), noticed by Laurent Vivier
> 
> diff --git a/linux-user/strace.c b/linux-user/strace.c
> index 82dc1a1e20..379536f5c9 100644
> --- a/linux-user/strace.c
> +++ b/linux-user/strace.c
> @@ -3824,6 +3824,25 @@ print_rlimit64(abi_ulong rlim_addr, int last)
>       }
>   }
> 
> +#if defined(TARGET_NR_pread64) || defined(TARGET_NR_pwrite64)
> +static void
> +print_preadwrite64(CPUArchState *cpu_env, const struct syscallname *name,
> +           abi_long arg0, abi_long arg1, abi_long arg2,
> +           abi_long arg3, abi_long arg4, abi_long arg5)
> +{
> +    if (regpairs_aligned(cpu_env, TARGET_NR_pread64)) {
> +        arg3 = arg4;
> +        arg4 = arg5;
> +    }
> +    print_syscall_prologue(name);
> +    print_raw_param("%d", arg0, 0);
> +    print_pointer(arg1, 0);
> +    print_raw_param("%d", arg2, 0);
> +    qemu_log("%lld", (long long)target_offset64(arg3, arg4));

better to use:

print_raw_param("%" PRIu64, target_offset64(arg3, arg4), 1);

Thanks,
Laurent
Helge Deller Jan. 30, 2023, 10:11 p.m. UTC | #3
On 1/30/23 10:26, Laurent Vivier wrote:
> Le 27/01/2023 à 21:58, Helge Deller a écrit :
>> Make the strace look nicer for those two syscalls.
>>
>> Signed-off-by: Helge Deller <deller@gmx.de>
>> ---
>> v2: Use regpairs_aligned() and target_offset64(), noticed by Laurent Vivier
>>
>> diff --git a/linux-user/strace.c b/linux-user/strace.c
>> index 82dc1a1e20..379536f5c9 100644
>> --- a/linux-user/strace.c
>> +++ b/linux-user/strace.c
>> @@ -3824,6 +3824,25 @@ print_rlimit64(abi_ulong rlim_addr, int last)
>>       }
>>   }
>>
>> +#if defined(TARGET_NR_pread64) || defined(TARGET_NR_pwrite64)
>> +static void
>> +print_preadwrite64(CPUArchState *cpu_env, const struct syscallname *name,
>> +           abi_long arg0, abi_long arg1, abi_long arg2,
>> +           abi_long arg3, abi_long arg4, abi_long arg5)
>> +{
>> +    if (regpairs_aligned(cpu_env, TARGET_NR_pread64)) {
>> +        arg3 = arg4;
>> +        arg4 = arg5;
>> +    }
>> +    print_syscall_prologue(name);
>> +    print_raw_param("%d", arg0, 0);
>> +    print_pointer(arg1, 0);
>> +    print_raw_param("%d", arg2, 0);
>> +    qemu_log("%lld", (long long)target_offset64(arg3, arg4));
>
> better to use:
>
> print_raw_param("%" PRIu64, target_offset64(arg3, arg4), 1);

I thought of that as well, but that won't work, as print_raw_param()
takes an "abi_long" value, which is just a 32-bit value on 32-bit targets.
See print_rlimit64(), it's used there with qemu_log() as well.

Helge
Laurent Vivier Jan. 31, 2023, 11:04 a.m. UTC | #4
Le 30/01/2023 à 23:11, Helge Deller a écrit :
> On 1/30/23 10:26, Laurent Vivier wrote:
>> Le 27/01/2023 à 21:58, Helge Deller a écrit :
>>> Make the strace look nicer for those two syscalls.
>>>
>>> Signed-off-by: Helge Deller <deller@gmx.de>
>>> ---
>>> v2: Use regpairs_aligned() and target_offset64(), noticed by Laurent Vivier
>>>
>>> diff --git a/linux-user/strace.c b/linux-user/strace.c
>>> index 82dc1a1e20..379536f5c9 100644
>>> --- a/linux-user/strace.c
>>> +++ b/linux-user/strace.c
>>> @@ -3824,6 +3824,25 @@ print_rlimit64(abi_ulong rlim_addr, int last)
>>>       }
>>>   }
>>>
>>> +#if defined(TARGET_NR_pread64) || defined(TARGET_NR_pwrite64)
>>> +static void
>>> +print_preadwrite64(CPUArchState *cpu_env, const struct syscallname *name,
>>> +           abi_long arg0, abi_long arg1, abi_long arg2,
>>> +           abi_long arg3, abi_long arg4, abi_long arg5)
>>> +{
>>> +    if (regpairs_aligned(cpu_env, TARGET_NR_pread64)) {
>>> +        arg3 = arg4;
>>> +        arg4 = arg5;
>>> +    }
>>> +    print_syscall_prologue(name);
>>> +    print_raw_param("%d", arg0, 0);
>>> +    print_pointer(arg1, 0);
>>> +    print_raw_param("%d", arg2, 0);
>>> +    qemu_log("%lld", (long long)target_offset64(arg3, arg4));
>>
>> better to use:
>>
>> print_raw_param("%" PRIu64, target_offset64(arg3, arg4), 1);
> 
> I thought of that as well, but that won't work, as print_raw_param()
> takes an "abi_long" value, which is just a 32-bit value on 32-bit targets.
> See print_rlimit64(), it's used there with qemu_log() as well.

Yes, you're right.

But even with qemu_log() I would prefer you use "%"PRIu64 rather than %lld.

Or better define a print_raw_param64() (or similar) and update print_fallocate(), print_truncate64() 
and print_ftruncate64().

Thanks,
Laurent
Helge Deller Jan. 31, 2023, 1:08 p.m. UTC | #5
On 1/31/23 12:04, Laurent Vivier wrote:
> Le 30/01/2023 à 23:11, Helge Deller a écrit :
>> On 1/30/23 10:26, Laurent Vivier wrote:
>>> Le 27/01/2023 à 21:58, Helge Deller a écrit :
>>>> Make the strace look nicer for those two syscalls.
>>>>
>>>> Signed-off-by: Helge Deller <deller@gmx.de>
>>>> ---
>>>> v2: Use regpairs_aligned() and target_offset64(), noticed by Laurent Vivier
>>>>
>>>> diff --git a/linux-user/strace.c b/linux-user/strace.c
>>>> index 82dc1a1e20..379536f5c9 100644
>>>> --- a/linux-user/strace.c
>>>> +++ b/linux-user/strace.c
>>>> @@ -3824,6 +3824,25 @@ print_rlimit64(abi_ulong rlim_addr, int last)
>>>>       }
>>>>   }
>>>>
>>>> +#if defined(TARGET_NR_pread64) || defined(TARGET_NR_pwrite64)
>>>> +static void
>>>> +print_preadwrite64(CPUArchState *cpu_env, const struct syscallname *name,
>>>> +           abi_long arg0, abi_long arg1, abi_long arg2,
>>>> +           abi_long arg3, abi_long arg4, abi_long arg5)
>>>> +{
>>>> +    if (regpairs_aligned(cpu_env, TARGET_NR_pread64)) {
>>>> +        arg3 = arg4;
>>>> +        arg4 = arg5;
>>>> +    }
>>>> +    print_syscall_prologue(name);
>>>> +    print_raw_param("%d", arg0, 0);
>>>> +    print_pointer(arg1, 0);
>>>> +    print_raw_param("%d", arg2, 0);
>>>> +    qemu_log("%lld", (long long)target_offset64(arg3, arg4));
>>>
>>> better to use:
>>>
>>> print_raw_param("%" PRIu64, target_offset64(arg3, arg4), 1);
>>
>> I thought of that as well, but that won't work, as print_raw_param()
>> takes an "abi_long" value, which is just a 32-bit value on 32-bit targets.
>> See print_rlimit64(), it's used there with qemu_log() as well.
>
> Yes, you're right.
>
> But even with qemu_log() I would prefer you use "%"PRIu64 rather than %lld.
> Or better define a print_raw_param64() (or similar) and update print_fallocate(), print_truncate64() and print_ftruncate64().

As adding such define is a unrelated change to this patch, I'd propose that I send a follow-up
patch on top of this one which adds print_raw_param64() (or similar) and replaces all
usages of qemu_log() with 64-bit values and use "%"PRIu64 then.
Ok?
If yes, should that define include the last 0/1 parameter to print the "," ?
I think so, because then it's consistent with print_raw_param().

Helge
Laurent Vivier Jan. 31, 2023, 3:05 p.m. UTC | #6
Le 31/01/2023 à 14:08, Helge Deller a écrit :
> On 1/31/23 12:04, Laurent Vivier wrote:
>> Le 30/01/2023 à 23:11, Helge Deller a écrit :
>>> On 1/30/23 10:26, Laurent Vivier wrote:
>>>> Le 27/01/2023 à 21:58, Helge Deller a écrit :
>>>>> Make the strace look nicer for those two syscalls.
>>>>>
>>>>> Signed-off-by: Helge Deller <deller@gmx.de>
>>>>> ---
>>>>> v2: Use regpairs_aligned() and target_offset64(), noticed by Laurent Vivier
>>>>>
>>>>> diff --git a/linux-user/strace.c b/linux-user/strace.c
>>>>> index 82dc1a1e20..379536f5c9 100644
>>>>> --- a/linux-user/strace.c
>>>>> +++ b/linux-user/strace.c
>>>>> @@ -3824,6 +3824,25 @@ print_rlimit64(abi_ulong rlim_addr, int last)
>>>>>       }
>>>>>   }
>>>>>
>>>>> +#if defined(TARGET_NR_pread64) || defined(TARGET_NR_pwrite64)
>>>>> +static void
>>>>> +print_preadwrite64(CPUArchState *cpu_env, const struct syscallname *name,
>>>>> +           abi_long arg0, abi_long arg1, abi_long arg2,
>>>>> +           abi_long arg3, abi_long arg4, abi_long arg5)
>>>>> +{
>>>>> +    if (regpairs_aligned(cpu_env, TARGET_NR_pread64)) {
>>>>> +        arg3 = arg4;
>>>>> +        arg4 = arg5;
>>>>> +    }
>>>>> +    print_syscall_prologue(name);
>>>>> +    print_raw_param("%d", arg0, 0);
>>>>> +    print_pointer(arg1, 0);
>>>>> +    print_raw_param("%d", arg2, 0);
>>>>> +    qemu_log("%lld", (long long)target_offset64(arg3, arg4));
>>>>
>>>> better to use:
>>>>
>>>> print_raw_param("%" PRIu64, target_offset64(arg3, arg4), 1);
>>>
>>> I thought of that as well, but that won't work, as print_raw_param()
>>> takes an "abi_long" value, which is just a 32-bit value on 32-bit targets.
>>> See print_rlimit64(), it's used there with qemu_log() as well.
>>
>> Yes, you're right.
>>
>> But even with qemu_log() I would prefer you use "%"PRIu64 rather than %lld.
>> Or better define a print_raw_param64() (or similar) and update print_fallocate(), 
>> print_truncate64() and print_ftruncate64().
> 
> As adding such define is a unrelated change to this patch, I'd propose that I send a follow-up
> patch on top of this one which adds print_raw_param64() (or similar) and replaces all
> usages of qemu_log() with 64-bit values and use "%"PRIu64 then.
> Ok?

yes

> If yes, should that define include the last 0/1 parameter to print the "," ?
> I think so, because then it's consistent with print_raw_param().

you're right.

Thanks,
Laurent
> 
> Helge
>
diff mbox series

Patch

diff --git a/linux-user/strace.c b/linux-user/strace.c
index 82dc1a1e20..379536f5c9 100644
--- a/linux-user/strace.c
+++ b/linux-user/strace.c
@@ -3824,6 +3824,25 @@  print_rlimit64(abi_ulong rlim_addr, int last)
     }
 }

+#if defined(TARGET_NR_pread64) || defined(TARGET_NR_pwrite64)
+static void
+print_preadwrite64(CPUArchState *cpu_env, const struct syscallname *name,
+           abi_long arg0, abi_long arg1, abi_long arg2,
+           abi_long arg3, abi_long arg4, abi_long arg5)
+{
+    if (regpairs_aligned(cpu_env, TARGET_NR_pread64)) {
+        arg3 = arg4;
+        arg4 = arg5;
+    }
+    print_syscall_prologue(name);
+    print_raw_param("%d", arg0, 0);
+    print_pointer(arg1, 0);
+    print_raw_param("%d", arg2, 0);
+    qemu_log("%lld", (long long)target_offset64(arg3, arg4));
+    print_syscall_epilogue(name);
+}
+#endif
+
 static void
 print_prlimit64(CPUArchState *cpu_env, const struct syscallname *name,
            abi_long arg0, abi_long arg1, abi_long arg2,
diff --git a/linux-user/strace.list b/linux-user/strace.list
index 909298099e..4ae60e5e87 100644
--- a/linux-user/strace.list
+++ b/linux-user/strace.list
@@ -1061,7 +1061,7 @@ 
 { TARGET_NR_prctl, "prctl" , NULL, NULL, NULL },
 #endif
 #ifdef TARGET_NR_pread64
-{ TARGET_NR_pread64, "pread64" , NULL, NULL, NULL },
+{ TARGET_NR_pread64, "pread64" , NULL, print_preadwrite64, NULL },
 #endif
 #ifdef TARGET_NR_preadv
 { TARGET_NR_preadv, "preadv" , NULL, NULL, NULL },
@@ -1092,7 +1092,7 @@ 
 { TARGET_NR_putpmsg, "putpmsg" , NULL, NULL, NULL },
 #endif
 #ifdef TARGET_NR_pwrite64
-{ TARGET_NR_pwrite64, "pwrite64" , NULL, NULL, NULL },
+{ TARGET_NR_pwrite64, "pwrite64" , NULL, print_preadwrite64, NULL },
 #endif
 #ifdef TARGET_NR_pwritev
 { TARGET_NR_pwritev, "pwritev" , NULL, NULL, NULL },