aarch64 strace decoding of 32-bit arm statfs64...
enh
enh at google.com
Wed Mar 18 17:37:45 UTC 2015
confirmed that works for me. thanks!
On Wed, Mar 18, 2015 at 9:42 AM, Dmitry V. Levin <ldv at altlinux.org> wrote:
> On Tue, Mar 17, 2015 at 10:29:23PM -0700, enh wrote:
>> hmm. i wonder if this changed at some point? the arm64 kernel has this:
>>
>> compat_sys_statfs64_wrapper:
>> mov w3, #84
>> cmp w1, #88
>> csel w1, w3, w1, eq
>> b compat_sys_statfs64
>> ENDPROC(compat_sys_statfs64_wrapper)
>>
>> compat_sys_fstatfs64_wrapper:
>> mov w3, #84
>> cmp w1, #88
>> csel w1, w3, w1, eq
>> b compat_sys_fstatfs64
>> ENDPROC(compat_sys_fstatfs64_wrapper)
>>
>> and the arm kernel has the equivalent:
>>
>> sys_statfs64_wrapper:
>> teq r1, #88
>> moveq r1, #84
>> b sys_statfs64
>> ENDPROC(sys_statfs64_wrapper)
>>
>> sys_fstatfs64_wrapper:
>> teq r1, #88
>> moveq r1, #84
>> b sys_fstatfs64
>> ENDPROC(sys_fstatfs64_wrapper)
>>
>> oh, there's a comment in arch/arm/kernel/sys_oabi-compat.c:
>>
>> * sys_statfs64:
>> * sys_fstatfs64:
>> *
>> * struct statfs64 has extra padding with EABI growing its size from
>> * 84 to 88. This struct is now __attribute__((packed,aligned(4)))
>> * with a small assembly wrapper to force the sz argument to 84 if it is 88
>> * to avoid copying the extra padding over user space unexpecting it.
>>
>> bionic doesn't have the packed attribute and our sizeof is 88.
>>
>> adding this in both sys_statfs64 and sys_fstatfs64 fixed things for me
>> but maybe you have a better idea?
>>
>> +#if defined ARM || defined AARCH64 /* eabi structs have padding */
>> + else if (tcp->u_arg[1] == sizeof(struct compat_statfs64) + 4)
>> + printcompat_statfs64(tcp, tcp->u_arg[2]);
>> +#endif
>
> As both sizes appear to be valid, we have no choice but to support this
> diversity. I'm going to install this patch:
>
> --- a/statfs.c
> +++ b/statfs.c
> @@ -128,6 +128,10 @@ struct compat_statfs64 {
> __attribute__ ((packed, aligned(4)))
> #endif
> ;
> +#if defined AARCH64 || defined ARM
> +/* See arch/arm/kernel/sys_oabi-compat.c for details. */
> +# define COMPAT_STATFS64_PADDED_SIZE (sizeof(struct compat_statfs64) + 4)
> +#endif
>
> static void
> printcompat_statfs64(struct tcb *tcp, const long addr)
> @@ -157,16 +161,19 @@ printcompat_statfs64(struct tcb *tcp, const long addr)
> tprintf(", f_flags=%lu}", (unsigned long)statbuf.f_frsize);
> }
>
> -int
> -sys_statfs64(struct tcb *tcp)
> +static int
> +do_statfs64_fstatfs64(struct tcb *tcp)
> {
> if (entering(tcp)) {
> - printpath(tcp, tcp->u_arg[0]);
> tprintf(", %lu, ", tcp->u_arg[1]);
> } else {
> if (tcp->u_arg[1] == sizeof(struct statfs64))
> printstatfs64(tcp, tcp->u_arg[2]);
> - else if (tcp->u_arg[1] == sizeof(struct compat_statfs64))
> + else if (tcp->u_arg[1] == sizeof(struct compat_statfs64)
> +#ifdef COMPAT_STATFS64_PADDED_SIZE
> + || tcp->u_arg[1] == COMPAT_STATFS64_PADDED_SIZE
> +#endif
> + )
> printcompat_statfs64(tcp, tcp->u_arg[2]);
> else
> tprints("{???}");
> @@ -175,20 +182,19 @@ sys_statfs64(struct tcb *tcp)
> }
>
> int
> +sys_statfs64(struct tcb *tcp)
> +{
> + if (entering(tcp))
> + printpath(tcp, tcp->u_arg[0]);
> + return do_statfs64_fstatfs64(tcp);
> +}
> +
> +int
> sys_fstatfs64(struct tcb *tcp)
> {
> - if (entering(tcp)) {
> + if (entering(tcp))
> printfd(tcp, tcp->u_arg[0]);
> - tprintf(", %lu, ", tcp->u_arg[1]);
> - } else {
> - if (tcp->u_arg[1] == sizeof(struct statfs64))
> - printstatfs64(tcp, tcp->u_arg[2]);
> - else if (tcp->u_arg[1] == sizeof(struct compat_statfs64))
> - printcompat_statfs64(tcp, tcp->u_arg[2]);
> - else
> - tprints("{???}");
> - }
> - return 0;
> + return do_statfs64_fstatfs64(tcp);
> }
> #endif /* HAVE_STRUCT_STATFS64 */
>
> --
> ldv
>
> ------------------------------------------------------------------------------
> Dive into the World of Parallel Programming The Go Parallel Website, sponsored
> by Intel and developed in partnership with Slashdot Media, is your hub for all
> things parallel software development, from weekly thought leadership blogs to
> news, videos, case studies, tutorials and more. Take a look and join the
> conversation now. http://goparallel.sourceforge.net/
> _______________________________________________
> Strace-devel mailing list
> Strace-devel at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/strace-devel
>
--
Elliott Hughes - http://who/enh - http://jessies.org/~enh/
Android native code/tools questions? Mail me/drop by/add me as a reviewer.
More information about the Strace-devel
mailing list