/* * SPDX-License-Identifier: GPL-2.0-or-later * Host specific cpu identification for ppc. */ #include "qemu/osdep.h" #include "host/cpuinfo.h" #include #ifdef CONFIG_GETAUXVAL # include #else # include "elf.h" #endif unsigned cpuinfo; /* Called both as constructor and (possibly) via other constructors. */ unsigned __attribute__((constructor)) cpuinfo_init(void) { unsigned info = cpuinfo; unsigned long hwcap, hwcap2; if (info) { return info; } hwcap = qemu_getauxval(AT_HWCAP); hwcap2 = qemu_getauxval(AT_HWCAP2); info = CPUINFO_ALWAYS; /* Version numbers are monotonic, and so imply all lower versions. */ if (hwcap2 & PPC_FEATURE2_ARCH_3_1) { info |= CPUINFO_V3_1 | CPUINFO_V3_0 | CPUINFO_V2_07 | CPUINFO_V2_06; } else if (hwcap2 & PPC_FEATURE2_ARCH_3_00) { info |= CPUINFO_V3_0 | CPUINFO_V2_07 | CPUINFO_V2_06; } else if (hwcap2 & PPC_FEATURE2_ARCH_2_07) { info |= CPUINFO_V2_07 | CPUINFO_V2_06; } else if (hwcap & PPC_FEATURE_ARCH_2_06) { info |= CPUINFO_V2_06; } if (hwcap2 & PPC_FEATURE2_ISEL) { info |= CPUINFO_ISEL; } if (hwcap & PPC_FEATURE_HAS_ALTIVEC) { info |= CPUINFO_ALTIVEC; /* We only care about the portion of VSX that overlaps Altivec. */ if (hwcap & PPC_FEATURE_HAS_VSX) { info |= CPUINFO_VSX; /* * We use VSX especially for little-endian, but we should * always have both anyway, since VSX came with Power7 * and crypto came with Power8. */ if (hwcap2 & PPC_FEATURE2_VEC_CRYPTO) { info |= CPUINFO_CRYPTO; } } } cpuinfo = info; return info; }