2 * mono-hwcap-ppc.c: PowerPC 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-ppc.h"
23 #if defined(__linux__) && defined(HAVE_SYS_AUXV_H)
28 gboolean mono_hwcap_ppc_has_icache_snoop
= FALSE
;
29 gboolean mono_hwcap_ppc_is_isa_2x
= FALSE
;
30 gboolean mono_hwcap_ppc_is_isa_64
= FALSE
;
31 gboolean mono_hwcap_ppc_has_move_fpr_gpr
= FALSE
;
32 gboolean mono_hwcap_ppc_has_multiple_ls_units
= FALSE
;
35 mono_hwcap_arch_init (void)
37 #if defined(__linux__) && defined(HAVE_SYS_AUXV_H)
39 unsigned long platform
;
41 if ((hwcap
= getauxval(AT_HWCAP
))) {
42 /* PPC_FEATURE_ICACHE_SNOOP */
43 if (hwcap
& 0x00002000)
44 mono_hwcap_ppc_has_icache_snoop
= TRUE
;
46 /* PPC_FEATURE_POWER4, PPC_FEATURE_POWER5, PPC_FEATURE_POWER5_PLUS,
47 PPC_FEATURE_CELL_BE, PPC_FEATURE_PA6T, PPC_FEATURE_ARCH_2_05 */
48 if (hwcap
& (0x00080000 | 0x00040000 | 0x00020000 | 0x00010000 | 0x00000800 | 0x00001000))
49 mono_hwcap_ppc_is_isa_2x
= TRUE
;
52 if (hwcap
& 0x40000000)
53 mono_hwcap_ppc_is_isa_64
= TRUE
;
55 /* PPC_FEATURE_POWER6_EXT */
56 if (hwcap
& 0x00000200)
57 mono_hwcap_ppc_has_move_fpr_gpr
= TRUE
;
60 if ((platform
= getauxval(AT_PLATFORM
))) {
61 const char *str
= (const char *) platform
;
63 if (!strcmp (str
, "ppc970") || (!strncmp (str
, "power", 5) && str
[5] >= '4' && str
[5] <= '7'))
64 mono_hwcap_ppc_has_multiple_ls_units
= TRUE
;
70 mono_hwcap_print (FILE* f
)
72 g_fprintf (f
, "mono_hwcap_ppc_has_icache_snoop = %i\n", mono_hwcap_ppc_has_icache_snoop
);
73 g_fprintf (f
, "mono_hwcap_ppc_is_isa_2x = %i\n", mono_hwcap_ppc_is_isa_2x
);
74 g_fprintf (f
, "mono_hwcap_ppc_is_isa_64 = %i\n", mono_hwcap_ppc_is_isa_64
);
75 g_fprintf (f
, "mono_hwcap_ppc_has_move_fpr_gpr = %i\n", mono_hwcap_ppc_has_move_fpr_gpr
);
76 g_fprintf (f
, "mono_hwcap_ppc_has_multiple_ls_units = %i\n", mono_hwcap_ppc_has_multiple_ls_units
);