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 集合和一些标志。键值对以计数提供。用户空间必须预先填充每个元素的键字段,如果内核识别该键,则内核将填充值。如果内核不知道某个键,则其键字段将被清除为 -1,其值设置为 0。CPU 集合由 CPU_SET(3) 定义,大小为 cpusetsize 字节。对于类似值的键(例如,vendor、arch、impl),仅当给定集合中的所有 CPU 具有相同的值时,返回的值才有效。否则,将返回 -1。对于类似布尔值的键,返回的值将是指定 CPU 值的逻辑与。用户模式可以为 cpus 提供 NULL,为 cpusetsize 提供 0,作为所有在线 CPU 的快捷方式。当前支持的标志是

  • RISCV_HWPROBE_WHICH_CPUS:此标志基本上反转了 sys_riscv_hwprobe() 的行为。sys_riscv_hwprobe() 不会填充给定 CPU 集合的键的值,而是给出每个键的值,并且 CPU 集合会被 sys_riscv_hwprobe() 缩减到仅与每个键值对匹配的 CPU。匹配方式取决于键类型。对于类似值的键,匹配意味着与该值完全相同。对于类似布尔值的键,匹配意味着该对的值与 CPU 的值的逻辑与的结果与该对的值完全相同。此外,当 cpus 是空集时,它将初始化为适合它的所有在线 CPU,即返回的 CPU 集合是可以由大小为 cpusetsize 的 CPU 集合表示的所有在线 CPU 的缩减结果。

所有其他标志都保留供将来兼容使用,必须为零。

成功时返回 0,失败时返回负错误代码。

