http://pkgs.fedoraproject.org/gitweb/?p=libvisual.git;a=tree --- a/libvisual/lv_cpu.c +++ b/libvisual/lv_cpu.c @@ -50,8 +50,19 @@ #endif #if defined(VISUAL_OS_LINUX) +#if defined(VISUAL_ARCH_POWERPC) +#include +#include +#include +#include +#include + +#include +#include +#else /* VISUAL_ARCH_POWERPC */ #include #endif +#endif #if defined(VISUAL_OS_WIN32) #include @@ -154,6 +165,46 @@ static void check_os_altivec_support( vo if (err == 0) if (has_vu != 0) __lv_cpu_caps.hasAltiVec = 1; +#elif defined (VISUAL_OS_LINUX) + static int available = -1; + int new_avail = 0; + char fname[64]; + unsigned long buf[64]; + ssize_t count; + pid_t pid; + int fd, i; + + if (available != -1) + return; + + pid = getpid(); + snprintf(fname, sizeof(fname)-1, "/proc/%d/auxv", pid); + + fd = open(fname, O_RDONLY); + if (fd < 0) + goto out; +more: + count = read(fd, buf, sizeof(buf)); + if (count < 0) + goto out_close; + + for (i=0; i < (count / sizeof(unsigned long)); i += 2) { + if (buf[i] == AT_HWCAP) { + new_avail = !!(buf[i+1] & PPC_FEATURE_HAS_ALTIVEC); + goto out_close; + } else if (buf[i] == AT_NULL) { + goto out_close; + } + } + + if (count == sizeof(buf)) + goto more; +out_close: + close(fd); +out: + available = new_avail; + if (available) + __lv_cpu_caps.hasAltiVec = 1; #else /* !VISUAL_OS_DARWIN */ /* no Darwin, do it the brute-force way */ /* this is borrowed from the libmpeg2 library */