Support older ARM versions with checkasm

This commit is contained in:
Cameron Cawley
2024-09-18 18:29:36 +00:00
committed by Martin Storsjö
co-authored by Martin Storsjö
parent 8d9b1e26b3
commit 8e993f4d0b
4 changed files with 43 additions and 10 deletions
+21 -4
View File
@@ -32,17 +32,34 @@
#include "config.h"
#include "src/arm/asm.S"
.macro v4bx rd
#if __ARM_ARCH >= 5 || defined(__ARM_ARCH_4T__)
bx \rd
#else
mov pc, \rd
#endif
.endm
.macro v4blx rd
#if __ARM_ARCH >= 5
blx \rd
#else
mov lr, pc
v4bx \rd
#endif
.endm
.macro movrel_local rd, val, offset=0
#if defined(PIC)
#if (__ARM_ARCH >= 7 || defined(__ARM_ARCH_6T2__)) && !defined(PIC)
movw \rd, #:lower16:\val+\offset
movt \rd, #:upper16:\val+\offset
#else
ldr \rd, 90001f
b 90002f
90001:
.word \val + \offset - (90002f + 8 - 4 * CONFIG_THUMB)
90002:
add \rd, \rd, pc
#else
movw \rd, #:lower16:\val+\offset
movt \rd, #:upper16:\val+\offset
#endif
.endm
+8 -4
View File
@@ -101,9 +101,10 @@ function checked_call_\variant, export=1
mov r12, r0
mov r0, r2
mov r1, r3
ldrd r2, r3, [sp, #ARG_STACK_A + pushed]
ldr r2, [sp, #ARG_STACK_A + pushed]
ldr r3, [sp, #ARG_STACK_A + pushed + 4]
@ Call the target function
blx r12
v4blx r12
@ Load the number of stack parameters, stack canary and its reference
ldr r12, [sp, #ARG_STACK_A + pushed + 8 + 4*(MAX_ARGS-4)]
@@ -120,7 +121,8 @@ function checked_call_\variant, export=1
movrel r12, register_init
.ifc \variant, vfp
.macro check_reg_vfp, dreg, offset
ldrd r2, r3, [r12, #8 * (\offset)]
ldr r2, [r12, #(8 * (\offset))]
ldr r3, [r12, #(8 * (\offset)) + 4]
vmov r0, lr, \dreg
eor r2, r2, r0
eor r3, r3, lr
@@ -148,7 +150,8 @@ function checked_call_\variant, export=1
@ keep track of the checked GPR
mov r1, #4
.macro check_reg reg1, reg2=
ldrd r2, r3, [r12], #8
ldr r2, [r12], #4
ldr r3, [r12], #4
eors r2, r2, \reg1
bne 2f
add r1, r1, #1
@@ -198,4 +201,5 @@ function checked_call_\variant, export=1
endfunc
.endm
clobbercheck novfp
clobbercheck vfp
+12
View File
@@ -836,6 +836,14 @@ int main(int argc, char *argv[]) {
state.simd_warmup = checkasm_warmup_avx2;
checkasm_simd_warmup();
#endif
#if ARCH_ARM
void checkasm_checked_call_vfp(void *func, int dummy, ...);
void checkasm_checked_call_novfp(void *func, int dummy, ...);
if (cpu_flags & DAV1D_ARM_CPU_FLAG_NEON)
checkasm_checked_call_ptr = checkasm_checked_call_vfp;
else
checkasm_checked_call_ptr = checkasm_checked_call_novfp;
#endif
#if ARCH_X86
unsigned checkasm_init_x86(char *name);
char name[48];
@@ -1130,3 +1138,7 @@ void checkasm_simd_warmup(void)
state.simd_warmup();
}
#endif
#if ARCH_ARM
void (*checkasm_checked_call_ptr)(void *func, int dummy, ...);
#endif
+2 -2
View File
@@ -302,12 +302,12 @@ void checkasm_simd_warmup(void);
/* Use a dummy argument, to offset the real parameters by 2, not only 1.
* This makes sure that potential 8-byte-alignment of parameters is kept
* the same even when the extra parameters have been removed. */
void checkasm_checked_call_vfp(void *func, int dummy, ...);
extern void (*checkasm_checked_call_ptr)(void *func, int dummy, ...);
#define declare_new(ret, ...)\
ret (*checked_call)(void *, int dummy, __VA_ARGS__,\
int, int, int, int, int, int, int, int,\
int, int, int, int, int, int, int) =\
(void *)checkasm_checked_call_vfp;
(void *)checkasm_checked_call_ptr;
#define call_new(...)\
(checkasm_set_signal_handler_state(1),\
checked_call(func_new, 0, __VA_ARGS__, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0));\