10885f122SRichard Henderson /* 20885f122SRichard Henderson * SPDX-License-Identifier: GPL-2.0-or-later 30885f122SRichard Henderson * Host specific cpu identification for LoongArch. 40885f122SRichard Henderson */ 50885f122SRichard Henderson 60885f122SRichard Henderson #include "qemu/osdep.h" 70885f122SRichard Henderson #include "host/cpuinfo.h" 80885f122SRichard Henderson 90885f122SRichard Henderson #ifdef CONFIG_GETAUXVAL 100885f122SRichard Henderson # include <sys/auxv.h> 110885f122SRichard Henderson #else 120885f122SRichard Henderson # include "elf.h" 130885f122SRichard Henderson #endif 140885f122SRichard Henderson #include <asm/hwcap.h> 150885f122SRichard Henderson 160885f122SRichard Henderson unsigned cpuinfo; 170885f122SRichard Henderson 180885f122SRichard Henderson /* Called both as constructor and (possibly) via other constructors. */ cpuinfo_init(void)190885f122SRichard Hendersonunsigned __attribute__((constructor)) cpuinfo_init(void) 200885f122SRichard Henderson { 210885f122SRichard Henderson unsigned info = cpuinfo; 220885f122SRichard Henderson unsigned long hwcap; 230885f122SRichard Henderson 240885f122SRichard Henderson if (info) { 250885f122SRichard Henderson return info; 260885f122SRichard Henderson } 270885f122SRichard Henderson 280885f122SRichard Henderson hwcap = qemu_getauxval(AT_HWCAP); 290885f122SRichard Henderson 300885f122SRichard Henderson info = CPUINFO_ALWAYS; 310885f122SRichard Henderson info |= (hwcap & HWCAP_LOONGARCH_LSX ? CPUINFO_LSX : 0); 320885f122SRichard Henderson 330885f122SRichard Henderson cpuinfo = info; 340885f122SRichard Henderson return info; 350885f122SRichard Henderson } 36