summaryrefslogtreecommitdiff
path: root/libavutil
diff options
context:
space:
mode:
authorShiyou Yin <yinshiyou-hf@loongson.cn>2023-02-14 20:25:56 +0800
committerSteven Liu <liuqi05@kuaishou.com>2023-02-27 11:26:42 +0800
commitb09f31af1b5e483e614d0f5d673753c5ab778034 (patch)
treeaf17f5411ba071413d398c4ebab775a799dcc4e3 /libavutil
parentac6eec1fc258efce219e4fccb84312a1b13a7a23 (diff)
downloadffmpeg-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>
Diffstat (limited to 'libavutil')
-rw-r--r--libavutil/loongarch/cpu.c24
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;