ARM CPU指令支持情况获取

18 阅读1分钟

在代码review的时候,发现代码直接调用一些指令,不考虑CPU差异,在一些机型下报非法指令的错误,会导致用户程序崩溃。对于不支持的平台上就应该屏蔽掉该功能。 本来建议使用的lscpu,通过grep获取flags对应的指令,比如aes,然后编译时通过宏控制,对不支持的功能不进行编译,或者进行代码报错处理。发现这样编译的程序不通用,需要为不通的机型编译不同的二进制程序,最好能动态获取指令支持的情况。

lscpu.png

上面这个机器是在龙蜥实验室临时借用的阿里云机器,想要学习的同学可以访问https://lab.openanolis.cn/注册个账号试试,也支持付费使用的。

通过网络搜索,查找到了getauxval方法。


#include <stdio.h>
#include <sys/auxv.h>
#include <asm/hwcap.h>

int main()
{
    long hwcaps= getauxval(AT_HWCAP);

    if(hwcaps & HWCAP_AES){
        printf("AES instructions are available\n");
    }
    if(hwcaps & HWCAP_CRC32){
        printf("CRC32 instructions are available\n");
    }
    if(hwcaps & HWCAP_PMULL){
        printf("PMULL/PMULL2 instructions that operate on 64-bit data are available\n");
    }
    if(hwcaps & HWCAP_SHA1){
        printf("SHA1 instructions are available\n");
    }
    if(hwcaps & HWCAP_SHA2){
        printf("SHA2 instructions are available\n");
    }

    return 0;
}

test_cpu.png

可以看到支持的情况跟lscpu一致。