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 工具可用。