diff options
Diffstat (limited to 'test/builtins/Unit/enable_execute_stack_test.c')
-rw-r--r-- | test/builtins/Unit/enable_execute_stack_test.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/test/builtins/Unit/enable_execute_stack_test.c b/test/builtins/Unit/enable_execute_stack_test.c index c0f67b337939..38a142afb24d 100644 --- a/test/builtins/Unit/enable_execute_stack_test.c +++ b/test/builtins/Unit/enable_execute_stack_test.c @@ -45,8 +45,18 @@ int func2() return 2; } - - +void *__attribute__((noinline)) +memcpy_f(void *dst, const void *src, size_t n) { +// ARM and MIPS nartually align functions, but use the LSB for ISA selection +// (THUMB, MIPS16/uMIPS respectively). Ensure that the ISA bit is ignored in +// the memcpy +#if defined(__arm__) || defined(__mips__) + return (void *)((uintptr_t)memcpy(dst, (void *)((uintptr_t)src & ~1), n) | + ((uintptr_t)src & 1)); +#else + return memcpy(dst, (void *)((uintptr_t)src), n); +#endif +} int main() { @@ -55,16 +65,14 @@ int main() __enable_execute_stack(execution_buffer); // verify you can copy and execute a function - memcpy(execution_buffer, (void *)(uintptr_t)&func1, 128); + pfunc f1 = (pfunc)memcpy_f(execution_buffer, func1, 128); __clear_cache(execution_buffer, &execution_buffer[128]); - pfunc f1 = (pfunc)(uintptr_t)execution_buffer; if ((*f1)() != 1) return 1; // verify you can overwrite a function with another - memcpy(execution_buffer, (void *)(uintptr_t)&func2, 128); + pfunc f2 = (pfunc)memcpy_f(execution_buffer, func2, 128); __clear_cache(execution_buffer, &execution_buffer[128]); - pfunc f2 = (pfunc)(uintptr_t)execution_buffer; if ((*f2)() != 2) return 1; |