On Mon, Nov 23, 2015 at 04:21:34PM +0300, Maxim Ostapenko wrote:
> Yeah, right. I've asked about kernel headers just to make sure I correctly
> understand the issue.
> 
> Actually, I see such code in
> lib/sanitizer_common/sanitizer_platform_limits_posix.cc:
> 
> #if defined(PTRACE_GETVFPREGS) && defined(PTRACE_SETVFPREGS)
>   int ptrace_getvfpregs = PTRACE_GETVFPREGS;
>   int ptrace_setvfpregs = PTRACE_SETVFPREGS;
> #else
>   int ptrace_getvfpregs = -1;
>   int ptrace_setvfpregs = -1;
> #endif
> 
> and in ptrace interceptor:
> 
>  else if (request == ptrace_setvfpregs)
>     COMMON_INTERCEPTOR_READ_RANGE(ctx, data, struct_user_vfpregs_struct_sz);
>  else if (request == ptrace_getvfpregs)
>     COMMON_INTERCEPTOR_WRITE_RANGE(ctx, data, struct_user_vfpregs_struct_sz)
> 
> So, perhaps we can do the same thing with ARM_VFPREGS_SIZE, something like
> this?
> 
> diff --git
> a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc
> b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc
> index 9866cc9..20ff224 100644
> --- a/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc
> +++ b/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc
> @@ -323,10 +323,14 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);
>    unsigned struct_user_fpxregs_struct_sz = sizeof(struct
> user_fpxregs_struct);
>  #endif // __x86_64 || __mips64 || __powerpc64__ || __aarch64__ || __arm__
>  #ifdef __arm__
> +#if defined(ARM_VFPREGS_SIZE)
>    unsigned struct_user_vfpregs_struct_sz = ARM_VFPREGS_SIZE;
>  #else
>    unsigned struct_user_vfpregs_struct_sz = 0;
>  #endif
> +#else
> +  unsigned struct_user_vfpregs_struct_sz = 0;
> +#endif

Maybe, but then it would need to be approved upstream.
If you just define ARM_VFPREGS_SIZE to 0 or whatever else in
the GCC owned wrapper headers, you can avoid that.
I guess talk to upstream.

        Jakub

Reply via email to