POWERPC ELF HWCAPs¶
本文档描述了 powerpc ELF HWCAPs 的用法和语义。
1. 简介¶
某些硬件或软件特性仅在部分 CPU 实现上可用,或者/且需要特定的内核配置,但用户空间代码没有其他可用的发现机制。内核通过一组称为 HWCAPs 的标志向用户空间暴露这些特性的存在,这些标志在辅助向量(auxiliary vector)中暴露。
用户空间软件可以通过获取辅助向量的 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 使用术语“设施”(facility)来描述一类指令、寄存器、中断等。设施的有无表明该类设施是否可供使用,但具体细节取决于 ISA 版本。例如,如果 VSX 设施可用,在 v3.0B 和 v3.1B ISA 版本之间可使用的 VSX 指令会有所不同。
3. 类别¶
v3.0 之前的 Power ISA 使用术语“类别”(category)来描述某些可能是可选的或互斥的指令类和操作模式,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,因此如果通过其他 HWCAP 或其他手段已知正在运行的处理器不是 601,则在使用时基之前无需测试此位。自提交 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
处理器的指令缓存与数据缓存保持一致,并且为了通过特定序列执行指令,可以使指令存储与数据存储保持一致(如例如 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
处理器支持真正的小端模式。
- PPC_FEATURE_PPC_LE
处理器支持“PowerPC 小端”,它使用地址混杂来使存储访问表现为小端序,但数据以不同的格式存储,不适合在此模式下未运行的其他代理进行访问。
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-bit Linux system call 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-bit Linux system call ABI。
- PPC_FEATURE2_HTM_NO_SUSPEND
提供了一个不支持挂起的有限事务内存设施,参见 Transactional Memory support。
- PPC_FEATURE2_ARCH_3_1
处理器支持 v3.1 用户级架构。支持后续架构的处理器也会设置此特性。
- PPC_FEATURE2_MMA
MMA 设施可用。