1*0885f122SRichard Henderson /* 2*0885f122SRichard Henderson * SPDX-License-Identifier: GPL-2.0-or-later 3*0885f122SRichard Henderson * Host specific cpu identification for LoongArch. 4*0885f122SRichard Henderson */ 5*0885f122SRichard Henderson 6*0885f122SRichard Henderson #include "qemu/osdep.h" 7*0885f122SRichard Henderson #include "host/cpuinfo.h" 8*0885f122SRichard Henderson 9*0885f122SRichard Henderson #ifdef CONFIG_GETAUXVAL 10*0885f122SRichard Henderson # include <sys/auxv.h> 11*0885f122SRichard Henderson #else 12*0885f122SRichard Henderson # include "elf.h" 13*0885f122SRichard Henderson #endif 14*0885f122SRichard Henderson #include <asm/hwcap.h> 15*0885f122SRichard Henderson 16*0885f122SRichard Henderson unsigned cpuinfo; 17*0885f122SRichard Henderson 18*0885f122SRichard Henderson /* Called both as constructor and (possibly) via other constructors. */ cpuinfo_init(void)19*0885f122SRichard Hendersonunsigned __attribute__((constructor)) cpuinfo_init(void) 20*0885f122SRichard Henderson { 21*0885f122SRichard Henderson unsigned info = cpuinfo; 22*0885f122SRichard Henderson unsigned long hwcap; 23*0885f122SRichard Henderson 24*0885f122SRichard Henderson if (info) { 25*0885f122SRichard Henderson return info; 26*0885f122SRichard Henderson } 27*0885f122SRichard Henderson 28*0885f122SRichard Henderson hwcap = qemu_getauxval(AT_HWCAP); 29*0885f122SRichard Henderson 30*0885f122SRichard Henderson info = CPUINFO_ALWAYS; 31*0885f122SRichard Henderson info |= (hwcap & HWCAP_LOONGARCH_LSX ? CPUINFO_LSX : 0); 32*0885f122SRichard Henderson 33*0885f122SRichard Henderson cpuinfo = info; 34*0885f122SRichard Henderson return info; 35*0885f122SRichard Henderson } 36