요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.
1. 요약·해설
원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.
2. 영어 원문 전체
번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.
원문 전체 펼치기
.. _elf_hwcaps_index:
================
ARM64 ELF hwcaps
================
This document describes the usage and semantics of the arm64 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
architected discovery mechanism available to userspace code at EL0. 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,
AT_HWCAP2 or AT_HWCAP3 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 & HWCAP_FP)
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.
Features cannot be probed reliably through other means. When a feature
is not available, attempting to use it may result in unpredictable
behaviour, and is not guaranteed to result in any reliable indication
that the feature is unavailable, such as a SIGILL.
2. Interpretation of hwcaps
---------------------------
The majority of hwcaps are intended to indicate the presence of features
which are described by architected ID registers inaccessible to
userspace code at EL0. These hwcaps are defined in terms of ID register
fields, and should be interpreted with reference to the definition of
these fields in the ARM Architecture Reference Manual (ARM ARM).
Such hwcaps are described below in the form::
Functionality implied by idreg.field == val.
Such hwcaps indicate the availability of functionality that the ARM ARM
defines as being present when idreg.field has value val, but do not
indicate that idreg.field is precisely equal to val, nor do they
indicate the absence of functionality implied by other values of
idreg.field.
Other hwcaps may indicate the presence of features which cannot be
described by ID registers alone. These may be described without
reference to ID registers, and may refer to other documentation.
3. The hwcaps exposed in AT_HWCAP
---------------------------------
HWCAP_FP
Functionality implied by ID_AA64PFR0_EL1.FP == 0b0000.
HWCAP_ASIMD
Functionality implied by ID_AA64PFR0_EL1.AdvSIMD == 0b0000.
HWCAP_EVTSTRM
The generic timer is configured to generate events at a frequency of
approximately 10KHz.
HWCAP_AES
Functionality implied by ID_AA64ISAR0_EL1.AES == 0b0001.
HWCAP_PMULL
Functionality implied by ID_AA64ISAR0_EL1.AES == 0b0010.
HWCAP_SHA1
Functionality implied by ID_AA64ISAR0_EL1.SHA1 == 0b0001.
HWCAP_SHA2
Functionality implied by ID_AA64ISAR0_EL1.SHA2 == 0b0001.
HWCAP_CRC32
Functionality implied by ID_AA64ISAR0_EL1.CRC32 == 0b0001.
HWCAP_ATOMICS
Functionality implied by ID_AA64ISAR0_EL1.Atomic == 0b0010.
HWCAP_FPHP
Functionality implied by ID_AA64PFR0_EL1.FP == 0b0001.
HWCAP_ASIMDHP
Functionality implied by ID_AA64PFR0_EL1.AdvSIMD == 0b0001.
HWCAP_CPUID
EL0 access to certain ID registers is available, to the extent
described by Documentation/arch/arm64/cpu-feature-registers.rst.
These ID registers may imply the availability of features.
HWCAP_ASIMDRDM
Functionality implied by ID_AA64ISAR0_EL1.RDM == 0b0001.
HWCAP_JSCVT
Functionality implied by ID_AA64ISAR1_EL1.JSCVT == 0b0001.
HWCAP_FCMA
Functionality implied by ID_AA64ISAR1_EL1.FCMA == 0b0001.
HWCAP_LRCPC
Functionality implied by ID_AA64ISAR1_EL1.LRCPC == 0b0001.
HWCAP_DCPOP
Functionality implied by ID_AA64ISAR1_EL1.DPB == 0b0001.
HWCAP_SHA3
Functionality implied by ID_AA64ISAR0_EL1.SHA3 == 0b0001.
HWCAP_SM3
Functionality implied by ID_AA64ISAR0_EL1.SM3 == 0b0001.
HWCAP_SM4
Functionality implied by ID_AA64ISAR0_EL1.SM4 == 0b0001.
HWCAP_ASIMDDP
Functionality implied by ID_AA64ISAR0_EL1.DP == 0b0001.
HWCAP_SHA512
Functionality implied by ID_AA64ISAR0_EL1.SHA2 == 0b0010.
HWCAP_SVE
Functionality implied by ID_AA64PFR0_EL1.SVE == 0b0001.
HWCAP_ASIMDFHM
Functionality implied by ID_AA64ISAR0_EL1.FHM == 0b0001.
HWCAP_DIT
Functionality implied by ID_AA64PFR0_EL1.DIT == 0b0001.
HWCAP_USCAT
Functionality implied by ID_AA64MMFR2_EL1.AT == 0b0001.
HWCAP_ILRCPC
Functionality implied by ID_AA64ISAR1_EL1.LRCPC == 0b0010.
HWCAP_FLAGM
Functionality implied by ID_AA64ISAR0_EL1.TS == 0b0001.
HWCAP_SSBS
Functionality implied by ID_AA64PFR1_EL1.SSBS == 0b0010.
HWCAP_SB
Functionality implied by ID_AA64ISAR1_EL1.SB == 0b0001.
HWCAP_PACA
Functionality implied by ID_AA64ISAR1_EL1.APA == 0b0001 or
ID_AA64ISAR1_EL1.API == 0b0001, as described by
Documentation/arch/arm64/pointer-authentication.rst.
HWCAP_PACG
Functionality implied by ID_AA64ISAR1_EL1.GPA == 0b0001 or
ID_AA64ISAR1_EL1.GPI == 0b0001, as described by
Documentation/arch/arm64/pointer-authentication.rst.
HWCAP_GCS
Functionality implied by ID_AA64PFR1_EL1.GCS == 0b1, as
described by Documentation/arch/arm64/gcs.rst.
HWCAP_CMPBR
Functionality implied by ID_AA64ISAR2_EL1.CSSC == 0b0010.
HWCAP_FPRCVT
Functionality implied by ID_AA64ISAR3_EL1.FPRCVT == 0b0001.
HWCAP_F8MM8
Functionality implied by ID_AA64FPFR0_EL1.F8MM8 == 0b0001.
HWCAP_F8MM4
Functionality implied by ID_AA64FPFR0_EL1.F8MM4 == 0b0001.
HWCAP_SVE_F16MM
Functionality implied by ID_AA64PFR0_EL1.SVE == 0b0001 and
ID_AA64ZFR0_EL1.F16MM == 0b0001.
HWCAP_SVE_ELTPERM
Functionality implied by ID_AA64PFR0_EL1.SVE == 0b0001 and
ID_AA64ZFR0_EL1.ELTPERM == 0b0001.
HWCAP_SVE_AES2
Functionality implied by ID_AA64PFR0_EL1.SVE == 0b0001 and
ID_AA64ZFR0_EL1.AES == 0b0011.
HWCAP_SVE_BFSCALE
Functionality implied by ID_AA64PFR0_EL1.SVE == 0b0001 and
ID_AA64ZFR0_EL1.B16B16 == 0b0010.
HWCAP_SVE2P2
Functionality implied by ID_AA64PFR0_EL1.SVE == 0b0001 and
ID_AA64ZFR0_EL1.SVEver == 0b0011.
HWCAP_SME2P2
Functionality implied by ID_AA64SMFR0_EL1.SMEver == 0b0011.
HWCAP_SME_SBITPERM
Functionality implied by ID_AA64SMFR0_EL1.SBitPerm == 0b1.
HWCAP_SME_AES
Functionality implied by ID_AA64SMFR0_EL1.AES == 0b1.
HWCAP_SME_SFEXPA
Functionality implied by ID_AA64SMFR0_EL1.SFEXPA == 0b1.
HWCAP_SME_STMOP
Functionality implied by ID_AA64SMFR0_EL1.STMOP == 0b1.
HWCAP_SME_SMOP4
Functionality implied by ID_AA64SMFR0_EL1.SMOP4 == 0b1.
HWCAP2_DCPODP
Functionality implied by ID_AA64ISAR1_EL1.DPB == 0b0010.
HWCAP2_SVE2
Functionality implied by ID_AA64PFR0_EL1.SVE == 0b0001 and
ID_AA64ZFR0_EL1.SVEver == 0b0001.
HWCAP2_SVEAES
Functionality implied by ID_AA64PFR0_EL1.SVE == 0b0001 and
ID_AA64ZFR0_EL1.AES == 0b0001.
HWCAP2_SVEPMULL
Functionality implied by ID_AA64PFR0_EL1.SVE == 0b0001 and
ID_AA64ZFR0_EL1.AES == 0b0010.
HWCAP2_SVEBITPERM
Functionality implied by ID_AA64PFR0_EL1.SVE == 0b0001 and
ID_AA64ZFR0_EL1.BitPerm == 0b0001.
HWCAP2_SVESHA3
Functionality implied by ID_AA64PFR0_EL1.SVE == 0b0001 and
ID_AA64ZFR0_EL1.SHA3 == 0b0001.
HWCAP2_SVESM4
Functionality implied by ID_AA64PFR0_EL1.SVE == 0b0001 and
ID_AA64ZFR0_EL1.SM4 == 0b0001.
HWCAP2_FLAGM2
Functionality implied by ID_AA64ISAR0_EL1.TS == 0b0010.
HWCAP2_FRINT
Functionality implied by ID_AA64ISAR1_EL1.FRINTTS == 0b0001.
HWCAP2_SVEI8MM
Functionality implied by ID_AA64PFR0_EL1.SVE == 0b0001 and
ID_AA64ZFR0_EL1.I8MM == 0b0001.
HWCAP2_SVEF32MM
Functionality implied by ID_AA64PFR0_EL1.SVE == 0b0001 and
ID_AA64ZFR0_EL1.F32MM == 0b0001.
HWCAP2_SVEF64MM
Functionality implied by ID_AA64PFR0_EL1.SVE == 0b0001 and
ID_AA64ZFR0_EL1.F64MM == 0b0001.
HWCAP2_SVEBF16
Functionality implied by ID_AA64PFR0_EL1.SVE == 0b0001 and
ID_AA64ZFR0_EL1.BF16 == 0b0001.
HWCAP2_I8MM
Functionality implied by ID_AA64ISAR1_EL1.I8MM == 0b0001.
HWCAP2_BF16
Functionality implied by ID_AA64ISAR1_EL1.BF16 == 0b0001.
HWCAP2_DGH
Functionality implied by ID_AA64ISAR1_EL1.DGH == 0b0001.
HWCAP2_RNG
Functionality implied by ID_AA64ISAR0_EL1.RNDR == 0b0001.
HWCAP2_BTI
Functionality implied by ID_AA64PFR1_EL1.BT == 0b0001.
HWCAP2_MTE
Functionality implied by ID_AA64PFR1_EL1.MTE == 0b0010, as described
by Documentation/arch/arm64/memory-tagging-extension.rst.
HWCAP2_ECV
Functionality implied by ID_AA64MMFR0_EL1.ECV == 0b0001.
HWCAP2_AFP
Functionality implied by ID_AA64MMFR1_EL1.AFP == 0b0001.
HWCAP2_RPRES
Functionality implied by ID_AA64ISAR2_EL1.RPRES == 0b0001.
HWCAP2_MTE3
Functionality implied by ID_AA64PFR1_EL1.MTE == 0b0011, as described
by Documentation/arch/arm64/memory-tagging-extension.rst.
HWCAP2_SME
Functionality implied by ID_AA64PFR1_EL1.SME == 0b0001, as described
by Documentation/arch/arm64/sme.rst.
HWCAP2_SME_I16I64
Functionality implied by ID_AA64SMFR0_EL1.I16I64 == 0b1111.
HWCAP2_SME_F64F64
Functionality implied by ID_AA64SMFR0_EL1.F64F64 == 0b1.
HWCAP2_SME_I8I32
Functionality implied by ID_AA64SMFR0_EL1.I8I32 == 0b1111.
HWCAP2_SME_F16F32
Functionality implied by ID_AA64SMFR0_EL1.F16F32 == 0b1.
HWCAP2_SME_B16F32
Functionality implied by ID_AA64SMFR0_EL1.B16F32 == 0b1.
HWCAP2_SME_F32F32
Functionality implied by ID_AA64SMFR0_EL1.F32F32 == 0b1.
HWCAP2_SME_FA64
Functionality implied by ID_AA64SMFR0_EL1.FA64 == 0b1.
HWCAP2_WFXT
Functionality implied by ID_AA64ISAR2_EL1.WFXT == 0b0010.
HWCAP2_EBF16
Functionality implied by ID_AA64ISAR1_EL1.BF16 == 0b0010.
HWCAP2_SVE_EBF16
Functionality implied by ID_AA64PFR0_EL1.SVE == 0b0001 and
ID_AA64ZFR0_EL1.BF16 == 0b0010.
HWCAP2_CSSC
Functionality implied by ID_AA64ISAR2_EL1.CSSC == 0b0001.
HWCAP2_RPRFM
Functionality implied by ID_AA64ISAR2_EL1.RPRFM == 0b0001.
HWCAP2_SVE2P1
Functionality implied by ID_AA64PFR0_EL1.SVE == 0b0001 and
ID_AA64ZFR0_EL1.SVEver == 0b0010.
HWCAP2_SME2
Functionality implied by ID_AA64SMFR0_EL1.SMEver == 0b0001.
HWCAP2_SME2P1
Functionality implied by ID_AA64SMFR0_EL1.SMEver == 0b0010.
HWCAP2_SMEI16I32
Functionality implied by ID_AA64SMFR0_EL1.I16I32 == 0b0101
HWCAP2_SMEBI32I32
Functionality implied by ID_AA64SMFR0_EL1.BI32I32 == 0b1
HWCAP2_SMEB16B16
Functionality implied by ID_AA64SMFR0_EL1.B16B16 == 0b1
HWCAP2_SMEF16F16
Functionality implied by ID_AA64SMFR0_EL1.F16F16 == 0b1
HWCAP2_MOPS
Functionality implied by ID_AA64ISAR2_EL1.MOPS == 0b0001.
HWCAP2_HBC
Functionality implied by ID_AA64ISAR2_EL1.BC == 0b0001.
HWCAP2_SVE_B16B16
Functionality implied by ID_AA64PFR0_EL1.SVE == 0b0001 and
ID_AA64ZFR0_EL1.B16B16 == 0b0001.
HWCAP2_LRCPC3
Functionality implied by ID_AA64ISAR1_EL1.LRCPC == 0b0011.
HWCAP2_LSE128
Functionality implied by ID_AA64ISAR0_EL1.Atomic == 0b0011.
HWCAP2_FPMR
Functionality implied by ID_AA64PFR2_EL1.FMR == 0b0001.
HWCAP2_LUT
Functionality implied by ID_AA64ISAR2_EL1.LUT == 0b0001.
HWCAP2_FAMINMAX
Functionality implied by ID_AA64ISAR3_EL1.FAMINMAX == 0b0001.
HWCAP2_F8CVT
Functionality implied by ID_AA64FPFR0_EL1.F8CVT == 0b1.
HWCAP2_F8FMA
Functionality implied by ID_AA64FPFR0_EL1.F8FMA == 0b1.
HWCAP2_F8DP4
Functionality implied by ID_AA64FPFR0_EL1.F8DP4 == 0b1.
HWCAP2_F8DP2
Functionality implied by ID_AA64FPFR0_EL1.F8DP2 == 0b1.
HWCAP2_F8E4M3
Functionality implied by ID_AA64FPFR0_EL1.F8E4M3 == 0b1.
HWCAP2_F8E5M2
Functionality implied by ID_AA64FPFR0_EL1.F8E5M2 == 0b1.
HWCAP2_SME_LUTV2
Functionality implied by ID_AA64SMFR0_EL1.LUTv2 == 0b1.
HWCAP2_SME_F8F16
Functionality implied by ID_AA64SMFR0_EL1.F8F16 == 0b1.
HWCAP2_SME_F8F32
Functionality implied by ID_AA64SMFR0_EL1.F8F32 == 0b1.
HWCAP2_SME_SF8FMA
Functionality implied by ID_AA64SMFR0_EL1.SF8FMA == 0b1.
HWCAP2_SME_SF8DP4
Functionality implied by ID_AA64SMFR0_EL1.SF8DP4 == 0b1.
HWCAP2_SME_SF8DP2
Functionality implied by ID_AA64SMFR0_EL1.SF8DP2 == 0b1.
HWCAP2_SME_SF8DP4
Functionality implied by ID_AA64SMFR0_EL1.SF8DP4 == 0b1.
HWCAP2_POE
Functionality implied by ID_AA64MMFR3_EL1.S1POE == 0b0001.
HWCAP3_MTE_FAR
Functionality implied by ID_AA64PFR2_EL1.MTEFAR == 0b0001.
HWCAP3_MTE_STORE_ONLY
Functionality implied by ID_AA64PFR2_EL1.MTESTOREONLY == 0b0001.
HWCAP3_LSFE
Functionality implied by ID_AA64ISAR3_EL1.LSFE == 0b0001
4. Unused AT_HWCAP bits
-----------------------
For interoperation with userspace, the kernel guarantees that bits 62
and 63 of AT_HWCAP will always be returned as 0.
3. 한국어 전문 번역
영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.
문서 범위
1-9이 문서는 `ARM64 ELF hwcaps`의 사용법과 의미를 설명하며 Sphinx anchor는 `_elf_hwcaps_index`입니다.
Auxiliary vector에서 기능 확인
10-41일부 hardware 또는 software 기능은 특정 CPU 구현이나 kernel configuration에서만 제공되지만, EL0 userspace code가 사용할 수 있는 architecture 표준 발견 방법이 없습니다. Kernel은 이 기능들의 존재를 auxiliary vector에 담긴 `hwcaps` flag 집합으로 공개합니다.
Userspace는 auxiliary vector의 `AT_HWCAP`, `AT_HWCAP2`, `AT_HWCAP3` entry를 얻고 관련 flag가 설정되었는지 검사할 수 있습니다. 원문의 예제는 `getauxval(AT_HWCAP)` 결과에 `HWCAP_FP`가 있으면 floating-point 기능이 있다고 반환합니다.
bool floating_point_is_present(void)
{
unsigned long hwcaps = getauxval(AT_HWCAP);
if (hwcaps & HWCAP_FP)
return true;
return false;
}
Software가 hwcap으로 표현된 기능에 의존한다면 사용하기 전에 해당 flag를 검사해야 합니다. 다른 방법으로 기능을 probe하는 것은 신뢰할 수 없습니다. 미지원 기능을 실행해도 결과는 예측할 수 없으며, `SIGILL`처럼 기능 부재를 확실히 알려 주는 신호가 반드시 발생하는 것도 아닙니다.
hwcap 조건식 해석
42-65대부분의 hwcap은 EL0에서 직접 읽을 수 없는 architecture ID register가 설명하는 기능의 존재를 뜻합니다. 각 hwcap은 ID register field로 정의되므로 ARM Architecture Reference Manual, 즉 ARM ARM의 field 정의와 함께 해석해야 합니다.
원문은 조건을 다음 형식으로 표기합니다.
Functionality implied by idreg.field == val.
이 표기는 `idreg.field`가 `val`일 때 ARM ARM이 존재한다고 정의한 기능을 사용할 수 있다는 뜻입니다. Field가 정확히 `val`과 같다는 의미는 아니며, 같은 field의 다른 값이 뜻하는 기능이 없다고 단정하는 것도 아닙니다.
ID register만으로 설명할 수 없는 기능을 나타내는 hwcap도 있습니다. 그런 항목은 ID register 조건 대신 별도 문서나 동작 설명을 사용합니다.
AT_HWCAP 기본 기능
66-176다음 표는 `AT_HWCAP`의 기본 항목을 원문 순서대로 보존합니다. 조건식의 register, field, binary 값은 ABI 식별자이므로 번역하지 않습니다.
| hwcap | 가용성 의미 |
|---|---|
| `HWCAP_FP` | 다음 조건이 의미하는 기능: ID_AA64PFR0_EL1.FP == 0b0000. |
| `HWCAP_ASIMD` | 다음 조건이 의미하는 기능: ID_AA64PFR0_EL1.AdvSIMD == 0b0000. |
| `HWCAP_EVTSTRM` | Generic timer가 약 10KHz 주파수로 event를 생성하도록 구성되어 있습니다. |
| `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 register에 접근할 수 있습니다. 이 ID register들은 추가 기능의 가용성을 나타낼 수 있습니다. |
| `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` | 다음 조건이 의미하는 기능: ID_AA64ISAR1_EL1.APA == 0b0001 또는 ID_AA64ISAR1_EL1.API == 0b0001; Documentation/arch/arm64/pointer-authentication.rst에 설명되어 있음. |
| `HWCAP_PACG` | 다음 조건이 의미하는 기능: ID_AA64ISAR1_EL1.GPA == 0b0001 또는 ID_AA64ISAR1_EL1.GPI == 0b0001; Documentation/arch/arm64/pointer-authentication.rst에 설명되어 있음. |
| `HWCAP_GCS` | 다음 조건이 의미하는 기능: ID_AA64PFR1_EL1.GCS == 0b1; Documentation/arch/arm64/gcs.rst에 설명되어 있음. |
AT_HWCAP 확장 기능
177-225이 구간은 compare-and-branch, floating-point 8-bit, SVE 및 SME 확장 기능에 대한 `AT_HWCAP` flag를 설명합니다.
| hwcap | 가용성 의미 |
|---|---|
| `HWCAP_CMPBR` | 다음 조건이 의미하는 기능: ID_AA64ISAR2_EL1.CSSC == 0b0010. |
| `HWCAP_FPRCVT` | 다음 조건이 의미하는 기능: ID_AA64ISAR3_EL1.FPRCVT == 0b0001. |
| `HWCAP_F8MM8` | 다음 조건이 의미하는 기능: ID_AA64FPFR0_EL1.F8MM8 == 0b0001. |
| `HWCAP_F8MM4` | 다음 조건이 의미하는 기능: ID_AA64FPFR0_EL1.F8MM4 == 0b0001. |
| `HWCAP_SVE_F16MM` | 다음 조건이 의미하는 기능: ID_AA64PFR0_EL1.SVE == 0b0001 그리고 ID_AA64ZFR0_EL1.F16MM == 0b0001. |
| `HWCAP_SVE_ELTPERM` | 다음 조건이 의미하는 기능: ID_AA64PFR0_EL1.SVE == 0b0001 그리고 ID_AA64ZFR0_EL1.ELTPERM == 0b0001. |
| `HWCAP_SVE_AES2` | 다음 조건이 의미하는 기능: ID_AA64PFR0_EL1.SVE == 0b0001 그리고 ID_AA64ZFR0_EL1.AES == 0b0011. |
| `HWCAP_SVE_BFSCALE` | 다음 조건이 의미하는 기능: ID_AA64PFR0_EL1.SVE == 0b0001 그리고 ID_AA64ZFR0_EL1.B16B16 == 0b0010. |
| `HWCAP_SVE2P2` | 다음 조건이 의미하는 기능: ID_AA64PFR0_EL1.SVE == 0b0001 그리고 ID_AA64ZFR0_EL1.SVEver == 0b0011. |
| `HWCAP_SME2P2` | 다음 조건이 의미하는 기능: ID_AA64SMFR0_EL1.SMEver == 0b0011. |
| `HWCAP_SME_SBITPERM` | 다음 조건이 의미하는 기능: ID_AA64SMFR0_EL1.SBitPerm == 0b1. |
| `HWCAP_SME_AES` | 다음 조건이 의미하는 기능: ID_AA64SMFR0_EL1.AES == 0b1. |
| `HWCAP_SME_SFEXPA` | 다음 조건이 의미하는 기능: ID_AA64SMFR0_EL1.SFEXPA == 0b1. |
| `HWCAP_SME_STMOP` | 다음 조건이 의미하는 기능: ID_AA64SMFR0_EL1.STMOP == 0b1. |
| `HWCAP_SME_SMOP4` | 다음 조건이 의미하는 기능: ID_AA64SMFR0_EL1.SMOP4 == 0b1. |
AT_HWCAP2 기능 1
226-342`AT_HWCAP2`의 첫 구간은 SVE2, crypto, matrix multiply, MTE, SME와 관련된 조건을 포함합니다.
| hwcap | 가용성 의미 |
|---|---|
| `HWCAP2_DCPODP` | 다음 조건이 의미하는 기능: ID_AA64ISAR1_EL1.DPB == 0b0010. |
| `HWCAP2_SVE2` | 다음 조건이 의미하는 기능: ID_AA64PFR0_EL1.SVE == 0b0001 그리고 ID_AA64ZFR0_EL1.SVEver == 0b0001. |
| `HWCAP2_SVEAES` | 다음 조건이 의미하는 기능: ID_AA64PFR0_EL1.SVE == 0b0001 그리고 ID_AA64ZFR0_EL1.AES == 0b0001. |
| `HWCAP2_SVEPMULL` | 다음 조건이 의미하는 기능: ID_AA64PFR0_EL1.SVE == 0b0001 그리고 ID_AA64ZFR0_EL1.AES == 0b0010. |
| `HWCAP2_SVEBITPERM` | 다음 조건이 의미하는 기능: ID_AA64PFR0_EL1.SVE == 0b0001 그리고 ID_AA64ZFR0_EL1.BitPerm == 0b0001. |
| `HWCAP2_SVESHA3` | 다음 조건이 의미하는 기능: ID_AA64PFR0_EL1.SVE == 0b0001 그리고 ID_AA64ZFR0_EL1.SHA3 == 0b0001. |
| `HWCAP2_SVESM4` | 다음 조건이 의미하는 기능: ID_AA64PFR0_EL1.SVE == 0b0001 그리고 ID_AA64ZFR0_EL1.SM4 == 0b0001. |
| `HWCAP2_FLAGM2` | 다음 조건이 의미하는 기능: ID_AA64ISAR0_EL1.TS == 0b0010. |
| `HWCAP2_FRINT` | 다음 조건이 의미하는 기능: ID_AA64ISAR1_EL1.FRINTTS == 0b0001. |
| `HWCAP2_SVEI8MM` | 다음 조건이 의미하는 기능: ID_AA64PFR0_EL1.SVE == 0b0001 그리고 ID_AA64ZFR0_EL1.I8MM == 0b0001. |
| `HWCAP2_SVEF32MM` | 다음 조건이 의미하는 기능: ID_AA64PFR0_EL1.SVE == 0b0001 그리고 ID_AA64ZFR0_EL1.F32MM == 0b0001. |
| `HWCAP2_SVEF64MM` | 다음 조건이 의미하는 기능: ID_AA64PFR0_EL1.SVE == 0b0001 그리고 ID_AA64ZFR0_EL1.F64MM == 0b0001. |
| `HWCAP2_SVEBF16` | 다음 조건이 의미하는 기능: ID_AA64PFR0_EL1.SVE == 0b0001 그리고 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_AA64PFR1_EL1.BT == 0b0001. |
| `HWCAP2_MTE` | 다음 조건이 의미하는 기능: ID_AA64PFR1_EL1.MTE == 0b0010; Documentation/arch/arm64/memory-tagging-extension.rst에 설명되어 있음. |
| `HWCAP2_ECV` | 다음 조건이 의미하는 기능: ID_AA64MMFR0_EL1.ECV == 0b0001. |
| `HWCAP2_AFP` | 다음 조건이 의미하는 기능: ID_AA64MMFR1_EL1.AFP == 0b0001. |
| `HWCAP2_RPRES` | 다음 조건이 의미하는 기능: ID_AA64ISAR2_EL1.RPRES == 0b0001. |
| `HWCAP2_MTE3` | 다음 조건이 의미하는 기능: ID_AA64PFR1_EL1.MTE == 0b0011; Documentation/arch/arm64/memory-tagging-extension.rst에 설명되어 있음. |
| `HWCAP2_SME` | 다음 조건이 의미하는 기능: ID_AA64PFR1_EL1.SME == 0b0001; Documentation/arch/arm64/sme.rst에 설명되어 있음. |
| `HWCAP2_SME_I16I64` | 다음 조건이 의미하는 기능: ID_AA64SMFR0_EL1.I16I64 == 0b1111. |
| `HWCAP2_SME_F64F64` | 다음 조건이 의미하는 기능: ID_AA64SMFR0_EL1.F64F64 == 0b1. |
| `HWCAP2_SME_I8I32` | 다음 조건이 의미하는 기능: ID_AA64SMFR0_EL1.I8I32 == 0b1111. |
| `HWCAP2_SME_F16F32` | 다음 조건이 의미하는 기능: ID_AA64SMFR0_EL1.F16F32 == 0b1. |
| `HWCAP2_SME_B16F32` | 다음 조건이 의미하는 기능: ID_AA64SMFR0_EL1.B16F32 == 0b1. |
| `HWCAP2_SME_F32F32` | 다음 조건이 의미하는 기능: ID_AA64SMFR0_EL1.F32F32 == 0b1. |
| `HWCAP2_SME_FA64` | 다음 조건이 의미하는 기능: ID_AA64SMFR0_EL1.FA64 == 0b1. |
| `HWCAP2_WFXT` | 다음 조건이 의미하는 기능: ID_AA64ISAR2_EL1.WFXT == 0b0010. |
| `HWCAP2_EBF16` | 다음 조건이 의미하는 기능: ID_AA64ISAR1_EL1.BF16 == 0b0010. |
| `HWCAP2_SVE_EBF16` | 다음 조건이 의미하는 기능: ID_AA64PFR0_EL1.SVE == 0b0001 그리고 ID_AA64ZFR0_EL1.BF16 == 0b0010. |
AT_HWCAP2 기능 2
343-436`AT_HWCAP2`의 나머지 구간은 CSSC, SME2, MOPS, LSE128, FP8, LUT, POE 등의 조건을 원문 순서대로 나열합니다. 원문에 두 번 등장하는 `HWCAP2_SME_SF8DP4`도 줄 위치 보존을 위해 두 행 모두 유지합니다.
| hwcap | 가용성 의미 |
|---|---|
| `HWCAP2_CSSC` | 다음 조건이 의미하는 기능: ID_AA64ISAR2_EL1.CSSC == 0b0001. |
| `HWCAP2_RPRFM` | 다음 조건이 의미하는 기능: ID_AA64ISAR2_EL1.RPRFM == 0b0001. |
| `HWCAP2_SVE2P1` | 다음 조건이 의미하는 기능: ID_AA64PFR0_EL1.SVE == 0b0001 그리고 ID_AA64ZFR0_EL1.SVEver == 0b0010. |
| `HWCAP2_SME2` | 다음 조건이 의미하는 기능: ID_AA64SMFR0_EL1.SMEver == 0b0001. |
| `HWCAP2_SME2P1` | 다음 조건이 의미하는 기능: ID_AA64SMFR0_EL1.SMEver == 0b0010. |
| `HWCAP2_SMEI16I32` | 다음 조건이 의미하는 기능: ID_AA64SMFR0_EL1.I16I32 == 0b0101. |
| `HWCAP2_SMEBI32I32` | 다음 조건이 의미하는 기능: ID_AA64SMFR0_EL1.BI32I32 == 0b1. |
| `HWCAP2_SMEB16B16` | 다음 조건이 의미하는 기능: ID_AA64SMFR0_EL1.B16B16 == 0b1. |
| `HWCAP2_SMEF16F16` | 다음 조건이 의미하는 기능: ID_AA64SMFR0_EL1.F16F16 == 0b1. |
| `HWCAP2_MOPS` | 다음 조건이 의미하는 기능: ID_AA64ISAR2_EL1.MOPS == 0b0001. |
| `HWCAP2_HBC` | 다음 조건이 의미하는 기능: ID_AA64ISAR2_EL1.BC == 0b0001. |
| `HWCAP2_SVE_B16B16` | 다음 조건이 의미하는 기능: ID_AA64PFR0_EL1.SVE == 0b0001 그리고 ID_AA64ZFR0_EL1.B16B16 == 0b0001. |
| `HWCAP2_LRCPC3` | 다음 조건이 의미하는 기능: ID_AA64ISAR1_EL1.LRCPC == 0b0011. |
| `HWCAP2_LSE128` | 다음 조건이 의미하는 기능: ID_AA64ISAR0_EL1.Atomic == 0b0011. |
| `HWCAP2_FPMR` | 다음 조건이 의미하는 기능: ID_AA64PFR2_EL1.FMR == 0b0001. |
| `HWCAP2_LUT` | 다음 조건이 의미하는 기능: ID_AA64ISAR2_EL1.LUT == 0b0001. |
| `HWCAP2_FAMINMAX` | 다음 조건이 의미하는 기능: ID_AA64ISAR3_EL1.FAMINMAX == 0b0001. |
| `HWCAP2_F8CVT` | 다음 조건이 의미하는 기능: ID_AA64FPFR0_EL1.F8CVT == 0b1. |
| `HWCAP2_F8FMA` | 다음 조건이 의미하는 기능: ID_AA64FPFR0_EL1.F8FMA == 0b1. |
| `HWCAP2_F8DP4` | 다음 조건이 의미하는 기능: ID_AA64FPFR0_EL1.F8DP4 == 0b1. |
| `HWCAP2_F8DP2` | 다음 조건이 의미하는 기능: ID_AA64FPFR0_EL1.F8DP2 == 0b1. |
| `HWCAP2_F8E4M3` | 다음 조건이 의미하는 기능: ID_AA64FPFR0_EL1.F8E4M3 == 0b1. |
| `HWCAP2_F8E5M2` | 다음 조건이 의미하는 기능: ID_AA64FPFR0_EL1.F8E5M2 == 0b1. |
| `HWCAP2_SME_LUTV2` | 다음 조건이 의미하는 기능: ID_AA64SMFR0_EL1.LUTv2 == 0b1. |
| `HWCAP2_SME_F8F16` | 다음 조건이 의미하는 기능: ID_AA64SMFR0_EL1.F8F16 == 0b1. |
| `HWCAP2_SME_F8F32` | 다음 조건이 의미하는 기능: ID_AA64SMFR0_EL1.F8F32 == 0b1. |
| `HWCAP2_SME_SF8FMA` | 다음 조건이 의미하는 기능: ID_AA64SMFR0_EL1.SF8FMA == 0b1. |
| `HWCAP2_SME_SF8DP4` | 다음 조건이 의미하는 기능: ID_AA64SMFR0_EL1.SF8DP4 == 0b1. |
| `HWCAP2_SME_SF8DP2` | 다음 조건이 의미하는 기능: ID_AA64SMFR0_EL1.SF8DP2 == 0b1. |
| `HWCAP2_SME_SF8DP4` | 다음 조건이 의미하는 기능: ID_AA64SMFR0_EL1.SF8DP4 == 0b1. |
| `HWCAP2_POE` | 다음 조건이 의미하는 기능: ID_AA64MMFR3_EL1.S1POE == 0b0001. |
AT_HWCAP3와 미사용 bit
437-452`AT_HWCAP3`에는 MTE fault address, store-only MTE, LSFE 조건이 정의되어 있습니다.
| hwcap | 가용성 의미 |
|---|---|
| `HWCAP3_MTE_FAR` | 다음 조건이 의미하는 기능: ID_AA64PFR2_EL1.MTEFAR == 0b0001. |
| `HWCAP3_MTE_STORE_ONLY` | 다음 조건이 의미하는 기능: ID_AA64PFR2_EL1.MTESTOREONLY == 0b0001. |
| `HWCAP3_LSFE` | 다음 조건이 의미하는 기능: ID_AA64ISAR3_EL1.LSFE == 0b0001. |
Userspace와의 상호 운용을 위해 kernel은 `AT_HWCAP`의 bit 62와 63을 항상 `0`으로 반환한다고 보장합니다.
요약과 해설
elf_hwcaps.rst:1-452Hwcap은 EL0가 직접 발견할 수 없는 CPU·kernel 기능을 auxiliary vector flag로 전달합니다. Software는 기능을 사용하기 전에 반드시 해당 flag를 확인해야 하며, instruction 실행 후 `SIGILL` 여부로 probe해서는 안 됩니다.
기능 사용 전에 auxiliary vector를 읽고 bit를 검증합니다.
이번 원문에 정의된 항목 수를 기준으로 정리합니다.