通过getauxval检测Power8内核加密?

我在GCC112上,这是一台运行Linux的小端Power8机器。 Power8具有内核加密function,可提供AES,SHA和一些其他有用的function。 我正在尝试使用getauxval确定运行时function的可用性。 用例是为“最小”function的机器构建的发行版,我们需要在运行时交换更快的function。

hwcaps.h的转储如下所示,但缺少Power8,AES,SHA等的特定位。 但是,我相信Power8是ISA 2.07,而ISA 2.07的位是PPC_FEATURE2_ARCH_2_07

我不清楚的是,Power8内核加密可选,就像ARMv8下ARM的加密一样。 我找不到明确说明要求的文档,而且我没有OpenPower的成员资格来访问ISA文档。 (另一种可能性是,它被陈述但我在文档中错过了它)。

是否可以使用getauxval查询function的运行时环境? 如果没有,那么我们如何在运行时确定function可用性? CPU探测是唯一可用的替代方案吗?

也许更一般地说,我们如何确定Power6,Power7和Power8运行时环境?


auxv.h大多是空的。 头文件包含hwcaps.h

 $ cat /usr/include/bits/hwcap.h ... /* The bit numbers must match those in the kernel's asm/cputable.h. */ /* Feature definitions in AT_HWCAP. */ #define PPC_FEATURE_32 0x80000000 /* 32-bit mode. */ #define PPC_FEATURE_64 0x40000000 /* 64-bit mode. */ #define PPC_FEATURE_601_INSTR 0x20000000 /* 601 chip, Old POWER ISA. */ #define PPC_FEATURE_HAS_ALTIVEC 0x10000000 /* SIMD/Vector Unit. */ #define PPC_FEATURE_HAS_FPU 0x08000000 /* Floating Point Unit. */ #define PPC_FEATURE_HAS_MMU 0x04000000 /* Memory Management Unit. */ #define PPC_FEATURE_HAS_4xxMAC 0x02000000 /* 4xx Multiply Accumulator. */ #define PPC_FEATURE_UNIFIED_CACHE 0x01000000 /* Unified I/D cache. */ #define PPC_FEATURE_HAS_SPE 0x00800000 /* Signal Processing ext. */ #define PPC_FEATURE_HAS_EFP_SINGLE 0x00400000 /* SPE Float. */ #define PPC_FEATURE_HAS_EFP_DOUBLE 0x00200000 /* SPE Double. */ #define PPC_FEATURE_NO_TB 0x00100000 /* 601/403gx have no timebase */ #define PPC_FEATURE_POWER4 0x00080000 /* POWER4 ISA 2.00 */ #define PPC_FEATURE_POWER5 0x00040000 /* POWER5 ISA 2.02 */ #define PPC_FEATURE_POWER5_PLUS 0x00020000 /* POWER5+ ISA 2.03 */ #define PPC_FEATURE_CELL_BE 0x00010000 /* CELL Broadband Engine */ #define PPC_FEATURE_BOOKE 0x00008000 /* ISA Category Embedded */ #define PPC_FEATURE_SMT 0x00004000 /* Simultaneous Multi-Threading */ #define PPC_FEATURE_ICACHE_SNOOP 0x00002000 #define PPC_FEATURE_ARCH_2_05 0x00001000 /* ISA 2.05 */ #define PPC_FEATURE_PA6T 0x00000800 /* PA Semi 6T Core */ #define PPC_FEATURE_HAS_DFP 0x00000400 /* Decimal FP Unit */ #define PPC_FEATURE_POWER6_EXT 0x00000200 /* P6 + mffgpr/mftgpr */ #define PPC_FEATURE_ARCH_2_06 0x00000100 /* ISA 2.06 */ #define PPC_FEATURE_HAS_VSX 0x00000080 /* P7 Vector Extension. */ #define PPC_FEATURE_PSERIES_PERFMON_COMPAT 0x00000040 #define PPC_FEATURE_TRUE_LE 0x00000002 #define PPC_FEATURE_PPC_LE 0x00000001 /* Feature definitions in AT_HWCAP2. */ #define PPC_FEATURE2_ARCH_2_07 0x80000000 /* ISA 2.07 */ #define PPC_FEATURE2_HAS_HTM 0x40000000 /* Hardware Transactional Memory */ #define PPC_FEATURE2_HAS_DSCR 0x20000000 /* Data Stream Control Register */ #define PPC_FEATURE2_HAS_EBB 0x10000000 /* Event Base Branching */ #define PPC_FEATURE2_HAS_ISEL 0x08000000 /* Integer Select */ #define PPC_FEATURE2_HAS_TAR 0x04000000 /* Target Address Register */ 

我会说getauxval()是最好的方法; HWCAPHWCAP2值完全用于确定硬件function。 列表中缺少的是PPC_FEATURE2_VEC_CRYPTO ,它表示存在矢量加密指令,听起来就像你需要的那样。

作为旁注:您可能不希望检测处理器实现 ,而是检测处理器function 。 具体而言,检查单个function,而不是尝试检查提供该function的进程。 (例如,直接检测VEC_CRYPTO ,而不是尝试检查POWER8,并假设这意味着加密function)。

稍微详细一点,Linux的可信条目指定HWCAP / HWCAP2值。 以POWER8为例:

 #define COMMON_USER2_POWER8 (PPC_FEATURE2_ARCH_2_07 | \ PPC_FEATURE2_HTM_COMP | \ PPC_FEATURE2_HTM_NOSC_COMP | \ PPC_FEATURE2_DSCR | \ PPC_FEATURE2_ISEL | PPC_FEATURE2_TAR | \ PPC_FEATURE2_VEC_CRYPTO) 

这是来自内核中的arch/powerpc/include/asm/cputable.h (它还提供了可以在辅助向量中设置的实际hwcap位)。

最后,我很确定你不需要成为一名OpenPOWER基金会成员来下载ISA(最新版本是3.0B) – 你只需要在网站上有一个帐户。