[x264-devel] [PATCH 5/6] checkasm: aarch64: Clobber the stack before calling functions

Janne Grunau janne-x264 at jannau.net
Wed Nov 16 00:00:41 CET 2016


On 2016-11-14 23:54:52 +0200, Martin Storsjö wrote:
> ---
>  tools/checkasm-aarch64.S | 13 +++++++++++++
>  tools/checkasm.c         |  9 ++++++++-
>  2 files changed, 21 insertions(+), 1 deletion(-)
> 
> diff --git a/tools/checkasm-aarch64.S b/tools/checkasm-aarch64.S
> index af4ed31..1eb4546 100644
> --- a/tools/checkasm-aarch64.S
> +++ b/tools/checkasm-aarch64.S
> @@ -56,6 +56,19 @@ error_message:
>  // max number of args used by any x264 asm function.
>  #define MAX_ARGS 15
>  
> +#define CLOBBER_STACK ((8*MAX_ARGS + 15) & ~15)
> +
> +function x264_checkasm_stack_clobber, export=1
> +    mov         x3,  sp
> +    mov         x2,  #CLOBBER_STACK
> +1:
> +    stp         x0,  x1,  [sp, #-16]!
> +    subs        x2,  x2,  #16
> +    b.gt        1b
> +    mov         sp,  x3
> +    ret
> +endfunc
> +
>  #define ARG_STACK ((8*(MAX_ARGS - 8) + 15) & ~15)
>  
>  function x264_checkasm_call, export=1
> diff --git a/tools/checkasm.c b/tools/checkasm.c
> index 8785cc8..e10665c 100644
> --- a/tools/checkasm.c
> +++ b/tools/checkasm.c
> @@ -258,7 +258,14 @@ void x264_checkasm_stack_clobber( uint64_t clobber, ... );
>      uint64_t r = (rand() & 0xffff) * 0x0001000100010001ULL; \
>      x264_checkasm_stack_clobber( r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r ); /* max_args+6 */ \
>      x264_checkasm_call(( intptr_t(*)())func, &ok, 0, 0, 0, 0, __VA_ARGS__ ); })
> -#elif ARCH_X86 || (ARCH_AARCH64 && !defined(__APPLE__)) || ARCH_ARM
> +#elif ARCH_AARCH64 && !defined(__APPLE__)
> +void x264_checkasm_stack_clobber( uint64_t clobber, ... );
> +#define call_a1(func,...) ({ \
> +    uint64_t r = (rand() & 0xffff) * 0x0001000100010001ULL; \
> +    x264_checkasm_stack_clobber( r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r ); /* max_args+8 */ \
> +    x264_checkasm_call(( intptr_t(*)())func, &ok, __VA_ARGS__ ); })
> +#elif ARCH_AARCH64 && !defined(__APPLE__)

duplicated condition

> +#elif ARCH_X86 || ARCH_ARM
>  #define call_a1(func,...) x264_checkasm_call( (intptr_t(*)())func, &ok, __VA_ARGS__ )
>  #else
>  #define call_a1 call_c1

otherwise ok

Janne


More information about the x264-devel mailing list