.. SPDX-License-Identifier: GPL-2.0 .. include:: ../../disclaimer-zh_TW.rst :Original: :ref:`Documentation/arch/arm64/elf_hwcaps.rst <elf_hwcaps_index>` Translator: Bailu Lin <bailu.lin@vivo.com> Hu Haowen <2023002089@link.tyut.edu.cn> ================ 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。