diff options
author | Martin Storsjö <martin@martin.st> | 2023-12-14 16:04:36 +0200 |
---|---|---|
committer | Martin Storsjö <martin@martin.st> | 2024-01-15 23:29:12 +0200 |
commit | ac40c3bb07781e72f3eb1e30ea450019cc1f6302 (patch) | |
tree | 9323fc37adf047a9e03835c22e987c354e671c11 | |
parent | d8f3cc90ac148f42e9f514995c11ee3c8dd528f6 (diff) | |
download | ffmpeg-ac40c3bb07781e72f3eb1e30ea450019cc1f6302.tar.gz |
checkasm: Test whether the native FFmpeg timers work
On some platforms (in particular, ARM/AArch64), the implementation
of AV_READ_TIME() may use a privileged instruction - in such
cases, benchmarking just fails with a SIGILL.
Instead of crashing, try executing AV_READ_TIME() once within
a region with the signal handler active, to allow gracefully
informing the user about the issue.
This matches the dav1d checkasm commit
95a192549a448b70d9542e840c4e34b60d09b093.
Signed-off-by: Martin Storsjö <martin@martin.st>
-rw-r--r-- | tests/checkasm/checkasm.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/tests/checkasm/checkasm.c b/tests/checkasm/checkasm.c index ba366ba3a8..87f24c77ca 100644 --- a/tests/checkasm/checkasm.c +++ b/tests/checkasm/checkasm.c @@ -757,6 +757,14 @@ static int bench_init_kperf(void) static int bench_init_ffmpeg(void) { #ifdef AV_READ_TIME + if (!checkasm_save_context()) { + checkasm_set_signal_handler_state(1); + AV_READ_TIME(); + checkasm_set_signal_handler_state(0); + } else { + fprintf(stderr, "checkasm: unable to execute platform specific timer\n"); + return -1; + } printf("benchmarking with native FFmpeg timers\n"); return 0; #else @@ -930,7 +938,9 @@ int checkasm_bench_func(void) /* Indicate that the current test has failed */ void checkasm_fail_func(const char *msg, ...) { - if (state.current_func_ver->cpu && state.current_func_ver->ok) { + if (state.current_func_ver && state.current_func_ver->cpu && + state.current_func_ver->ok) + { va_list arg; print_cpu_name(); |