avutil: [LA] use getauxval to do runtime check.

Replace cpucfg with getauxval to avoid crash in case of
some processor capabilities are not supportted by kernel used.

Reviewed-by: Steven Liu <liuqi05@kuaishou.com>
This commit is contained in:
Shiyou Yin 2023-02-14 20:25:56 +08:00 committed by Steven Liu
parent ac6eec1fc2
commit b09f31af1b
1 changed files with 8 additions and 16 deletions

View File

@ -21,26 +21,18 @@
#include <stdint.h>
#include "cpu.h"
#include <sys/auxv.h>
#define LOONGARCH_CFG2 0x2
#define LOONGARCH_CFG2_LSX (1 << 6)
#define LOONGARCH_CFG2_LASX (1 << 7)
static int cpu_flags_cpucfg(void)
#define LA_HWCAP_LSX (1<<4)
#define LA_HWCAP_LASX (1<<5)
static int cpu_flags_getauxval(void)
{
int flags = 0;
uint32_t cfg2 = 0;
int flag = (int)getauxval(AT_HWCAP);
__asm__ volatile(
"cpucfg %0, %1 \n\t"
: "+&r"(cfg2)
: "r"(LOONGARCH_CFG2)
);
if (cfg2 & LOONGARCH_CFG2_LSX)
if (flag & LA_HWCAP_LSX)
flags |= AV_CPU_FLAG_LSX;
if (cfg2 & LOONGARCH_CFG2_LASX)
if (flag & LA_HWCAP_LASX)
flags |= AV_CPU_FLAG_LASX;
return flags;
@ -49,7 +41,7 @@ static int cpu_flags_cpucfg(void)
int ff_get_cpu_flags_loongarch(void)
{
#if defined __linux__
return cpu_flags_cpucfg();
return cpu_flags_getauxval();
#else
/* Assume no SIMD ASE supported */
return 0;