2 * mono-hwcap-arm.c: ARM hardware feature detection
5 * Alex Rønne Petersen (alexrp@xamarin.com)
6 * Elijah Taylor (elijahtaylor@google.com)
7 * Miguel de Icaza (miguel@xamarin.com)
8 * Neale Ferguson (Neale.Ferguson@SoftwareAG-usa.com)
9 * Paolo Molaro (lupus@xamarin.com)
10 * Rodrigo Kumpera (kumpera@gmail.com)
11 * Sebastien Pouliot (sebastien@xamarin.com)
12 * Zoltan Varga (vargaz@xamarin.com)
14 * Copyright 2003 Ximian, Inc.
15 * Copyright 2003-2011 Novell, Inc
16 * Copyright 2006 Broadcom
17 * Copyright 2007-2008 Andreas Faerber
18 * Copyright 2011-2013 Xamarin Inc
21 #include "mono/utils/mono-hwcap-arm.h"
23 #if defined(PLATFORM_ANDROID)
25 #elif defined(__linux__)
29 gboolean mono_hwcap_arm_is_v5 = FALSE;
30 gboolean mono_hwcap_arm_is_v6 = FALSE;
31 gboolean mono_hwcap_arm_is_v7 = FALSE;
32 gboolean mono_hwcap_arm_is_v7s = FALSE;
33 gboolean mono_hwcap_arm_has_vfp = FALSE;
34 gboolean mono_hwcap_arm_has_thumb = FALSE;
35 gboolean mono_hwcap_arm_has_thumb2 = FALSE;
38 mono_hwcap_init (void)
40 #if defined(PLATFORM_ANDROID)
41 /* We can't use the auxiliary vector on Android due to
42 * permissions, so fall back to /proc/cpuinfo.
48 FILE *file = fopen ("/proc/cpuinfo", "r");
51 while ((line = fgets (buf, 512, file))) {
52 if (!strncmp (line, "Processor", 9)) {
53 char *ver = strstr (line, "(v");
57 mono_hwcap_arm_is_v5 = TRUE;
60 mono_hwcap_arm_is_v6 = TRUE;
63 mono_hwcap_arm_is_v7 = TRUE;
65 /* TODO: Find a way to detect v7s. */
71 if (!strncmp (line, "Features", 8)) {
72 char *thumb = strstr (line, "thumb");
75 mono_hwcap_arm_has_thumb = TRUE;
77 /* TODO: Find a way to detect Thumb 2. */
79 char *vfp = strstr (line, "vfp")
82 mono_hwcap_arm_has_vfp = TRUE;
90 #elif defined(__linux__)
92 unsigned long platform;
94 if ((hwcap = getauxval(AT_HWCAP))) {
96 if (hwcap & 0x00000004)
97 mono_hwcap_arm_has_thumb = TRUE;
100 if (hwcap & 0x00000064)
101 mono_hwcap_arm_has_vfp = TRUE;
103 /* TODO: Find a way to detect Thumb 2. */
106 if ((platform = getauxval(AT_PLATFORM))) {
107 const char *str = (const char *) platform;
110 mono_hwcap_arm_is_v5 = TRUE;
113 mono_hwcap_arm_is_v6 = TRUE;
116 mono_hwcap_arm_is_v7 = TRUE;
118 /* TODO: Find a way to detect v7s. */