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 设施可用。