* 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;
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. */
}
}
/* 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
}
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);
}