[x264-devel] [PATCH 3/6] checkasm: arm: preserve the stack alignment in x264_checkasm_checked_call
Janne Grunau
janne-x264 at jannau.net
Wed Nov 16 20:39:01 CET 2016
On 2016-11-14 23:54:50 +0200, Martin Storsjö wrote:
> From: Janne Grunau <janne-x264 at jannau.net>
>
> The stack used by x264_checkasm_checked_call_neon was a multiple of 4
> when the checked function is called. AAPCS requires a double word (8 byte)
> aligned stack public interfaces. Since both calls are public interfaces
> the stack is misaligned when the checked is called.
>
> This can cause issues if code called within this (which includes
> the C implementations) relies on the stack alignment.
> ---
> tools/checkasm-arm.S | 11 +++++++----
> 1 file changed, 7 insertions(+), 4 deletions(-)
>
> diff --git a/tools/checkasm-arm.S b/tools/checkasm-arm.S
> index 57b4079..8242a58 100644
> --- a/tools/checkasm-arm.S
> +++ b/tools/checkasm-arm.S
> @@ -47,6 +47,9 @@ error_message:
>
> #define ARG_STACK 4*(MAX_ARGS - 2)
>
> +@ align the used stack space to 8 to preserve the stack alignment
> +#define ARG_STACK_A (((ARG_STACK + pushed + 7) & ~7) - pushed)
> +
> .macro clobbercheck variant
> .equ pushed, 4*10
> function x264_checkasm_call_\variant
> @@ -64,10 +67,10 @@ function x264_checkasm_call_\variant
>
> push {r1}
>
> - sub sp, sp, #ARG_STACK
> + sub sp, sp, #ARG_STACK_A
> .equ pos, 0
> .rept MAX_ARGS-2
> - ldr r12, [sp, #ARG_STACK + pushed + 8 + pos]
> + ldr r12, [sp, #ARG_STACK_A + pushed + 8 + pos]
> str r12, [sp, #pos]
> .equ pos, pos + 4
> .endr
> @@ -75,9 +78,9 @@ function x264_checkasm_call_\variant
> mov r12, r0
> mov r0, r2
> mov r1, r3
> - ldrd r2, r3, [sp, #ARG_STACK + pushed]
> + ldrd r2, r3, [sp, #ARG_STACK_A + pushed]
> blx r12
> - add sp, sp, #ARG_STACK
> + add sp, sp, #ARG_STACK_A
> pop {r2}
>
> push {r0, r1}
ok, patch is based on my patch for libav's checkasm
Janne
More information about the x264-devel
mailing list