• Martin Storsjö's avatar
    aarch64: Use regular hwcaps flags instead of HWCAP_CPUID for CPU feature detection on Linux · e30369bc
    Martin Storsjö authored
    This makes the code much simpler (especially for adding support
    for other instruction set extensions), avoids needing inline
    assembly for this feature, and generally is more of the canonical
    way to do this.
    
    The CPU feature detection was added in
    493fcde5, using HWCAP_CPUID.
    
    The argument for using that, was that HWCAP_CPUID was added much
    earlier in the kernel (in Linux v4.11), while the HWCAP flags for
    individual features always come later. This allows detecting support
    for new CPU extensions before the kernel exposes information about
    them via hwcap flags.
    
    However in practice, there's probably quite little advantage in this.
    E.g. HWCAP2_I8MM was added in Linux v5.10 - long after HWCAP_CPUID,
    but there's probably very little practical cases where one would
    run a kernel older than that on a CPU that supports those instructions.
    
    Additionally, we provide our own definitions of the flag values to
    check (as they are fixed constants anyway), with names not conflicting
    with the ones from system headers. This reduces the number of ifdefs
    needed, and allows detecting those features even if building with
    userland headers that are lacking the definitions of those flags.
    
    Also, slightly older versions of QEMU, e.g. 6.2 in Ubuntu 22.04,
    do expose support for these features via HWCAP flags, but the
    emulated cpuid registers are missing the bits for exposing e.g. I8MM.
    (This issue is fixed in later versions of QEMU though.)
    Signed-off-by: 's avatarMartin Storsjö <martin@martin.st>
    e30369bc
Name
Last commit
Last update
..
Makefile Loading commit data...
asm.S Loading commit data...
bswap.h Loading commit data...
cpu.c Loading commit data...
cpu.h Loading commit data...
float_dsp_init.c Loading commit data...
float_dsp_neon.S Loading commit data...
neontest.h Loading commit data...
timer.h Loading commit data...
tx_float_init.c Loading commit data...
tx_float_neon.S Loading commit data...