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 功能可用。