[FFmpeg-devel] [PATCH] avutil: [LA] use getauxval to do runtime check.

Shiyou Yin yinshiyou-hf at loongson.cn
Tue Feb 14 14:25:56 EET 2023


Replace cpucfg with getauxval to avoid crash in case of
some processor capabilities are not supportted by kernel used.
---
 libavutil/loongarch/cpu.c | 24 ++++++++----------------
 1 file 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;
-- 
2.20.1



More information about the ffmpeg-devel mailing list