RISC-V 硬件探测接口¶
RISC-V 硬件探测接口基于单个系统调用,定义在 <asm/hwprobe.h> 中
struct riscv_hwprobe {
__s64 key;
__u64 value;
};
long sys_riscv_hwprobe(struct riscv_hwprobe *pairs, size_t pair_count,
size_t cpusetsize, cpu_set_t *cpus,
unsigned int flags);
参数分为三组:键-值对数组、CPU 集合和一些标志。键-值对随附一个计数。用户空间必须预先填充每个元素的 key 字段,如果内核识别该键,则会填充 value。如果内核不认识某个键,其 key 字段将被清为 -1,其 value 设为 0。CPU 集合由 CPU_SET(3) 定义,大小为 cpusetsize 字节。对于类值键(例如 vendor、arch、impl),只有当给定集合中的所有 CPU 具有相同值时,返回的值才有效。否则将返回 -1。对于类布尔键,返回的值将是指定 CPU 值的逻辑与。作为所有在线 CPU 的快捷方式,用户模式可以为 cpus 提供 NULL,为 cpusetsize 提供 0. 当前支持的标志有
RISCV_HWPROBE_WHICH_CPUS:此标志基本上颠倒了sys_riscv_hwprobe()的行为。它不是为给定的 CPU 集合填充键的值,而是给定每个键的值,并由sys_riscv_hwprobe()将 CPU 集合缩减为仅匹配每个键-值对的那些 CPU。如何匹配取决于键的类型。对于类值键,匹配意味着与该值完全相同。对于类布尔键,匹配意味着该对的值与 CPU 值的逻辑与结果完全等于该对的值。此外,当cpus为空集时,它将被初始化为适合其中的所有在线 CPU,即返回的 CPU 集合是可以用大小为cpusetsize的 CPU 集合表示的所有在线 CPU 的缩减。
所有其他标志均保留以用于将来兼容,并且必须为零。
成功时返回 0,失败时返回负的错误码。
定义了以下键
RISCV_HWPROBE_KEY_MVENDORID:包含由 RISC-V 特权架构规范定义的mvendorid的值。RISCV_HWPROBE_KEY_MARCHID:包含由 RISC-V 特权架构规范定义的marchid的值。RISCV_HWPROBE_KEY_MIMPID:包含由 RISC-V 特权架构规范定义的mimpid的值。RISCV_HWPROBE_KEY_BASE_BEHAVIOR:包含此内核支持的基本用户可见行为的位掩码。定义了以下基本用户 ABIRISCV_HWPROBE_BASE_BEHAVIOR_IMA:支持 rv32ima 或 rv64ima,由用户 ISA 2.2 版和特权 ISA 1.10 版定义,有以下已知例外(可能会添加更多例外,但前提是能够证明用户 ABI 未被破坏)用户空间程序不能直接执行
fence.i指令(它仍然可以通过内核控制的机制(如 vDSO)在用户空间中执行)。
RISCV_HWPROBE_KEY_IMA_EXT_0:包含与RISCV_HWPROBE_BASE_BEHAVIOR_IMA基本系统行为兼容的扩展的位掩码。RISCV_HWPROBE_IMA_FD:支持 F 和 D 扩展,由 RISC-V ISA 手册的提交 cd20cee(“FMIN/FMAX now implement minimumNumber/maximumNumber, not minNum/maxNum”)定义。RISCV_HWPROBE_IMA_C:支持 C 扩展,由 RISC-V ISA 手册 2.2 版定义。RISCV_HWPROBE_IMA_V:支持 V 扩展,由 RISC-V 向量扩展手册 1.0 版定义。RISCV_HWPROBE_EXT_ZBA:支持 Zba 地址生成扩展,如位操作 ISA 扩展 1.0 版中所定义。RISCV_HWPROBE_EXT_ZBB:支持 Zbb 扩展,如位操作 ISA 扩展 1.0 版中所定义。RISCV_HWPROBE_EXT_ZBS:支持 Zbs 扩展,如位操作 ISA 扩展 1.0 版中所定义。RISCV_HWPROBE_EXT_ZICBOZ:支持 Zicboz 扩展,已在 riscv-CMOs 的提交 3dd606f(“Create cmobase-v1.0.pdf”)中正式批准。RISCV_HWPROBE_EXT_ZBC支持 Zbc 扩展,如位操作 ISA 扩展 1.0 版中所定义。RISCV_HWPROBE_EXT_ZBKB支持 Zbkb 扩展,如标量密码学 ISA 扩展 1.0 版中所定义。RISCV_HWPROBE_EXT_ZBKC支持 Zbkc 扩展,如标量密码学 ISA 扩展 1.0 版中所定义。RISCV_HWPROBE_EXT_ZBKX支持 Zbkx 扩展,如标量密码学 ISA 扩展 1.0 版中所定义。RISCV_HWPROBE_EXT_ZKND支持 Zknd 扩展,如标量密码学 ISA 扩展 1.0 版中所定义。RISCV_HWPROBE_EXT_ZKNE支持 Zkne 扩展,如标量密码学 ISA 扩展 1.0 版中所定义。RISCV_HWPROBE_EXT_ZKNH支持 Zknh 扩展,如标量密码学 ISA 扩展 1.0 版中所定义。RISCV_HWPROBE_EXT_ZKSED支持 Zksed 扩展,如标量密码学 ISA 扩展 1.0 版中所定义。RISCV_HWPROBE_EXT_ZKSH支持 Zksh 扩展,如标量密码学 ISA 扩展 1.0 版中所定义。RISCV_HWPROBE_EXT_ZKT支持 Zkt 扩展,如标量密码学 ISA 扩展 1.0 版中所定义。RISCV_HWPROBE_EXT_ZVBB:支持 Zvbb 扩展,如 RISC-V 密码学扩展第二卷 1.0 版中所定义。RISCV_HWPROBE_EXT_ZVBC:支持 Zvbc 扩展,如 RISC-V 密码学扩展第二卷 1.0 版中所定义。RISCV_HWPROBE_EXT_ZVKB:支持 Zvkb 扩展,如 RISC-V 密码学扩展第二卷 1.0 版中所定义。RISCV_HWPROBE_EXT_ZVKG:支持 Zvkg 扩展,如 RISC-V 密码学扩展第二卷 1.0 版中所定义。RISCV_HWPROBE_EXT_ZVKNED:支持 Zvkned 扩展,如 RISC-V 密码学扩展第二卷 1.0 版中所定义。RISCV_HWPROBE_EXT_ZVKNHA:支持 Zvknha 扩展,如 RISC-V 密码学扩展第二卷 1.0 版中所定义。RISCV_HWPROBE_EXT_ZVKNHB:支持 Zvknhb 扩展,如 RISC-V 密码学扩展第二卷 1.0 版中所定义。RISCV_HWPROBE_EXT_ZVKSED:支持 Zvksed 扩展,如 RISC-V 密码学扩展第二卷 1.0 版中所定义。RISCV_HWPROBE_EXT_ZVKSH:支持 Zvksh 扩展,如 RISC-V 密码学扩展第二卷 1.0 版中所定义。RISCV_HWPROBE_EXT_ZVKT:支持 Zvkt 扩展,如 RISC-V 密码学扩展第二卷 1.0 版中所定义。RISCV_HWPROBE_EXT_ZFH:支持 Zfh 扩展 1.0 版,如 RISC-V ISA 手册中所定义。RISCV_HWPROBE_EXT_ZFHMIN:支持 Zfhmin 扩展 1.0 版,如 RISC-V ISA 手册中所定义。RISCV_HWPROBE_EXT_ZIHINTNTL:支持 Zihintntl 扩展 1.0 版,如 RISC-V ISA 手册中所定义。RISCV_HWPROBE_EXT_ZVFH:支持 Zvfh 扩展,如 RISC-V 向量手册中从提交 commit e2ccd0548d6c(“Remove draft warnings from Zvfh[min]”)开始所定义。RISCV_HWPROBE_EXT_ZVFHMIN:支持 Zvfhmin 扩展,如 RISC-V 向量手册中从提交 commit e2ccd0548d6c(“Remove draft warnings from Zvfh[min]”)开始所定义。RISCV_HWPROBE_EXT_ZFA:支持 Zfa 扩展,如 RISC-V ISA 手册中从提交 commit 056b6ff467c7(“Zfa is ratified”)开始所定义。RISCV_HWPROBE_EXT_ZTSO:支持 Ztso 扩展,如 RISC-V ISA 手册中从提交 commit 5618fb5a216b(“Ztso is now ratified.”)开始所定义。RISCV_HWPROBE_EXT_ZACAS:支持 Zacas 扩展,如原子比较并交换(CAS)指令手册中从提交 commit 5059e0ca641c(“update to ratified”)开始所定义。RISCV_HWPROBE_EXT_ZICNTR:支持 Zicntr 扩展 2.0 版,如 RISC-V ISA 手册中所定义。RISCV_HWPROBE_EXT_ZICOND:支持 Zicond 扩展,如 RISC-V 整数条件(Zicond)操作扩展手册中从提交 95cf1f9(“Add changes requested by Ved during signoff”)开始所定义。RISCV_HWPROBE_EXT_ZIHINTPAUSE:支持 Zihintpause 扩展,如 RISC-V ISA 手册中从提交 commit d8ab5c78c207(“Zihintpause is ratified”)开始所定义。RISCV_HWPROBE_EXT_ZIHPM:支持 Zihpm 扩展 2.0 版,如 RISC-V ISA 手册中所定义。RISCV_HWPROBE_EXT_ZVE32X:支持向量子扩展 Zve32x,由 RISC-V 向量扩展手册 1.0 版定义。RISCV_HWPROBE_EXT_ZVE32F:支持向量子扩展 Zve32f,由 RISC-V 向量扩展手册 1.0 版定义。RISCV_HWPROBE_EXT_ZVE64X:支持向量子扩展 Zve64x,由 RISC-V 向量扩展手册 1.0 版定义。RISCV_HWPROBE_EXT_ZVE64F:支持向量子扩展 Zve64f,由 RISC-V 向量扩展手册 1.0 版定义。RISCV_HWPROBE_EXT_ZVE64D:支持向量子扩展 Zve64d,由 RISC-V 向量扩展手册 1.0 版定义。RISCV_HWPROBE_EXT_ZIMOP:支持 Zimop(May-Be-Operations)扩展,如 RISC-V ISA 手册中从提交 58220614a5f(“Zimop is ratified/1.0”)开始所定义。RISCV_HWPROBE_EXT_ZCA:用于代码体积缩减的 Zc* 标准扩展中的 Zca 扩展部分,已在 riscv-code-size-reduction 的提交 8be3419c1c0(“Zcf doesn’t exist on RV64 as it contains no instructions”)中正式批准。RISCV_HWPROBE_EXT_ZCB:用于代码体积缩减的 Zc* 标准扩展中的 Zcb 扩展部分,已在 riscv-code-size-reduction 的提交 8be3419c1c0(“Zcf doesn’t exist on RV64 as it contains no instructions”)中正式批准。RISCV_HWPROBE_EXT_ZCD:用于代码体积缩减的 Zc* 标准扩展中的 Zcd 扩展部分,已在 riscv-code-size-reduction 的提交 8be3419c1c0(“Zcf doesn’t exist on RV64 as it contains no instructions”)中正式批准。RISCV_HWPROBE_EXT_ZCF:用于代码体积缩减的 Zc* 标准扩展中的 Zcf 扩展部分,已在 riscv-code-size-reduction 的提交 8be3419c1c0(“Zcf doesn’t exist on RV64 as it contains no instructions”)中正式批准。RISCV_HWPROBE_EXT_ZCMOP:支持 Zcmop(May-Be-Operations)扩展,如 RISC-V ISA 手册中从提交 c732a4f39a4(“Zcmop is ratified/1.0”)开始所定义。RISCV_HWPROBE_EXT_ZAWRS:支持 Zawrs 扩展,已在 riscv-isa-manual 的提交 commit 98918c844281(“Merge pull request #1217 from riscv/zawrs”)中正式批准。RISCV_HWPROBE_EXT_ZAAMO:支持 Zaamo 扩展,如 RISC-V ISA 手册中从提交 commit e87412e621f1(“integrate Zaamo and Zalrsc text (#1304)”)开始所定义。RISCV_HWPROBE_EXT_ZALASR:支持 Zalasr 扩展,版本在 riscv-zalasr 的提交 194f0094(“Version 0.9 for freeze”)时冻结。RISCV_HWPROBE_EXT_ZALRSC:支持 Zalrsc 扩展,如 RISC-V ISA 手册中从提交 commit e87412e621f1(“integrate Zaamo and Zalrsc text (#1304)”)开始所定义。RISCV_HWPROBE_EXT_SUPM:支持 Supm 扩展,如 RISC-V 指针掩码扩展 1.0 版中所定义。RISCV_HWPROBE_EXT_ZFBFMIN:支持 Zfbfmin 扩展,如 RISC-V ISA 手册中从提交 commit 4dc23d6229de(“Added Chapter title to BF16”)开始所定义。RISCV_HWPROBE_EXT_ZVFBFMIN:支持 Zvfbfmin 扩展,如 RISC-V ISA 手册中从提交 commit 4dc23d6229de(“Added Chapter title to BF16”)开始所定义。RISCV_HWPROBE_EXT_ZVFBFWMA:支持 Zvfbfwma 扩展,如 RISC-V ISA 手册中从提交 commit 4dc23d6229de(“Added Chapter title to BF16”)开始所定义。RISCV_HWPROBE_EXT_ZICBOM:支持 Zicbom 扩展,已在 riscv-CMOs 的提交 3dd606f(“Create cmobase-v1.0.pdf”)中正式批准。RISCV_HWPROBE_EXT_ZABHA:支持 Zabha 扩展,已在 riscv-zabha 的提交 commit 49f49c842ff9(“Update to Rafified state”)中正式批准。RISCV_HWPROBE_EXT_ZICBOP:支持 Zicbop 扩展,已在 riscv-CMOs 的提交 3dd606f(“Create cmobase-v1.0.pdf”)中正式批准。RISCV_HWPROBE_EXT_ZILSD:支持 Zilsd 扩展,如 riscv-isa-manual 中从提交 f88abf1(“Integrating load/store pair for RV32 with the main manual”)开始所定义。RISCV_HWPROBE_EXT_ZCLSD:支持 Zclsd 扩展,如 riscv-isa-manual 中从提交 f88abf1(“Integrating load/store pair for RV32 with the main manual”)开始所定义。RISCV_HWPROBE_EXT_ZICFILP:支持 Zicfilp 扩展,如 RISC-V 控制流完整性(CFI)扩展规范 1.0 版中所定义,该规范已在 riscv-cfi 的提交 commit 302a2d45c243(“Update build-pdf.yml”)中正式批准。
RISCV_HWPROBE_KEY_CPUPERF_0:已弃用。返回与RISCV_HWPROBE_KEY_MISALIGNED_SCALAR_PERF类似的值,但该键被错误地归类为位掩码而不是值。RISCV_HWPROBE_KEY_MISALIGNED_SCALAR_PERF:一个enum value,描述在所选处理器集上未对齐的标量本地字访问的性能。RISCV_HWPROBE_MISALIGNED_SCALAR_UNKNOWN:未对齐标量访问的性能未知。RISCV_HWPROBE_MISALIGNED_SCALAR_EMULATED:未对齐的标量访问通过软件进行模拟,在内核中或内核底层。这些访问总是极其缓慢。RISCV_HWPROBE_MISALIGNED_SCALAR_SLOW:未对齐的标量本地字大小访问比等效数量的字节访问要慢。未对齐访问可以直接在硬件中支持,或者通过软件捕获并模拟。RISCV_HWPROBE_MISALIGNED_SCALAR_FAST:未对齐的标量本地字大小访问比等效数量的字节访问要快。RISCV_HWPROBE_MISALIGNED_SCALAR_UNSUPPORTED:根本不支持未对齐的标量访问,并且会产生未对齐地址错误。
RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE:一个无符号整型,表示 Zicboz 块的大小(以字节为单位)。RISCV_HWPROBE_KEY_HIGHEST_VIRT_ADDRESS:一个无符号长整型,表示可用的最高用户空间虚拟地址。RISCV_HWPROBE_KEY_TIME_CSR_FREQ:time CSR 的频率(以 Hz 为单位)。RISCV_HWPROBE_KEY_MISALIGNED_VECTOR_PERF:一个enum value,描述在所选处理器集上未对齐的向量访问的性能。RISCV_HWPROBE_MISALIGNED_VECTOR_UNKNOWN:未对齐向量访问的性能未知。RISCV_HWPROBE_MISALIGNED_VECTOR_SLOW:使用向量寄存器的 32 位未对齐访问比通过向量寄存器的等效数量的字节访问要慢。未对齐访问可以直接在硬件中支持,或者通过软件捕获并模拟。RISCV_HWPROBE_MISALIGNED_VECTOR_FAST:使用向量寄存器的 32 位未对齐访问比通过向量寄存器的等效数量的字节访问要快。RISCV_HWPROBE_MISALIGNED_VECTOR_UNSUPPORTED:根本不支持未对齐的向量访问,并且会产生未对齐地址错误。
RISCV_HWPROBE_KEY_VENDOR_EXT_MIPS_0:包含与RISCV_HWPROBE_BASE_BEHAVIOR_IMA基本系统行为兼容的 mips 厂商扩展的位掩码。MIPS
RISCV_HWPROBE_VENDOR_EXT_XMIPSEXECTL:MIPS ISA 扩展规范中支持 xmipsexectl 厂商扩展。
RISCV_HWPROBE_KEY_VENDOR_EXT_THEAD_0:包含与RISCV_HWPROBE_BASE_BEHAVIOR_IMA基本系统行为兼容的 thead 厂商扩展的位掩码。T-HEAD
RISCV_HWPROBE_VENDOR_EXT_XTHEADVECTOR:平头哥 ISA 扩展规范中从提交 a18c801634(“Add T-Head VECTOR vendor extension. ”)开始支持 xtheadvector 厂商扩展。
RISCV_HWPROBE_KEY_ZICBOM_BLOCK_SIZE:一个无符号整型,表示 Zicbom 块的大小(以字节为单位)。RISCV_HWPROBE_KEY_VENDOR_EXT_SIFIVE_0:包含与RISCV_HWPROBE_BASE_BEHAVIOR_IMA基本系统行为兼容的 sifive 厂商扩展的位掩码。SIFIVE
RISCV_HWPROBE_VENDOR_EXT_XSFVQMACCDOD:SiFive Int8 矩阵乘法扩展规范 1.1 版支持 Xsfqmaccdod 厂商扩展。RISCV_HWPROBE_VENDOR_EXT_XSFVQMACCQOQ:SiFive Int8 矩阵乘法指令扩展规范 1.1 版支持 Xsfqmaccqoq 厂商扩展。RISCV_HWPROBE_VENDOR_EXT_XSFVFNRCLIPXFQF:SiFive FP32 转 int8 范围裁剪指令扩展规范 1.0 版支持 Xsfvfnrclipxfqf 厂商扩展。RISCV_HWPROBE_VENDOR_EXT_XSFVFWMACCQQQ:矩阵乘积累加指令扩展规范 1.0 版支持 Xsfvfwmaccqqq 厂商扩展。
RISCV_HWPROBE_KEY_ZICBOP_BLOCK_SIZE:一个无符号整型,表示 Zicbop 块的大小(以字节为单位)。RISCV_HWPROBE_KEY_IMA_EXT_1:包含与RISCV_HWPROBE_BASE_BEHAVIOR_IMA基本系统行为兼容的附加扩展的位掩码。RISCV_HWPROBE_EXT_ZICFISS:支持 Zicfiss 扩展,如 RISC-V 控制流完整性(CFI)扩展规范 1.0 版中所定义,该规范已在 riscv-cfi 的提交 commit 302a2d45c243(“Update build-pdf.yml”)中正式批准。