X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Futils%2Fmono-hwcap-arm.c;h=01816d8c93a702e0e73fcbd333fc7a440fcf9181;hb=c39718bbb394fe97281e6e64945b4572bef29121;hp=138ad7c2f7667d16ce7e037c62f0a471e77ef7fc;hpb=77d2f31ac15486f20162c0d4455a62d2191e6b16;p=mono.git diff --git a/mono/utils/mono-hwcap-arm.c b/mono/utils/mono-hwcap-arm.c index 138ad7c2f76..01816d8c93a 100644 --- a/mono/utils/mono-hwcap-arm.c +++ b/mono/utils/mono-hwcap-arm.c @@ -20,14 +20,14 @@ #include "mono/utils/mono-hwcap-arm.h" -#if defined(PLATFORM_ANDROID) -#include -#elif defined(__linux__) && defined(HAVE_SYS_AUXV_H) +#if defined(HAVE_SYS_AUXV_H) && !defined(PLATFORM_ANDROID) #include #elif defined(__APPLE__) #include #include #include +#else +#include #endif gboolean mono_hwcap_arm_is_v5 = FALSE; @@ -35,6 +35,8 @@ 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; @@ -47,53 +49,7 @@ mono_hwcap_arch_init (void) 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)) { - 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; - - 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; @@ -103,9 +59,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. */ } @@ -141,6 +105,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 } #endif @@ -153,6 +170,8 @@ mono_hwcap_print(FILE *f) 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); }