定义了以下键

  • RISCV_HWPROBE_KEY_MVENDORID:包含 mvendorid 的值,如 RISC-V 特权架构规范中所定义。

  • RISCV_HWPROBE_KEY_MARCHID:包含 marchid 的值,如 RISC-V 特权架构规范中所定义。

  • RISCV_HWPROBE_KEY_MIMPID:包含 mimpid 的值,如 RISC-V 特权架构规范中所定义。

  • RISCV_HWPROBE_KEY_BASE_BEHAVIOR:一个位掩码,包含此内核支持的基本用户可见行为。定义了以下基本用户 ABI

    • RISCV_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 现在实现 minimumNumber/maximumNumber,而不是 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(“创建 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 加密扩展卷 II 的 1.0 版本中定义。

    • RISCV_HWPROBE_EXT_ZVBC:支持 Zvbc 扩展,如

      在 RISC-V 加密扩展卷 II 的 1.0 版本中定义。

    • RISCV_HWPROBE_EXT_ZVKB:支持 Zvkb 扩展,如

      在 RISC-V 加密扩展卷 II 的 1.0 版本中定义。

    • RISCV_HWPROBE_EXT_ZVKG:支持 Zvkg 扩展,如

      在 RISC-V 加密扩展卷 II 的 1.0 版本中定义。

    • RISCV_HWPROBE_EXT_ZVKNED:支持 Zvkned 扩展,如

      在 RISC-V 加密扩展卷 II 的 1.0 版本中定义。

    • RISCV_HWPROBE_EXT_ZVKNHA:支持 Zvknha 扩展,如

      在 RISC-V 加密扩展卷 II 的 1.0 版本中定义。

    • RISCV_HWPROBE_EXT_ZVKNHB:支持 Zvknhb 扩展,如

      在 RISC-V 加密扩展卷 II 的 1.0 版本中定义。

    • RISCV_HWPROBE_EXT_ZVKSED:支持 Zvksed 扩展,如

      在 RISC-V 加密扩展卷 II 的 1.0 版本中定义。

    • RISCV_HWPROBE_EXT_ZVKSH:支持 Zvksh 扩展,如

      在 RISC-V 加密扩展卷 II 的 1.0 版本中定义。

    • RISCV_HWPROBE_EXT_ZVKT:支持 Zvkt 扩展,如

      在 RISC-V 加密扩展卷 II 的 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) 操作扩展手册中定义,从 commit 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 手册中定义,从 commit 58220614a5f (“Zimop is ratified/1.0”) 开始。

    • RISCV_HWPROBE_EXT_ZCA:Zca 扩展是 Zc* 标准的一部分

      用于减小代码大小的扩展,如 riscv-code-size-reduction 的 commit 8be3419c1c0 (“Zcf doesn’t exist on RV64 as it contains no instructions”) 中批准。

    • RISCV_HWPROBE_EXT_ZCB:Zcb 扩展是 Zc* 标准的一部分

      用于减小代码大小的扩展,如 riscv-code-size-reduction 的 commit 8be3419c1c0 (“Zcf doesn’t exist on RV64 as it contains no instructions”) 中批准。

    • RISCV_HWPROBE_EXT_ZCD:Zcd 扩展是 Zc* 标准的一部分

      用于减小代码大小的扩展,如 riscv-code-size-reduction 的 commit 8be3419c1c0 (“Zcf doesn’t exist on RV64 as it contains no instructions”) 中批准。

    • RISCV_HWPROBE_EXT_ZCF:Zcf 扩展是 Zc* 标准的一部分

      用于减小代码大小的扩展,如 riscv-code-size-reduction 的 commit 8be3419c1c0 (“Zcf doesn’t exist on RV64 as it contains no instructions”) 中批准。

    • RISCV_HWPROBE_EXT_ZCMOP:支持 Zcmop May-Be-Operations 扩展

      如 RISC-V ISA 手册中定义,从 commit 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_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(“创建 cmobase-v1.0.pdf”)中批准。

    • RISCV_HWPROBE_EXT_ZABHA:支持 Zabha 扩展,如

      在 riscv-zabha 的 commit 49f49c842ff9 (“Update to Rafified state”) 中批准。

  • RISCV_HWPROBE_KEY_CPUPERF_0:已弃用。返回与

    RISCV_HWPROBE_KEY_MISALIGNED_SCALAR_PERF 类似的值,但该键被错误地归类为位掩码而不是值。

  • RISCV_HWPROBE_KEY_MISALIGNED_SCALAR_PERF:一个枚举值,描述了在选定的处理器集合上,未对齐的标量原生字访问的性能。

    • 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_FREQtime CSR 的频率(以 Hz 为单位)。

  • RISCV_HWPROBE_KEY_MISALIGNED_VECTOR_PERF:一个枚举值,描述了

    在选定的处理器集合上,未对齐的向量访问的性能。

    • 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_THEAD_0:一个位掩码,包含与 RISCV_HWPROBE_BASE_BEHAVIOR_IMA:基本系统行为兼容的 thead 供应商扩展。

    • T-HEAD

      • RISCV_HWPROBE_VENDOR_EXT_XTHEADVECTOR:xtheadvector 供应商

        支持 T-Head ISA 扩展规范中的扩展,从 commit a18c801634 (“Add T-Head VECTOR vendor extension. “) 开始。

  • 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:Xsfqmaccdod 供应商

        支持 SiFive Int8 矩阵乘法扩展规范的 1.1 版本中的扩展。

      • RISCV_HWPROBE_VENDOR_EXT_XSFVQMACCQOQ:Xsfqmaccqoq 供应商

        支持 SiFive Int8 矩阵乘法指令扩展规范的 1.1 版本中的扩展。

      • RISCV_HWPROBE_VENDOR_EXT_XSFVFNRCLIPXFQF:Xsfvfnrclipxfqf

        支持 SiFive FP32-to-int8 范围剪辑指令扩展规范的 1.0 版本中的供应商扩展。

      • RISCV_HWPROBE_VENDOR_EXT_XSFVFWMACCQQQ:Xsfvfwmaccqqq

        支持矩阵乘法累加指令扩展规范的 1.0 版本中的供应商扩展。