Merge commit 'f1b3e131385176c3c9d9783b25047856a0dcebf6'
authorJames Almer <jamrial@gmail.com>
Thu, 23 Mar 2017 20:36:53 +0000 (17:36 -0300)
committerJames Almer <jamrial@gmail.com>
Thu, 23 Mar 2017 20:36:53 +0000 (17:36 -0300)
* commit 'f1b3e131385176c3c9d9783b25047856a0dcebf6':
  checkasm: aarch64: Clobber the stack before calling functions

Merged-by: James Almer <jamrial@gmail.com>
1  2 
tests/checkasm/aarch64/checkasm.S
tests/checkasm/checkasm.h

@@@ -3,14 -3,14 +3,14 @@@
   * Copyright (c) 2015 Martin Storsjo
   * Copyright (c) 2015 Janne Grunau
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or modify
 + * FFmpeg is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
@@@ -52,6 -52,19 +52,19 @@@ endcons
  // max number of args used by any asm function.
  #define MAX_ARGS 15
  
+ #define CLOBBER_STACK ((8*MAX_ARGS + 15) & ~15)
+ function checkasm_stack_clobber, export=1
+     mov         x29, sp
+     mov         x2,  #CLOBBER_STACK
+ 1:
+     stp         x0,  x1,  [sp, #-16]!
+     subs        x2,  x2,  #16
+     b.gt        1b
+     mov         sp,  x29
+     ret
+ endfunc
  #define ARG_STACK ((8*(MAX_ARGS - 8) + 15) & ~15)
  
  function checkasm_checked_call, export=1
@@@ -3,20 -3,20 +3,20 @@@
   * Copyright (c) 2015 Henrik Gramner
   * Copyright (c) 2008 Loren Merritt
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or modify
 + * FFmpeg is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License along
 - * with Libav; if not, write to the Free Software Foundation, Inc.,
 + * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
   * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
   */
  
  #include "libavutil/lfg.h"
  #include "libavutil/timer.h"
  
 +void checkasm_check_alacdsp(void);
  void checkasm_check_audiodsp(void);
 +void checkasm_check_blend(void);
  void checkasm_check_blockdsp(void);
  void checkasm_check_bswapdsp(void);
 -void checkasm_check_dcadsp(void);
 +void checkasm_check_colorspace(void);
 +void checkasm_check_flacdsp(void);
  void checkasm_check_fmtconvert(void);
  void checkasm_check_h264dsp(void);
  void checkasm_check_h264pred(void);
  void checkasm_check_h264qpel(void);
  void checkasm_check_hevc_idct(void);
 -void checkasm_check_hevc_mc(void);
 -void checkasm_check_huffyuvdsp(void);
 +void checkasm_check_jpeg2000dsp(void);
 +void checkasm_check_llviddsp(void);
 +void checkasm_check_pixblockdsp(void);
  void checkasm_check_synth_filter(void);
  void checkasm_check_v210enc(void);
  void checkasm_check_vp8dsp(void);
  void checkasm_check_vp9dsp(void);
 +void checkasm_check_videodsp(void);
  
  void *checkasm_check_func(void *func, const char *name, ...) av_printf_format(2, 3);
  int checkasm_bench_func(void);
@@@ -139,9 -134,13 +139,13 @@@ extern void (*checkasm_checked_call)(vo
  #define declare_new(ret, ...) ret (*checked_call)(void *, int dummy, __VA_ARGS__) = (void *)checkasm_checked_call;
  #define call_new(...) checked_call(func_new, 0, __VA_ARGS__)
  #elif ARCH_AARCH64 && !defined(__APPLE__)
+ void checkasm_stack_clobber(uint64_t clobber, ...);
  void checkasm_checked_call(void *func, ...);
  #define declare_new(ret, ...) ret (*checked_call)(void *, __VA_ARGS__) = (void *)checkasm_checked_call;
- #define call_new(...) checked_call(func_new, __VA_ARGS__)
+ #define CLOB (UINT64_C(0xdeadbeefdeadbeef))
+ #define call_new(...) (checkasm_stack_clobber(CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,\
+                                               CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB),\
+                       checked_call(func_new, __VA_ARGS__))
  #else
  #define declare_new(ret, ...)
  #define declare_new_emms(cpu_flags, ret, ...)