.. include:: ../../disclaimer-zh_CN.rst :Original: :ref:`Documentation/arch/arm64/elf_hwcaps.rst <elf_hwcaps_index>` Translator: Bailu Lin <bailu.lin@vivo.com> ================ ARM64 ELF hwcaps ================ 这篇文档æè¿°äº† arm64 ELF hwcaps 的用法和è¯ä¹‰ã€‚ 1. 简介 ------- 有些硬件或软件功能仅在æŸäº› CPU 实现上和/或在具体æŸä¸ªå†…æ ¸é…置上å¯ç”¨ï¼Œä½† 对于处于 EL0 çš„ç”¨æˆ·ç©ºé—´ä»£ç æ²¡æœ‰å¯ç”¨çš„æž¶æž„å‘çŽ°æœºåˆ¶ã€‚å†…æ ¸é€šè¿‡åœ¨è¾…åŠ©å‘é‡è¡¨ 公开一组称为 hwcaps çš„æ ‡å¿—è€ŒæŠŠè¿™äº›åŠŸèƒ½æš´éœ²ç»™ç”¨æˆ·ç©ºé—´ã€‚ 用户空间软件å¯ä»¥é€šè¿‡èŽ·å–辅助å‘é‡çš„ AT_HWCAP 或 AT_HWCAP2 æ¡ç›®æ¥æµ‹è¯•功能, 并测试是å¦è®¾ç½®äº†ç›¸å…³æ ‡å¿—,例如:: bool floating_point_is_present(void) { unsigned long hwcaps = getauxval(AT_HWCAP); if (hwcaps & HWCAP_FP) return true; return false; } 如果软件ä¾èµ–于 hwcap æè¿°çš„功能,在å°è¯•使用该功能å‰åˆ™åº”检查相关的 hwcap æ ‡å¿—ä»¥éªŒè¯è¯¥åŠŸèƒ½æ˜¯å¦å˜åœ¨ã€‚ ä¸èƒ½é€šè¿‡å…¶ä»–æ–¹å¼æŽ¢æŸ¥è¿™äº›åŠŸèƒ½ã€‚å½“ä¸€ä¸ªåŠŸèƒ½ä¸å¯ç”¨æ—¶ï¼Œå°è¯•使用它å¯èƒ½å¯¼è‡´ä¸å¯ é¢„æµ‹çš„è¡Œä¸ºï¼Œå¹¶ä¸”æ— æ³•ä¿è¯èƒ½ç¡®åˆ‡çš„知é“该功能ä¸å¯ç”¨ï¼Œä¾‹å¦‚ SIGILL。 2. Hwcaps 的说明 ---------------- 大多数 hwcaps 旨在说明通过架构 ID 寄å˜å™¨(处于 EL0 çš„ç”¨æˆ·ç©ºé—´ä»£ç æ— 法访问) æè¿°çš„功能的å˜åœ¨ã€‚这些 hwcap 通过 ID 寄å˜å™¨å—æ®µå®šä¹‰ï¼Œå¹¶ä¸”åº”æ ¹æ® ARM 体系 结构å‚考手册(ARM ARM)ä¸å®šä¹‰çš„å—æ®µæ¥è§£é‡Šè¯´æ˜Žã€‚ 这些 hwcaps 以下é¢çš„å½¢å¼æè¿°:: idreg.field == val 表示有æŸä¸ªåŠŸèƒ½ã€‚ 当 idreg.field 䏿œ‰ val 时,hwcaps 表示 ARM ARM 定义的功能是有效的,但是 并䏿˜¯è¯´è¦å®Œå…¨å’Œ val 相ç‰ï¼Œä¹Ÿä¸æ˜¯è¯´ idreg.field æè¿°çš„其他功能就是缺失的。 å…¶ä»– hwcaps å¯èƒ½è¡¨æ˜Žæ— 法仅由 ID 寄å˜å™¨æè¿°çš„功能的å˜åœ¨ã€‚这些 hwcaps å¯èƒ½ 没有被 ID 寄å˜å™¨æè¿°ï¼Œéœ€è¦å‚考其他文档。 3. AT_HWCAP ä¸æç¤ºçš„ hwcaps --------------------------- HWCAP_FP ID_AA64PFR0_EL1.FP == 0b0000 表示有æ¤åŠŸèƒ½ã€‚ HWCAP_ASIMD ID_AA64PFR0_EL1.AdvSIMD == 0b0000 表示有æ¤åŠŸèƒ½ã€‚ HWCAP_EVTSTRM 通用计时器频率é…置为大约100KHz以生æˆäº‹ä»¶ã€‚ HWCAP_AES ID_AA64ISAR0_EL1.AES == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP_PMULL ID_AA64ISAR0_EL1.AES == 0b0010 表示有æ¤åŠŸèƒ½ã€‚ HWCAP_SHA1 ID_AA64ISAR0_EL1.SHA1 == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP_SHA2 ID_AA64ISAR0_EL1.SHA2 == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP_CRC32 ID_AA64ISAR0_EL1.CRC32 == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP_ATOMICS ID_AA64ISAR0_EL1.Atomic == 0b0010 表示有æ¤åŠŸèƒ½ã€‚ HWCAP_FPHP ID_AA64PFR0_EL1.FP == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP_ASIMDHP ID_AA64PFR0_EL1.AdvSIMD == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP_CPUID æ ¹æ® Documentation/arch/arm64/cpu-feature-registers.rst æè¿°ï¼ŒEL0 å¯ä»¥è®¿é—® æŸäº› ID 寄å˜å™¨ã€‚ 这些 ID 寄å˜å™¨å¯èƒ½è¡¨ç¤ºåŠŸèƒ½çš„å¯ç”¨æ€§ã€‚ HWCAP_ASIMDRDM ID_AA64ISAR0_EL1.RDM == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP_JSCVT ID_AA64ISAR1_EL1.JSCVT == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP_FCMA ID_AA64ISAR1_EL1.FCMA == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP_LRCPC ID_AA64ISAR1_EL1.LRCPC == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP_DCPOP ID_AA64ISAR1_EL1.DPB == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP_SHA3 ID_AA64ISAR0_EL1.SHA3 == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP_SM3 ID_AA64ISAR0_EL1.SM3 == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP_SM4 ID_AA64ISAR0_EL1.SM4 == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP_ASIMDDP ID_AA64ISAR0_EL1.DP == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP_SHA512 ID_AA64ISAR0_EL1.SHA2 == 0b0010 表示有æ¤åŠŸèƒ½ã€‚ HWCAP_SVE ID_AA64PFR0_EL1.SVE == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP_ASIMDFHM ID_AA64ISAR0_EL1.FHM == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP_DIT ID_AA64PFR0_EL1.DIT == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP_USCAT ID_AA64MMFR2_EL1.AT == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP_ILRCPC ID_AA64ISAR1_EL1.LRCPC == 0b0010 表示有æ¤åŠŸèƒ½ã€‚ HWCAP_FLAGM ID_AA64ISAR0_EL1.TS == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP_SSBS ID_AA64PFR1_EL1.SSBS == 0b0010 表示有æ¤åŠŸèƒ½ã€‚ HWCAP_SB ID_AA64ISAR1_EL1.SB == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP_PACA 如 Documentation/arch/arm64/pointer-authentication.rst 所æè¿°ï¼Œ ID_AA64ISAR1_EL1.APA == 0b0001 或 ID_AA64ISAR1_EL1.API == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP_PACG 如 Documentation/arch/arm64/pointer-authentication.rst 所æè¿°ï¼Œ ID_AA64ISAR1_EL1.GPA == 0b0001 或 ID_AA64ISAR1_EL1.GPI == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP2_DCPODP ID_AA64ISAR1_EL1.DPB == 0b0010 表示有æ¤åŠŸèƒ½ã€‚ HWCAP2_SVE2 ID_AA64ZFR0_EL1.SVEVer == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP2_SVEAES ID_AA64ZFR0_EL1.AES == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP2_SVEPMULL ID_AA64ZFR0_EL1.AES == 0b0010 表示有æ¤åŠŸèƒ½ã€‚ HWCAP2_SVEBITPERM ID_AA64ZFR0_EL1.BitPerm == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP2_SVESHA3 ID_AA64ZFR0_EL1.SHA3 == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP2_SVESM4 ID_AA64ZFR0_EL1.SM4 == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP2_FLAGM2 ID_AA64ISAR0_EL1.TS == 0b0010 表示有æ¤åŠŸèƒ½ã€‚ HWCAP2_FRINT ID_AA64ISAR1_EL1.FRINTTS == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP2_SVEI8MM ID_AA64ZFR0_EL1.I8MM == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP2_SVEF32MM ID_AA64ZFR0_EL1.F32MM == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP2_SVEF64MM ID_AA64ZFR0_EL1.F64MM == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP2_SVEBF16 ID_AA64ZFR0_EL1.BF16 == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP2_I8MM ID_AA64ISAR1_EL1.I8MM == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP2_BF16 ID_AA64ISAR1_EL1.BF16 == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP2_DGH ID_AA64ISAR1_EL1.DGH == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP2_RNG ID_AA64ISAR0_EL1.RNDR == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ HWCAP2_BTI ID_AA64PFR0_EL1.BT == 0b0001 表示有æ¤åŠŸèƒ½ã€‚ 4. 未使用的 AT_HWCAP ä½ ----------------------- ä¸ºäº†ä¸Žç”¨æˆ·ç©ºé—´äº¤äº’ï¼Œå†…æ ¸ä¿è¯ AT_HWCAP 的第62ã€63ä½å°†å§‹ç»ˆè¿”回0。