Skip to content
Snippets Groups Projects
Commit c91d6a33 authored by Martin Storsjö's avatar Martin Storsjö
Browse files

checkasm: aarch64: Add filler args to make sure all parameters are passed on the stack


This, combined with clobbering the stack space prior to the call,
increases the chances of finding cases where 32 bit parameters
are erroneously treated as 64 bit.

Signed-off-by: default avatarMartin Storsjö <martin@martin.st>
parent f1b3e131
No related branches found
No related tags found
No related merge requests found
...@@ -93,22 +93,18 @@ function checkasm_checked_call, export=1 ...@@ -93,22 +93,18 @@ function checkasm_checked_call, export=1
sub sp, sp, #ARG_STACK sub sp, sp, #ARG_STACK
.equ pos, 0 .equ pos, 0
// the first stacked arg is copied to x7
.rept MAX_ARGS-8 .rept MAX_ARGS-8
ldr x9, [x29, #16 + 8 + pos] // Skip the first 8 args, that are loaded into registers
ldr x9, [x29, #16 + 8*8 + pos]
str x9, [sp, #pos] str x9, [sp, #pos]
.equ pos, pos + 8 .equ pos, pos + 8
.endr .endr
mov x12, x0 mov x12, x0
mov x0, x1 ldp x0, x1, [x29, #16]
mov x1, x2 ldp x2, x3, [x29, #32]
mov x2, x3 ldp x4, x5, [x29, #48]
mov x3, x4 ldp x6, x7, [x29, #64]
mov x4, x5
mov x5, x6
mov x6, x7
ldr x7, [x29, #16]
blr x12 blr x12
add sp, sp, #ARG_STACK add sp, sp, #ARG_STACK
stp x0, x1, [sp, #-16]! stp x0, x1, [sp, #-16]!
......
...@@ -136,11 +136,12 @@ extern void (*checkasm_checked_call)(void *func, int dummy, ...); ...@@ -136,11 +136,12 @@ extern void (*checkasm_checked_call)(void *func, int dummy, ...);
#elif ARCH_AARCH64 && !defined(__APPLE__) #elif ARCH_AARCH64 && !defined(__APPLE__)
void checkasm_stack_clobber(uint64_t clobber, ...); void checkasm_stack_clobber(uint64_t clobber, ...);
void checkasm_checked_call(void *func, ...); void checkasm_checked_call(void *func, ...);
#define declare_new(ret, ...) ret (*checked_call)(void *, __VA_ARGS__) = (void *)checkasm_checked_call; #define declare_new(ret, ...) ret (*checked_call)(void *, int, int, int, int, int, int, int, __VA_ARGS__)\
= (void *)checkasm_checked_call;
#define CLOB (UINT64_C(0xdeadbeefdeadbeef)) #define CLOB (UINT64_C(0xdeadbeefdeadbeef))
#define call_new(...) (checkasm_stack_clobber(CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,\ #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),\ CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB,CLOB),\
checked_call(func_new, __VA_ARGS__)) checked_call(func_new, 0, 0, 0, 0, 0, 0, 0, __VA_ARGS__))
#else #else
#define declare_new(ret, ...) #define declare_new(ret, ...)
#define declare_new_emms(cpu_flags, ret, ...) #define declare_new_emms(cpu_flags, ret, ...)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment