POWERPC ELF HWCAPs¶
本文档描述了 powerpc ELF HWCAP 的用法和语义。
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 Specification 中所述(这将反映在内核的 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。 POWER4 支持已从内核中删除,自 471d7ff8b51b (“powerpc/64s: Remove POWER4 support”)
- 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
处理器支持真正的小端模式。
- 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 位 Linux 系统调用 ABI
- PPC_FEATURE2_ARCH_3_00
处理器支持 v3.0B / v3.0C 用户级架构。 支持更高架构的处理器也设置此特性。
- PPC_FEATURE2_HAS_IEEE128
IEEE 128 位二进制浮点数支持使用 VSX 四精度指令和数据类型。
- 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 工具可用。