[System] Authorization from referencesource
[mono-project.git] / mono / utils / mono-hwcap-ppc.c
blob174cc620a202c7af27d8012b11075f09d78d93ed
1 /*
2 * mono-hwcap-ppc.c: PowerPC hardware feature detection
4 * Authors:
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
19 * Licensed under the MIT license. See LICENSE file in the project root for full license information.
22 #include "mono/utils/mono-hwcap-ppc.h"
24 #if defined(__linux__) && defined(HAVE_SYS_AUXV_H)
25 #include <string.h>
26 #include <sys/auxv.h>
27 #endif
29 gboolean mono_hwcap_ppc_has_icache_snoop = FALSE;
30 gboolean mono_hwcap_ppc_is_isa_2x = FALSE;
31 gboolean mono_hwcap_ppc_is_isa_64 = FALSE;
32 gboolean mono_hwcap_ppc_has_move_fpr_gpr = FALSE;
33 gboolean mono_hwcap_ppc_has_multiple_ls_units = FALSE;
35 void
36 mono_hwcap_arch_init (void)
38 #if defined(__linux__) && defined(HAVE_SYS_AUXV_H)
39 unsigned long hwcap;
40 unsigned long platform;
42 if ((hwcap = getauxval(AT_HWCAP))) {
43 /* PPC_FEATURE_ICACHE_SNOOP */
44 if (hwcap & 0x00002000)
45 mono_hwcap_ppc_has_icache_snoop = TRUE;
47 /* PPC_FEATURE_POWER4, PPC_FEATURE_POWER5, PPC_FEATURE_POWER5_PLUS,
48 PPC_FEATURE_CELL_BE, PPC_FEATURE_PA6T, PPC_FEATURE_ARCH_2_05 */
49 if (hwcap & (0x00080000 | 0x00040000 | 0x00020000 | 0x00010000 | 0x00000800 | 0x00001000))
50 mono_hwcap_ppc_is_isa_2x = TRUE;
52 /* PPC_FEATURE_64 */
53 if (hwcap & 0x40000000)
54 mono_hwcap_ppc_is_isa_64 = TRUE;
56 /* PPC_FEATURE_POWER6_EXT */
57 if (hwcap & 0x00000200)
58 mono_hwcap_ppc_has_move_fpr_gpr = TRUE;
61 if ((platform = getauxval(AT_PLATFORM))) {
62 const char *str = (const char *) platform;
64 if (!strcmp (str, "ppc970") || (!strncmp (str, "power", 5) && str [5] >= '4' && str [5] <= '7'))
65 mono_hwcap_ppc_has_multiple_ls_units = TRUE;
67 #endif
70 void
71 mono_hwcap_print (FILE* f)
73 g_fprintf (f, "mono_hwcap_ppc_has_icache_snoop = %i\n", mono_hwcap_ppc_has_icache_snoop);
74 g_fprintf (f, "mono_hwcap_ppc_is_isa_2x = %i\n", mono_hwcap_ppc_is_isa_2x);
75 g_fprintf (f, "mono_hwcap_ppc_is_isa_64 = %i\n", mono_hwcap_ppc_is_isa_64);
76 g_fprintf (f, "mono_hwcap_ppc_has_move_fpr_gpr = %i\n", mono_hwcap_ppc_has_move_fpr_gpr);
77 g_fprintf (f, "mono_hwcap_ppc_has_multiple_ls_units = %i\n", mono_hwcap_ppc_has_multiple_ls_units);