POWERPC ELF HWCAPs¶
本文档描述了 powerpc ELF HWCAPs 的使用和语义。
1. 简介¶
某些硬件或软件功能仅在某些 CPU 实现上可用,和/或在特定的内核配置下可用,但没有其他发现机制可供用户空间代码使用。内核通过一组称为 HWCAP 的标志,在辅助向量中公开这些功能的存在,供用户空间使用。
用户空间软件可以通过获取辅助向量的 AT_HWCAP 或 AT_HWCAP2 条目,并测试是否设置了相关标志来测试功能,例如:
bool floating_point_is_present(void)
{
unsigned long HWCAPs = getauxval(AT_HWCAP);
if (HWCAPs & PPC_FEATURE_HAS_FPU)
return true;
return false;
}
如果软件依赖于 HWCAP 描述的功能,则应检查相关的 HWCAP 标志,以验证该功能是否存在,然后再尝试使用该功能。
HWCAP 是测试功能是否存在的首选方法,而不是通过其他方式探测,因为其他方式可能不可靠或可能导致不可预测的行为。
面向特定平台的软件不一定必须测试所需或隐含的功能。例如,如果程序需要 FPU、VMX、VSX,则无需测试这些 HWCAP,如果编译器生成需要这些功能的代码,则可能无法进行测试。
2. 功能¶
Power ISA 使用术语“功能”来描述一类指令、寄存器、中断等。功能的存在或不存在表明是否可以使用此类,但具体细节取决于 ISA 版本。例如,如果 VSX 功能可用,则在 v3.0B 和 v3.1B ISA 版本之间可以使用的 VSX 指令有所不同。
3. 类别¶
v3.0 之前的 Power ISA 使用术语“类别”来描述某些可能可选或互斥的指令和操作模式,HWCAP 标志的确切含义可能取决于上下文,例如,BOOKE 功能的存在意味着未实现服务器类别。
4. HWCAP 分配¶
HWCAP 的分配如 Power Architecture 64-Bit ELF V2 ABI 规范中所述(这将反映在内核的 uapi 头文件中)。
5. AT_HWCAP 中公开的 HWCAP¶
- PPC_FEATURE_32
32 位 CPU
- PPC_FEATURE_64
64 位 CPU(用户空间可能以 32 位模式运行)。
- PPC_FEATURE_601_INSTR
处理器是 PowerPC 601。由于 f0ed73f3fa2c (“powerpc: Remove PowerPC 601”),在内核中未使用
- PPC_FEATURE_HAS_ALTIVEC
向量(又名 Altivec、VMX)功能可用。
- PPC_FEATURE_HAS_FPU
浮点功能可用。
- PPC_FEATURE_HAS_MMU
内存管理单元已存在并已启用。
- PPC_FEATURE_HAS_4xxMAC
处理器是 40x 或 44x 系列。由于 732b32daef80 (“powerpc: Remove core support for 40x”),在内核中未使用
- PPC_FEATURE_UNIFIED_CACHE
处理器具有用于指令和数据的统一 L1 缓存,如 NXP e200 中所示。由于 39c8bf2b3cc1 (“powerpc: Retire e200 core (mpc555x processor)”),在内核中未使用
- PPC_FEATURE_HAS_SPE
信号处理引擎功能可用。
- PPC_FEATURE_HAS_EFP_SINGLE
嵌入式浮点单精度运算可用。
- PPC_FEATURE_HAS_EFP_DOUBLE
嵌入式浮点双精度运算可用。
- PPC_FEATURE_NO_TB
时间基准功能 (mftb 指令) 不可用。这是一个 601 特定的 HWCAP,因此如果已知正在运行的处理器不是 601(通过其他 HWCAP 或其他方式),则无需在使用时间基准之前测试此位。由于 f0ed73f3fa2c (“powerpc: Remove PowerPC 601”),在内核中未使用
- PPC_FEATURE_POWER4
处理器是 POWER4 或 PPC970/FX/MP。由于 471d7ff8b51b (“powerpc/64s: Remove POWER4 support”),内核中已删除 POWER4 支持
- PPC_FEATURE_POWER5
处理器是 POWER5。
- PPC_FEATURE_POWER5_PLUS
处理器是 POWER5+。
- PPC_FEATURE_CELL
处理器是 Cell。
- PPC_FEATURE_BOOKE
处理器实现了嵌入式类别(“BookE”)架构。
- PPC_FEATURE_SMT
处理器实现了 SMT。
- PPC_FEATURE_ICACHE_SNOOP
处理器 icache 与 dcache 相干,并且指令存储可以与数据存储保持一致,以执行序列中的指令(如《POWER9 处理器用户手册》4.6.2.2 指令缓存块无效化 (icbi) 中所述)
sync icbi (to any address) isync
- PPC_FEATURE_ARCH_2_05
处理器支持 v2.05 用户级架构。支持更高架构的处理器不会设置此功能。
- PPC_FEATURE_PA6T
处理器是 PA6T。
- PPC_FEATURE_HAS_DFP
DFP 功能可用。
- PPC_FEATURE_POWER6_EXT
处理器是 POWER6。
- PPC_FEATURE_ARCH_2_06
处理器支持 v2.06 用户级架构。支持更高架构的处理器也会设置此功能。
- PPC_FEATURE_HAS_VSX
VSX 功能可用。
- PPC_FEATURE_PSERIES_PERFMON_COMPAT
处理器支持 0xE0-0xFF 范围内的架构 PMU 事件。
- PPC_FEATURE_TRUE_LE
处理器支持真正的 Little-Endian 模式。
- PPC_FEATURE_PPC_LE
处理器支持“PowerPC Little-Endian”,它使用地址篡改使存储访问看起来像是 Little-Endian,但数据以另一种格式存储,这种格式不适合其他未在此模式下运行的代理访问。
6. AT_HWCAP2 中公开的 HWCAP¶
- PPC_FEATURE2_ARCH_2_07
处理器支持 v2.07 用户级架构。支持更高架构的处理器也会设置此功能。
- PPC_FEATURE2_HTM
事务内存功能可用。
- PPC_FEATURE2_DSCR
DSCR 功能可用。
- PPC_FEATURE2_EBB
EBB 功能可用。
- PPC_FEATURE2_ISEL
isel 指令可用。这已被 ARCH_2_07 和更高版本取代。
- PPC_FEATURE2_TAR
TAR 功能可用。
- PPC_FEATURE2_VEC_CRYPTO
v2.07 加密指令可用。
- PPC_FEATURE2_HTM_NOSC
如果在事务状态下调用,系统调用将失败,请参阅Power Architecture 64 位 Linux 系统调用 ABI
- PPC_FEATURE2_ARCH_3_00
处理器支持 v3.0B / v3.0C 用户级架构。支持更高架构的处理器也会设置此功能。
- PPC_FEATURE2_HAS_IEEE128
使用 VSX 四精度指令和数据类型支持 IEEE 128 位二进制浮点。
- PPC_FEATURE2_DARN
darn 指令可用。
- PPC_FEATURE2_SCV
scv 0 指令可用于系统调用,请参阅Power Architecture 64 位 Linux 系统调用 ABI。
- PPC_FEATURE2_HTM_NO_SUSPEND
提供不支持挂起的有限事务内存功能,请参阅事务内存支持。
- PPC_FEATURE2_ARCH_3_1
处理器支持 v3.1 用户级架构。支持更高架构的处理器也会设置此功能。
- PPC_FEATURE2_MMA
MMA 功能可用。