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>
This commit is contained in:
Martin Storsjö 2023-12-14 16:04:36 +02:00
parent d8f3cc90ac
commit ac40c3bb07
1 changed files with 11 additions and 1 deletions

View File

@ -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();