diff options
author | Shiyou Yin <yinshiyou-hf@loongson.cn> | 2023-02-14 20:25:56 +0800 |
---|---|---|
committer | Steven Liu <liuqi05@kuaishou.com> | 2023-02-27 11:26:42 +0800 |
commit | b09f31af1b5e483e614d0f5d673753c5ab778034 (patch) | |
tree | af17f5411ba071413d398c4ebab775a799dcc4e3 | |
parent | ac6eec1fc258efce219e4fccb84312a1b13a7a23 (diff) | |
download | ffmpeg-b09f31af1b5e483e614d0f5d673753c5ab778034.tar.gz |
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>
-rw-r--r-- | libavutil/loongarch/cpu.c | 24 |
1 files changed, 8 insertions, 16 deletions
diff --git a/libavutil/loongarch/cpu.c b/libavutil/loongarch/cpu.c index e4b240bc44..cad8504fde 100644 --- a/libavutil/loongarch/cpu.c +++ b/libavutil/loongarch/cpu.c @@ -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; - - __asm__ volatile( - "cpucfg %0, %1 \n\t" - : "+&r"(cfg2) - : "r"(LOONGARCH_CFG2) - ); + int flag = (int)getauxval(AT_HWCAP); - 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; |