Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions libvisual/libvisual/lv_cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,19 @@
#endif

#if defined(VISUAL_OS_LINUX)
#if defined(VISUAL_ARCH_POWERPC)
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

#include <linux/auxvec.h>
#include <asm/cputable.h>
#else /* VISUAL_ARCH_POWERPC */
#include <signal.h>
#endif
#endif

#if defined(VISUAL_OS_WIN32)
#include <windows.h>
Expand Down Expand Up @@ -154,6 +165,46 @@ static void check_os_altivec_support( void )
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 */
Expand Down