diff mbox series

[FFmpeg-devel] checkasm: disable unaligned access emulation

Message ID 20240601080355.8136-1-remi@remlab.net
State Accepted
Commit 8d117024fe05dcf0f45693b47118e4c26e0940af
Headers show
Series [FFmpeg-devel] checkasm: disable unaligned access emulation | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Rémi Denis-Courmont June 1, 2024, 8:03 a.m. UTC
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(+)

Comments

Rémi Denis-Courmont June 5, 2024, 7:46 p.m. UTC | #1
Le lauantaina 1. kesäkuuta 2024, 11.03.55 EEST Rémi Denis-Courmont a écrit :
> 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.

Will push soon.
diff mbox series

Patch

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 <io.h>
 #endif
+#if HAVE_PRCTL
+#include <sys/prctl.h>
+#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;