First set of licensing changes
[mono.git] / mono / utils / mono-hwcap-arm.c
index 7059938fb575840c66a54f14b69663d36f8eb9d4..6cf8065d06a43e421bfb59737800ff73536d3f86 100644 (file)
  * Copyright 2006 Broadcom
  * Copyright 2007-2008 Andreas Faerber
  * Copyright 2011-2013 Xamarin Inc
+ * Licensed under the MIT license. See LICENSE file in the project root for full license information.
  */
 
 #include "mono/utils/mono-hwcap-arm.h"
 
-#if defined(PLATFORM_ANDROID)
-#include <stdio.h>
-#elif defined(__linux__) && defined(HAVE_SYS_AUXV_H)
+#if defined(HAVE_SYS_AUXV_H) && !defined(PLATFORM_ANDROID)
 #include <sys/auxv.h>
 #elif defined(__APPLE__)
 #include <mach/machine.h>
 #include <sys/sysctl.h>
 #include <sys/types.h>
+#else
+#include <stdio.h>
 #endif
 
 gboolean mono_hwcap_arm_is_v5 = FALSE;
 gboolean mono_hwcap_arm_is_v6 = FALSE;
 gboolean mono_hwcap_arm_is_v7 = FALSE;
-gboolean mono_hwcap_arm_is_v7s = FALSE;
 gboolean mono_hwcap_arm_has_vfp = FALSE;
+gboolean mono_hwcap_arm_has_vfp3 = FALSE;
+gboolean mono_hwcap_arm_has_vfp3_d16 = FALSE;
 gboolean mono_hwcap_arm_has_thumb = FALSE;
 gboolean mono_hwcap_arm_has_thumb2 = FALSE;
 
 void
 mono_hwcap_arch_init (void)
 {
-#if defined(PLATFORM_ANDROID)
-       /* We can't use the auxiliary vector on Android due to
-        * permissions, so fall back to /proc/cpuinfo.
-        */
-
-       char buf [512];
-       char *line;
-
-       FILE *file = fopen ("/proc/cpuinfo", "r");
-
-       if (file) {
-               while ((line = fgets (buf, 512, file))) {
-                       if (!strncmp (line, "Processor", 9)) {
-                               char *ver = strstr (line, "(v");
-
-                               if (ver) {
-                                       if (ver [2] >= '5')
-                                               mono_hwcap_arm_is_v5 = TRUE;
-
-                                       if (ver [2] >= '6')
-                                               mono_hwcap_arm_is_v6 = TRUE;
-
-                                       if (ver [2] >= '7')
-                                               mono_hwcap_arm_is_v7 = TRUE;
-
-                                       /* TODO: Find a way to detect v7s. */
-                               }
-
-                               continue;
-                       }
-
-                       if (!strncmp (line, "Features", 8)) {
-                               char *thumb = strstr (line, "thumb");
-
-                               if (thumb)
-                                       mono_hwcap_arm_has_thumb = TRUE;
-
-                               /* TODO: Find a way to detect Thumb 2. */
-
-                               char *vfp = strstr (line, "vfp")
-
-                               if (vfp)
-                                       mono_hwcap_arm_has_vfp = TRUE;
-
-                               continue;
-                       }
-               }
-
-               fclose (file);
-       }
-#elif defined(__linux__) && defined(HAVE_SYS_AUXV_H)
+#if defined(HAVE_SYS_AUXV_H) && !defined(PLATFORM_ANDROID)
        unsigned long hwcap;
        unsigned long platform;
 
@@ -101,9 +53,17 @@ mono_hwcap_arch_init (void)
                        mono_hwcap_arm_has_thumb = TRUE;
 
                /* HWCAP_ARM_VFP */
-               if (hwcap & 0x00000064)
+               if (hwcap & 0x00000040)
                        mono_hwcap_arm_has_vfp = TRUE;
 
+               /* HWCAP_ARM_VFPv3 */
+               if (hwcap & 0x00002000)
+                       mono_hwcap_arm_has_vfp3 = TRUE;
+
+               /* HWCAP_ARM_VFPv3D16 */
+               if (hwcap & 0x00004000)
+                       mono_hwcap_arm_has_vfp3_d16 = TRUE;
+
                /* TODO: Find a way to detect Thumb 2. */
        }
 
@@ -139,6 +99,59 @@ mono_hwcap_arch_init (void)
        }
 
        /* TODO: Find a way to detect features like Thumb and VFP. */
+#else
+       /* We can't use the auxiliary vector on Android due to
+        * permissions, so fall back to /proc/cpuinfo. We also
+        * hit this path if the target doesn't have sys/auxv.h.
+        */
+
+       char buf [512];
+       char *line;
+
+       FILE *file = fopen ("/proc/cpuinfo", "r");
+
+       if (file) {
+               while ((line = fgets (buf, 512, file))) {
+                       if (!strncmp (line, "Processor", 9)) {
+                               char *ver = strstr (line, "(v");
+
+                               if (ver) {
+                                       if (ver [2] >= '5')
+                                               mono_hwcap_arm_is_v5 = TRUE;
+
+                                       if (ver [2] >= '6')
+                                               mono_hwcap_arm_is_v6 = TRUE;
+
+                                       if (ver [2] >= '7')
+                                               mono_hwcap_arm_is_v7 = TRUE;
+
+                                       /* TODO: Find a way to detect v7s. */
+                               }
+
+                               continue;
+                       }
+
+                       if (!strncmp (line, "Features", 8)) {
+                               if (strstr (line, "thumb"))
+                                       mono_hwcap_arm_has_thumb = TRUE;
+
+                               /* TODO: Find a way to detect Thumb 2. */
+
+                               if (strstr (line, "vfp"))
+                                       mono_hwcap_arm_has_vfp = TRUE;
+
+                               if (strstr (line, "vfpv3"))
+                                       mono_hwcap_arm_has_vfp3 = TRUE;
+
+                               if (strstr (line, "vfpv3-d16"))
+                                       mono_hwcap_arm_has_vfp3_d16 = TRUE;
+
+                               continue;
+                       }
+               }
+
+               fclose (file);
+       }
 #endif
 }
 
@@ -148,8 +161,9 @@ mono_hwcap_print(FILE *f)
        g_fprintf (f, "mono_hwcap_arm_is_v5 = %i\n", mono_hwcap_arm_is_v5);
        g_fprintf (f, "mono_hwcap_arm_is_v6 = %i\n", mono_hwcap_arm_is_v6);
        g_fprintf (f, "mono_hwcap_arm_is_v7 = %i\n", mono_hwcap_arm_is_v7);
-       g_fprintf (f, "mono_hwcap_arm_is_v7s = %i\n", mono_hwcap_arm_is_v7s);
        g_fprintf (f, "mono_hwcap_arm_has_vfp = %i\n", mono_hwcap_arm_has_vfp);
+       g_fprintf (f, "mono_hwcap_arm_has_vfp3 = %i\n", mono_hwcap_arm_has_vfp3);
+       g_fprintf (f, "mono_hwcap_arm_has_vfp3_d16 = %i\n", mono_hwcap_arm_has_vfp3_d16);
        g_fprintf (f, "mono_hwcap_arm_has_thumb = %i\n", mono_hwcap_arm_has_thumb);
        g_fprintf (f, "mono_hwcap_arm_has_thumb2 = %i\n", mono_hwcap_arm_has_thumb2);
 }