From 8d117024fe05dcf0f45693b47118e4c26e0940af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Denis-Courmont?= Date: Sat, 1 Jun 2024 10:55:51 +0300 Subject: [PATCH] checkasm: disable unaligned access emulation The OS may silently fix (emulate) unaligned hardware access exceptions. This is extremely slow and code should be fixed not to rely on unaligned access on affected hardware. Accordingly this requests that the OS disable emulation and instead throw Bus error, which will be caught by checkasm's signal handler. This has no effects if the hardware supports unaligned access in hardware, since no exceptions are generated. prctl() will fail safe in that case. --- tests/checkasm/checkasm.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/checkasm/checkasm.c b/tests/checkasm/checkasm.c index d7aa2a9c09..2329e2e1bc 100644 --- a/tests/checkasm/checkasm.c +++ b/tests/checkasm/checkasm.c @@ -41,6 +41,9 @@ #if HAVE_IO_H #include #endif +#if HAVE_PRCTL +#include +#endif #if defined(_WIN32) && !defined(SIGBUS) /* non-standard, use the same value as mingw-w64 */ @@ -847,6 +850,9 @@ int main(int argc, char *argv[]) sigaction(SIGILL, &signal_handler_act, NULL); sigaction(SIGSEGV, &signal_handler_act, NULL); #endif +#if HAVE_PRCTL && defined(PR_SET_UNALIGN) + prctl(PR_SET_UNALIGN, PR_UNALIGN_SIGBUS); +#endif #if ARCH_ARM && HAVE_ARMV5TE_EXTERNAL if (have_vfp(av_get_cpu_flags()) || have_neon(av_get_cpu_flags())) checkasm_checked_call = checkasm_checked_call_vfp;