.. _elf_hwcaps_powerpc:

==================
POWERPC ELF HWCAPs
==================

This document describes the usage and semantics of the powerpc ELF HWCAPs.


1. Introduction
---------------

Some hardware or software features are only available on some CPU
implementations, and/or with certain kernel configurations, but have no other
discovery mechanism available to userspace code. The kernel exposes the
presence of these features to userspace through a set of flags called HWCAPs,
exposed in the auxiliary vector.

Userspace software can test for features by acquiring the AT_HWCAP or
AT_HWCAP2 entry of the auxiliary vector, and testing whether the relevant
flags are set, e.g.::

	bool floating_point_is_present(void)
	{
		unsigned long HWCAPs = getauxval(AT_HWCAP);
		if (HWCAPs & PPC_FEATURE_HAS_FPU)
			return true;

		return false;
	}

Where software relies on a feature described by a HWCAP, it should check the
relevant HWCAP flag to verify that the feature is present before attempting to
make use of the feature.

HWCAP is the preferred method to test for the presence of a feature rather
than probing through other means, which may not be reliable or may cause
unpredictable behaviour.

Software that targets a particular platform does not necessarily have to
test for required or implied features. For example if the program requires
FPU, VMX, VSX, it is not necessary to test those HWCAPs, and it may be
impossible to do so if the compiler generates code requiring those features.

2. Facilities
-------------

The Power ISA uses the term "facility" to describe a class of instructions,
registers, interrupts, etc. The presence or absence of a facility indicates
whether this class is available to be used, but the specifics depend on the
ISA version. For example, if the VSX facility is available, the VSX
instructions that can be used differ between the v3.0B and v3.1B ISA
versions.

3. Categories
-------------

The Power ISA before v3.0 uses the term "category" to describe certain
classes of instructions and operating modes which may be optional or
mutually exclusive, the exact meaning of the HWCAP flag may depend on
context, e.g., the presence of the BOOKE feature implies that the server
category is not implemented.

4. HWCAP allocation
-------------------

HWCAPs are allocated as described in Power Architecture 64-Bit ELF V2 ABI
Specification (which will be reflected in the kernel's uapi headers).

5. The HWCAPs exposed in AT_HWCAP
---------------------------------

PPC_FEATURE_32
    32-bit CPU

PPC_FEATURE_64
    64-bit CPU (userspace may be running in 32-bit mode).

PPC_FEATURE_601_INSTR
    The processor is PowerPC 601.
    Unused in the kernel since f0ed73f3fa2c ("powerpc: Remove PowerPC 601")

PPC_FEATURE_HAS_ALTIVEC
    Vector (aka Altivec, VMX) facility is available.

PPC_FEATURE_HAS_FPU
    Floating point facility is available.

PPC_FEATURE_HAS_MMU
    Memory management unit is present and enabled.

PPC_FEATURE_HAS_4xxMAC
    The processor is 40x or 44x family.
    Unused in the kernel since 732b32daef80 ("powerpc: Remove core support for 40x")

PPC_FEATURE_UNIFIED_CACHE
    The processor has a unified L1 cache for instructions and data, as
    found in NXP e200.
    Unused in the kernel since 39c8bf2b3cc1 ("powerpc: Retire e200 core (mpc555x processor)")

PPC_FEATURE_HAS_SPE
    Signal Processing Engine facility is available.

PPC_FEATURE_HAS_EFP_SINGLE
    Embedded Floating Point single precision operations are available.

PPC_FEATURE_HAS_EFP_DOUBLE
    Embedded Floating Point double precision operations are available.

PPC_FEATURE_NO_TB
    The timebase facility (mftb instruction) is not available.
    This is a 601 specific HWCAP, so if it is known that the processor
    running is not a 601, via other HWCAPs or other means, it is not
    required to test this bit before using the timebase.
    Unused in the kernel since f0ed73f3fa2c ("powerpc: Remove PowerPC 601")

PPC_FEATURE_POWER4
    The processor is POWER4 or PPC970/FX/MP.
    POWER4 support dropped from the kernel since 471d7ff8b51b ("powerpc/64s: Remove POWER4 support")

PPC_FEATURE_POWER5
    The processor is POWER5.

PPC_FEATURE_POWER5_PLUS
    The processor is POWER5+.

PPC_FEATURE_CELL
    The processor is Cell.

PPC_FEATURE_BOOKE
    The processor implements the embedded category ("BookE") architecture.

PPC_FEATURE_SMT
    The processor implements SMT.

PPC_FEATURE_ICACHE_SNOOP
    The processor icache is coherent with the dcache, and instruction storage
    can be made consistent with data storage for the purpose of executing
    instructions with the sequence (as described in, e.g., POWER9 Processor
    User's Manual, 4.6.2.2 Instruction Cache Block Invalidate (icbi))::

        sync
        icbi (to any address)
        isync

PPC_FEATURE_ARCH_2_05
    The processor supports the v2.05 userlevel architecture. Processors
    supporting later architectures DO NOT set this feature.

PPC_FEATURE_PA6T
    The processor is PA6T.

PPC_FEATURE_HAS_DFP
    DFP facility is available.

PPC_FEATURE_POWER6_EXT
    The processor is POWER6.

PPC_FEATURE_ARCH_2_06
    The processor supports the v2.06 userlevel architecture. Processors
    supporting later architectures also set this feature.

PPC_FEATURE_HAS_VSX
    VSX facility is available.

PPC_FEATURE_PSERIES_PERFMON_COMPAT
    The processor supports architected PMU events in the range 0xE0-0xFF.

PPC_FEATURE_TRUE_LE
    The processor supports true little-endian mode.

PPC_FEATURE_PPC_LE
    The processor supports "PowerPC Little-Endian", that uses address
    munging to make storage access appear to be little-endian, but the
    data is stored in a different format that is unsuitable to be
    accessed by other agents not running in this mode.

6. The HWCAPs exposed in AT_HWCAP2
----------------------------------

PPC_FEATURE2_ARCH_2_07
    The processor supports the v2.07 userlevel architecture. Processors
    supporting later architectures also set this feature.

PPC_FEATURE2_HTM
    Transactional Memory feature is available.

PPC_FEATURE2_DSCR
    DSCR facility is available.

PPC_FEATURE2_EBB
    EBB facility is available.

PPC_FEATURE2_ISEL
    isel instruction is available. This is superseded by ARCH_2_07 and
    later.

PPC_FEATURE2_TAR
    TAR facility is available.

PPC_FEATURE2_VEC_CRYPTO
    v2.07 crypto instructions are available.

PPC_FEATURE2_HTM_NOSC
    System calls fail if called in a transactional state, see
    Documentation/arch/powerpc/syscall64-abi.rst

PPC_FEATURE2_ARCH_3_00
    The processor supports the v3.0B / v3.0C userlevel architecture. Processors
    supporting later architectures also set this feature.

PPC_FEATURE2_HAS_IEEE128
    IEEE 128-bit binary floating point is supported with VSX
    quad-precision instructions and data types.

PPC_FEATURE2_DARN
    darn instruction is available.

PPC_FEATURE2_SCV
    The scv 0 instruction may be used for system calls, see
    Documentation/arch/powerpc/syscall64-abi.rst.

PPC_FEATURE2_HTM_NO_SUSPEND
    A limited Transactional Memory facility that does not support suspend is
    available, see Documentation/arch/powerpc/transactional_memory.rst.

PPC_FEATURE2_ARCH_3_1
    The processor supports the v3.1 userlevel architecture. Processors
    supporting later architectures also set this feature.

PPC_FEATURE2_MMA
    MMA facility is available.
