2 * SPDX-License-Identifier: GPL-2.0-or-later
3 * Host specific cpu identification for ppc.
6 #include "qemu/osdep.h"
7 #include "host/cpuinfo.h"
10 # include <asm/cputable.h>
11 # ifdef CONFIG_GETAUXVAL
12 # include <sys/auxv.h>
18 # include <machine/cpu.h>
19 # ifndef PPC_FEATURE2_ARCH_3_1
20 # define PPC_FEATURE2_ARCH_3_1 0
22 # define PPC_FEATURE2_VEC_CRYPTO PPC_FEATURE2_HAS_VEC_CRYPTO
27 /* Called both as constructor and (possibly) via other constructors. */
28 unsigned __attribute__((constructor
)) cpuinfo_init(void)
30 unsigned info
= cpuinfo
;
36 info
= CPUINFO_ALWAYS
;
38 #if defined(CONFIG_LINUX) || defined(__FreeBSD__)
39 unsigned long hwcap
= qemu_getauxval(AT_HWCAP
);
40 unsigned long hwcap2
= qemu_getauxval(AT_HWCAP2
);
42 /* Version numbers are monotonic, and so imply all lower versions. */
43 if (hwcap2
& PPC_FEATURE2_ARCH_3_1
) {
44 info
|= CPUINFO_V3_1
| CPUINFO_V3_0
| CPUINFO_V2_07
| CPUINFO_V2_06
;
45 } else if (hwcap2
& PPC_FEATURE2_ARCH_3_00
) {
46 info
|= CPUINFO_V3_0
| CPUINFO_V2_07
| CPUINFO_V2_06
;
47 } else if (hwcap2
& PPC_FEATURE2_ARCH_2_07
) {
48 info
|= CPUINFO_V2_07
| CPUINFO_V2_06
;
49 } else if (hwcap
& PPC_FEATURE_ARCH_2_06
) {
50 info
|= CPUINFO_V2_06
;
53 if (hwcap2
& PPC_FEATURE2_ISEL
) {
56 if (hwcap
& PPC_FEATURE_HAS_ALTIVEC
) {
57 info
|= CPUINFO_ALTIVEC
;
58 /* We only care about the portion of VSX that overlaps Altivec. */
59 if (hwcap
& PPC_FEATURE_HAS_VSX
) {
62 * We use VSX especially for little-endian, but we should
63 * always have both anyway, since VSX came with Power7
64 * and crypto came with Power8.
66 if (hwcap2
& PPC_FEATURE2_VEC_CRYPTO
) {
67 info
|= CPUINFO_CRYPTO
;