diff options
author | Luca Barbato <lu_zero@gentoo.org> | 2015-04-03 15:31:32 +0200 |
---|---|---|
committer | Luca Barbato <lu_zero@gentoo.org> | 2015-05-31 12:07:10 +0200 |
commit | baa94563fede8959a638b0fa132dd2124acd93e8 (patch) | |
tree | b6eaf3c64cfb4049897415fe1166a15b0f9e43a4 /libavutil | |
parent | 7014b65995b1fe6188fb53447bf61b08e3963355 (diff) | |
download | ffmpeg-baa94563fede8959a638b0fa132dd2124acd93e8.tar.gz |
ppc: linux: Check altivec using the auxv
Should prevent trying to use altivec when it is disabled by the kernel.
Diffstat (limited to 'libavutil')
-rw-r--r-- | libavutil/ppc/cpu.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/libavutil/ppc/cpu.c b/libavutil/ppc/cpu.c index 50107e1fca..2ceb88a68c 100644 --- a/libavutil/ppc/cpu.c +++ b/libavutil/ppc/cpu.c @@ -18,6 +18,11 @@ #ifdef __APPLE__ #include <sys/sysctl.h> +#elif defined(__linux__) +#include <asm/cputable.h> +#include <linux/auxvec.h> +#include <fcntl.h> +#include <unistd.h> #elif defined(__OpenBSD__) #include <sys/param.h> #include <sys/sysctl.h> @@ -62,6 +67,32 @@ int ff_get_cpu_flags_ppc(void) if (err == 0) return has_vu ? AV_CPU_FLAG_ALTIVEC : 0; return 0; +#elif defined(__linux__) + // The linux kernel could have the altivec support disabled + // even if the cpu has it. + int i, ret = 0; + int fd = open("/proc/self/auxv", O_RDONLY); + unsigned long buf[64] = { 0 }; + ssize_t count; + + if (fd < 0) + return 0; + + while ((count = read(fd, buf, sizeof(buf))) > 0) { + for (i = 0; i < count / sizeof(*buf); i += 2) { + if (buf[i] == AT_NULL) + goto out; + if (buf[i] == AT_HWCAP) { + if (buf[i + 1] & PPC_FEATURE_HAS_ALTIVEC) + ret = AV_CPU_FLAG_ALTIVEC; + goto out; + } + } + } + +out: + close(fd); + return ret; #elif CONFIG_RUNTIME_CPUDETECT int proc_ver; // Support of mfspr PVR emulation added in Linux 2.6.17. |