Skip to content

Commit db9a42f

Browse files
committed
LoongArch64: using getauxval to do runtime check
Using the getauxval instruction can prevent errors caused by hardware supporting vector instructions while the kernel does not support them
1 parent d46772e commit db9a42f

File tree

1 file changed

+6
-12
lines changed

1 file changed

+6
-12
lines changed

cpuid_loongarch64.c

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3232
**********************************************************************************/
3333

3434
#include <stdint.h>
35+
#include <sys/auxv.h>
3536

3637
/* If LASX extension instructions supported,
3738
* using core LOONGSON3R5
@@ -46,9 +47,8 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4647
#define CPU_LOONGSON3R5 1
4748
#define CPU_LOONGSON2K1000 2
4849

49-
#define LOONGARCH_CFG2 0x02
50-
#define LOONGARCH_LASX 1<<7
51-
#define LOONGARCH_LSX 1<<6
50+
#define LA_HWCAP_LSX (1<<4)
51+
#define LA_HWCAP_LASX (1<<5)
5252

5353
static char *cpuname[] = {
5454
"LOONGSONGENERIC",
@@ -64,17 +64,11 @@ static char *cpuname_lower[] = {
6464

6565
int detect(void) {
6666
#ifdef __linux
67-
uint32_t reg = 0;
67+
int flag = (int)getauxval(AT_HWCAP);
6868

69-
__asm__ volatile (
70-
"cpucfg %0, %1 \n\t"
71-
: "+&r"(reg)
72-
: "r"(LOONGARCH_CFG2)
73-
);
74-
75-
if (reg & LOONGARCH_LASX)
69+
if (flag & LA_HWCAP_LASX)
7670
return CPU_LOONGSON3R5;
77-
else if (reg & LOONGARCH_LSX)
71+
else if (flag & LA_HWCAP_LSX)
7872
return CPU_LOONGSON2K1000;
7973
else
8074
return CPU_GENERIC;

0 commit comments

Comments
 (0)