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
:包含此内核支持的基本用户可见行为的位掩码。定义了以下基本用户 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 手册的 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_FREQ
:time 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
:完全不支持未对齐的向量访问,并且会生成未对齐的地址错误。