aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2014-06-23 20:49:21 +0300
committerMartin Storsjö <martin@martin.st>2014-06-28 22:16:59 +0300
commit7b0c7c9163fe3dd0081696befde28617119d2590 (patch)
tree0ec8b19708a0cb008510a029f783d9736ff2aacd
parent39975acc699c83af0a87a7318c0f41e189142938 (diff)
downloadffmpeg-7b0c7c9163fe3dd0081696befde28617119d2590.tar.gz
arm: Detect 32 bit cpu features on ARMv8 when running on a 64 bit kernel
When running on a 64 bit kernel, /proc/cpuinfo lists different optional features than on 32 bit kernels (because some of them are mandatory in the 64 bit implemenations). The kernel does list the old features properly if they are queried via /proc/self/auxv though - however this file is not always readable (e.g. on most android systems). The getauxval function could also provide the same info as /proc/self/auxv even if this file isn't readable, but this function is not always available (and thus would need to be loaded with dlsym for compatibility with older android versions). The android cpufeatures library does this slightly differently, by assuming that these are available if the "CPU architecture" line is >= 8, see [1] for details. It has been suggested to include the old, non-optional features in /proc/cpuinfo as well, but that suggested patch never was merged. See [2] for the discussion around this suggestion. [1] https://android-review.googlesource.com/91380 [2] http://marc.info/?l=linux-arm-kernel&m=139087240101974 Signed-off-by: Martin Storsjö <martin@martin.st>
-rw-r--r--libavutil/arm/cpu.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/libavutil/arm/cpu.c b/libavutil/arm/cpu.c
index 85ea662d94..8bdaa88469 100644
--- a/libavutil/arm/cpu.c
+++ b/libavutil/arm/cpu.c
@@ -90,8 +90,10 @@ static int get_cpuinfo(uint32_t *hwcap)
*hwcap |= HWCAP_VFP;
if (strstr(buf, " vfpv3 "))
*hwcap |= HWCAP_VFPv3;
- if (strstr(buf, " neon "))
+ if (strstr(buf, " neon ") || strstr(buf, " asimd "))
*hwcap |= HWCAP_NEON;
+ if (strstr(buf, " fp ")) // Listed on 64 bit ARMv8 kernels
+ *hwcap |= HWCAP_VFP | HWCAP_VFPv3;
break;
}
}