Browse Source

Use elf_aux_info() on OpenBSD

NFC for ARMv7. For PowerPC move elf_aux_info() to higher priority over
sysctl for newer systems.
Brad Smith 1 week ago
parent
commit
b299e0de46
1 changed files with 10 additions and 11 deletions
  1. 10 11
      src/cpuinfo/SDL_cpuinfo.c

+ 10 - 11
src/cpuinfo/SDL_cpuinfo.c

@@ -38,13 +38,12 @@
 #endif
 #endif
 #if defined(SDL_PLATFORM_MACOS) && (defined(__ppc__) || defined(__ppc64__))
 #if defined(SDL_PLATFORM_MACOS) && (defined(__ppc__) || defined(__ppc64__))
 #include <sys/sysctl.h> // For AltiVec check
 #include <sys/sysctl.h> // For AltiVec check
-#elif defined(SDL_PLATFORM_OPENBSD) && defined(__powerpc__)
+#elif defined(SDL_PLATFORM_OPENBSD) && defined(__powerpc__) && !defined(HAVE_ELF_AUX_INFO)
 #include <sys/types.h>
 #include <sys/types.h>
 #include <sys/sysctl.h> // For AltiVec check
 #include <sys/sysctl.h> // For AltiVec check
 #include <machine/cpu.h>
 #include <machine/cpu.h>
-#elif defined(SDL_PLATFORM_FREEBSD) && defined(__powerpc__)
+#elif defined(SDL_PLATFORM_FREEBSD) && defined(__powerpc__) && defined(HAVE_ELF_AUX_INFO)
 #include <machine/cpu.h>
 #include <machine/cpu.h>
-#include <sys/auxv.h>
 #elif defined(SDL_ALTIVEC_BLITTERS) && defined(HAVE_SETJMP)
 #elif defined(SDL_ALTIVEC_BLITTERS) && defined(HAVE_SETJMP)
 #include <signal.h>
 #include <signal.h>
 #include <setjmp.h>
 #include <setjmp.h>
@@ -331,7 +330,12 @@ static int CPU_haveAltiVec(void)
 {
 {
     volatile int altivec = 0;
     volatile int altivec = 0;
 #ifndef SDL_CPUINFO_DISABLED
 #ifndef SDL_CPUINFO_DISABLED
-#if (defined(SDL_PLATFORM_MACOS) && (defined(__ppc__) || defined(__ppc64__))) || (defined(SDL_PLATFORM_OPENBSD) && defined(__powerpc__))
+#if (defined(SDL_PLATFORM_FREEBSD) || defined(SDL_PLATFORM_OPENBSD)) && defined(__powerpc__) && defined(HAVE_ELF_AUX_INFO)
+    unsigned long cpufeatures = 0;
+    elf_aux_info(AT_HWCAP, &cpufeatures, sizeof(cpufeatures));
+    altivec = cpufeatures & PPC_FEATURE_HAS_ALTIVEC;
+    return altivec;
+#elif (defined(SDL_PLATFORM_MACOS) && (defined(__ppc__) || defined(__ppc64__))) || (defined(SDL_PLATFORM_OPENBSD) && defined(__powerpc__))
 #ifdef SDL_PLATFORM_OPENBSD
 #ifdef SDL_PLATFORM_OPENBSD
     int selectors[2] = { CTL_MACHDEP, CPU_ALTIVEC };
     int selectors[2] = { CTL_MACHDEP, CPU_ALTIVEC };
 #else
 #else
@@ -343,11 +347,6 @@ static int CPU_haveAltiVec(void)
     if (0 == error) {
     if (0 == error) {
         altivec = (hasVectorUnit != 0);
         altivec = (hasVectorUnit != 0);
     }
     }
-#elif defined(SDL_PLATFORM_FREEBSD) && defined(__powerpc__)
-    unsigned long cpufeatures = 0;
-    elf_aux_info(AT_HWCAP, &cpufeatures, sizeof(cpufeatures));
-    altivec = cpufeatures & PPC_FEATURE_HAS_ALTIVEC;
-    return altivec;
 #elif defined(SDL_PLATFORM_LINUX) && defined(__powerpc__) && defined(HAVE_GETAUXVAL)
 #elif defined(SDL_PLATFORM_LINUX) && defined(__powerpc__) && defined(HAVE_GETAUXVAL)
     altivec = getauxval(AT_HWCAP) & PPC_FEATURE_HAS_ALTIVEC;
     altivec = getauxval(AT_HWCAP) & PPC_FEATURE_HAS_ALTIVEC;
 #elif defined(SDL_ALTIVEC_BLITTERS) && defined(HAVE_SETJMP)
 #elif defined(SDL_ALTIVEC_BLITTERS) && defined(HAVE_SETJMP)
@@ -483,8 +482,6 @@ static int CPU_haveNEON(void)
     return 0; // assume anything else from Apple doesn't have NEON.
     return 0; // assume anything else from Apple doesn't have NEON.
 #elif !defined(__arm__)
 #elif !defined(__arm__)
     return 0; // not an ARM CPU at all.
     return 0; // not an ARM CPU at all.
-#elif defined(SDL_PLATFORM_OPENBSD)
-    return 1; // OpenBSD only supports ARMv7 CPUs that have NEON.
 #elif defined(HAVE_ELF_AUX_INFO)
 #elif defined(HAVE_ELF_AUX_INFO)
     unsigned long hasneon = 0;
     unsigned long hasneon = 0;
     if (elf_aux_info(AT_HWCAP, (void *)&hasneon, (int)sizeof(hasneon)) != 0) {
     if (elf_aux_info(AT_HWCAP, (void *)&hasneon, (int)sizeof(hasneon)) != 0) {
@@ -519,6 +516,8 @@ static int CPU_haveNEON(void)
         }
         }
         return 0;
         return 0;
     }
     }
+#elif defined(SDL_PLATFORM_OPENBSD)
+    return 1; // OpenBSD only supports ARMv7 CPUs that have NEON.
 #elif defined(SDL_PLATFORM_EMSCRIPTEN)
 #elif defined(SDL_PLATFORM_EMSCRIPTEN)
     return 0;
     return 0;
 #else
 #else