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 填充键的值,而是给出每个键的值,并通过 sys_riscv_hwprobe() 将 CPU 集缩小到仅与每个键值对匹配的 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_MIMPLID:包含 mimplid 的值,由 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 手册的 commit 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 的 commit 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(“从 Zvfh[min] 中删除草案警告”)开始定义。

    • RISCV_HWPROBE_EXT_ZVFHMIN:支持 Zvfhmin 扩展,如

      RISC-V 向量手册中从 commit e2ccd0548d6c(“从 Zvfh[min] 中删除草案警告”)开始定义。

    • RISCV_HWPROBE_EXT_ZFA:支持 Zfa 扩展,如

      RISC-V ISA 手册中从 commit 056b6ff467c7(“Zfa 已批准”)开始定义。

    • RISCV_HWPROBE_EXT_ZTSO:支持 Ztso 扩展,如

      定义于 RISC-V ISA 手册中,起始于 commit 5618fb5a216b(“Ztso 现在已批准。”)

    • RISCV_HWPROBE_EXT_ZACAS:支持 Zacas 扩展,

      定义于原子比较并交换(CAS)指令手册中,起始于 commit 5059e0ca641c(“更新为已批准”)。

    • RISCV_HWPROBE_EXT_ZICOND:支持 Zicond 扩展,

      定义于 RISC-V 整数条件(Zicond)操作扩展手册中,起始于 commit 95cf1f9(“添加 Ved 在签署期间要求的更改”)

    • RISCV_HWPROBE_EXT_ZIHINTPAUSE:支持 Zihintpause 扩展,

      定义于 RISC-V ISA 手册中,起始于 commit d8ab5c78c207(“Zihintpause 已批准。”)。

    • 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 已批准/1.0”)。

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

      用于减小代码大小,已在 riscv-code-size-reduction 的 commit 8be3419c1c0(“Zcf 在 RV64 上不存在,因为它不包含任何指令”)中批准。

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

      用于减小代码大小,已在 riscv-code-size-reduction 的 commit 8be3419c1c0(“Zcf 在 RV64 上不存在,因为它不包含任何指令”)中批准。

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

      用于减小代码大小,已在 riscv-code-size-reduction 的 commit 8be3419c1c0(“Zcf 在 RV64 上不存在,因为它不包含任何指令”)中批准。

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

      用于减小代码大小,已在 riscv-code-size-reduction 的 commit 8be3419c1c0(“Zcf 在 RV64 上不存在,因为它不包含任何指令”)中批准。

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

      定义于 RISC-V ISA 手册中,起始于 commit c732a4f39a4(“Zcmop 已批准/1.0”)。

    • RISCV_HWPROBE_EXT_ZAWRS:支持 Zawrs 扩展,

      已在 riscv-isa-manual 的 commit 98918c844281(“合并来自 riscv/zawrs 的拉取请求 #1217”)中批准。

    • RISCV_HWPROBE_EXT_SUPM:支持 Supm 扩展,

      定义于 RISC-V 指针掩码扩展的 1.0 版本中。

  • 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:完全不支持未对齐的向量访问,并且会生成未对齐的地址错误。