cpuinfo: Patched to compile on Android, Linux.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
diff --git a/src/cpuinfo/SDL_cpuinfo.c b/src/cpuinfo/SDL_cpuinfo.c
index 5366fbb..b241cb5 100644
--- a/src/cpuinfo/SDL_cpuinfo.c
+++ b/src/cpuinfo/SDL_cpuinfo.c
@@ -50,10 +50,11 @@
#include <setjmp.h>
#endif
-#if defined(__LINUX__) || defined(__ANDROID__) && defined(__ARM_ARCH)
-#include <sys/auxv.h>
+#if (defined(__LINUX__) || defined(__ANDROID__)) && defined(__ARM_ARCH)
#include <asm/hwcap.h>
-#if !defined HAVE_GETAUXVAL
+#if defined HAVE_GETAUXVAL
+#include <sys/auxv.h>
+#else
#include <fcntl.h>
#endif
#endif
@@ -297,27 +298,22 @@ CPU_haveAltiVec(void)
return altivec;
}
-#if (defined(__LINUX__) || defined(__ANDROID__)) && !defined(HAVE_GETAUXVAL)
+#if (defined(__LINUX__) || defined(__ANDROID__)) && defined(__ARM_ARCH) && !defined(HAVE_GETAUXVAL)
static int
readProcAuxvForNeon(void)
{
int neon = 0;
int kv[2];
const int fd = open("/proc/self/auxv", O_RDONLY);
-
- if (fd == -1) {
- return 0;
- }
-
- while (read(fd, kv, sizeof (kv)) == sizeof (kv)) {
- if (kv[0] == AT_HWCAP) {
- neon = ((kv[1] & HWCAP_NEON) == HWCAP_NEON);
- break;
+ if (fd != -1) {
+ while (read(fd, kv, sizeof (kv)) == sizeof (kv)) {
+ if (kv[0] == AT_HWCAP) {
+ neon = ((kv[1] & HWCAP_NEON) == HWCAP_NEON);
+ break;
+ }
}
+ close(fd);
}
-
- close(fd);
-
return neon;
}
#endif
@@ -338,11 +334,10 @@ CPU_haveNEON(void)
size_t length = sizeof (neon);
const int error = sysctlbyname("hw.optional.neon", &neon, &length, NULL, 0);
return (!error) && (neon != 0);
-/* Android offers a static library for this but all it does is parse /proc/cpuinfo */
#elif (defined(__LINUX__) || defined(__ANDROID__)) && defined(HAVE_GETAUXVAL)
return ((getauxval(AT_HWCAP) & HWCAP_NEON) == HWCAP_NEON)
#elif (defined(__LINUX__) || defined(__ANDROID__))
- return readProcAuxvForNeon();
+ return readProcAuxvForNeon(); /* Android offers a static library for this, but it just parses /proc/self/auxv */
#elif (defined(__WINDOWS__) || defined(__WINRT__)) && defined(_M_ARM)
/* All WinRT ARM devices are required to support NEON, but just in case. */
return IsProcessorFeaturePresent(PF_ARM_NEON_INSTRUCTIONS_AVAILABLE) != 0;