1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
|
Architecture Features
=====================
The Arm architecture evolves through versioning, with new architectural features being introduced
almost every year listed in `Feature_description`_. While most of these features require no control
at EL3, some demand explicit configuration of EL3 control registers to enable their use at lower
Exception Levels. For features with EL3 controls, it is relatively straightforward to examine the
code and determine whether TF-A support them. However, for features that are transparent to EL3, it
is more challenging to confirm whether they have been analyzed and verified as not requiring changes
in TF-A.
This document serves as a central reference point to track and clarify the support status of
architectural features within TF-A.
This document organizes features according to the yearly updates, while the specific architecture
versions (8.X, 9.X) to which they apply can be found in `Feature_description`_
.. note::
**Status legend** —
* ``OK``: TF-A has explicit support;
* ``NA``: Transparent from EL3 (no EL3 changes required);
* ``NO``: Analyzed but decided not to implement;
* ``WIP``: Implementation in progress;
* *(empty)*: Not analyzed.
2025 Extensions
---------------
+-------------------------+--------+
| Feature | Status |
+=========================+========+
| FEAT_GCIE | OK |
+-------------------------+--------+
| FEAT_GCIE_LEGACY | NA |
+-------------------------+--------+
| FEAT_F16F32DOT | NA |
+-------------------------+--------+
| FEAT_F16F32MM | NA |
+-------------------------+--------+
| FEAT_F16MM | NA |
+-------------------------+--------+
| FEAT_SVE_B16MM | NA |
+-------------------------+--------+
| FEAT_SME2p3 | NA |
+-------------------------+--------+
| FEAT_MTE_EIRG | NA |
+-------------------------+--------+
| FEAT_MTETC | NA |
+-------------------------+--------+
| FEAT_SVE2p3 | NA |
+-------------------------+--------+
| FEAT_SCR2 | |
+-------------------------+--------+
| FEAT_LSCP | NA |
+-------------------------+--------+
| FEAT_MPAMv2_VID | NA |
+-------------------------+--------+
| FEAT_MPAMv2_MSC | NA |
+-------------------------+--------+
| FEAT_MPAMv2_MSC_MON_SEC | NA |
+-------------------------+--------+
| FEAT_MPAMv2_ALT_ID | NA |
+-------------------------+--------+
| FEAT_MPAMv2 | |
+-------------------------+--------+
| FEAT_FDIT | |
+-------------------------+--------+
| FEAT_CMH | NA |
+-------------------------+--------+
| FEAT_EAESR | NA |
+-------------------------+--------+
| FEAT_TLBID | NA |
+-------------------------+--------+
| FEAT_SRMASK2 | |
+-------------------------+--------+
| FEAT_BBML3 | NA |
+-------------------------+--------+
| FEAT_NV3 | |
+-------------------------+--------+
| FEAT_PAuth_EnhCtl | |
+-------------------------+--------+
| FEAT_LORRL | NA |
+-------------------------+--------+
2024 Extensions
---------------
+-----------------------+--------+
| Feature | Status |
+=======================+========+
| FEAT_PMUv3_EXTPMN | NA |
+-----------------------+--------+
| FEAT_SPEv1p5 | OK |
+-----------------------+--------+
| FEAT_SPE_EXC | OK |
+-----------------------+--------+
| FEAT_SPE_nVM | OK |
+-----------------------+--------+
| FEAT_TRBEv1p1 | NA |
+-----------------------+--------+
| FEAT_TRBE_EXC | |
+-----------------------+--------+
| FEAT_SME_MOP4 | NA |
+-----------------------+--------+
| FEAT_SME_TMOP | NA |
+-----------------------+--------+
| FEAT_PoPS | NA |
+-----------------------+--------+
| FEAT_SME2p2 | NA |
+-----------------------+--------+
| FEAT_CMPBR | NA |
+-----------------------+--------+
| FEAT_SSVE_AES | NA |
+-----------------------+--------+
| FEAT_RME_GPC3 | WIP |
+-----------------------+--------+
| FEAT_RME_GDI | OK |
+-----------------------+--------+
| FEAT_SVE2p2 | NA |
+-----------------------+--------+
| FEAT_SSVE_BitPerm | NA |
+-----------------------+--------+
| FEAT_SSVE_FEXPA | NA |
+-----------------------+--------+
| FEAT_SVE_AES2 | NA |
+-----------------------+--------+
| FEAT_LSFE | NA |
+-----------------------+--------+
| FEAT_FPRCVT | NA |
+-----------------------+--------+
| FEAT_SVE_F16F32MM | NA |
+-----------------------+--------+
| FEAT_F8F16MM | NA |
+-----------------------+--------+
| FEAT_F8F32MM | NA |
+-----------------------+--------+
| FEAT_SVE_BFSCALE | NA |
+-----------------------+--------+
| FEAT_OCCMO | NA |
+-----------------------+--------+
| FEAT_LS64WB | NA |
+-----------------------+--------+
| FEAT_AMU_EXTACR | NA |
+-----------------------+--------+
| FEAT_MPAM_MSC_DOMAINS | NA |
+-----------------------+--------+
| FEAT_MPAM_MSC_DCTRL | NA |
+-----------------------+--------+
| FEAT_MPAM_PE_BW_CTRL | OK |
+-----------------------+--------+
| FEAT_PCDPHINT | NA |
+-----------------------+--------+
| FEAT_SRMASK | |
+-----------------------+--------+
| FEAT_IDTE3 | OK |
+-----------------------+--------+
| FEAT_UINJ | OK |
+-----------------------+--------+
| FEAT_NV2p1 | NA |
+-----------------------+--------+
| FEAT_LSUI | NA |
+-----------------------+--------+
2023 Extensions
---------------
+-------------------+--------+
| Feature | Status |
+===================+========+
| FEAT_E2H0 | NA |
+-------------------+--------+
| FEAT_SME_LUTv2 | NA |
+-------------------+--------+
| FEAT_LUT | NA |
+-------------------+--------+
| FEAT_FAMINMAX | NA |
+-------------------+--------+
| FEAT_FPMR | OK |
+-------------------+--------+
| FEAT_FP8 | NA |
+-------------------+--------+
| FEAT_FP8FMA | NA |
+-------------------+--------+
| FEAT_SSVE_FP8FMA | NA |
+-------------------+--------+
| FEAT_FP8DOT4 | NA |
+-------------------+--------+
| FEAT_SSVE_FP8DOT4 | NA |
+-------------------+--------+
| FEAT_FP8DOT2 | NA |
+-------------------+--------+
| FEAT_SSVE_FP8DOT2 | NA |
+-------------------+--------+
| FEAT_SME_F8F16 | NA |
+-------------------+--------+
| FEAT_SME_F8F32 | NA |
+-------------------+--------+
| FEAT_CPA | NA |
+-------------------+--------+
| FEAT_CPA2 | OK |
+-------------------+--------+
| FEAT_STEP2 | OK |
+-------------------+--------+
| FEAT_BWE2 | NA |
+-------------------+--------+
| FEAT_SPE_FPF | NA |
+-------------------+--------+
| FEAT_SPE_EFT | NA |
+-------------------+--------+
| FEAT_PMUv3_TH2 | NA |
+-------------------+--------+
| FEAT_SPMU2 | NA |
+-------------------+--------+
| FEAT_E3DSE | |
+-------------------+--------+
| FEAT_PMUv3_SME | NA |
+-------------------+--------+
| FEAT_SPE_SME | NA |
+-------------------+--------+
| FEAT_SPE_ALTCLK | NA |
+-------------------+--------+
| FEAT_HDBSS | OK |
+-------------------+--------+
| FEAT_HACDBS | OK |
+-------------------+--------+
| FEAT_TLBIW | NA |
+-------------------+--------+
| FEAT_ASID2 | NA |
+-------------------+--------+
| FEAT_RME_GPC2 | OK |
+-------------------+--------+
| FEAT_FGWTE3 | OK |
+-------------------+--------+
| FEAT_PAuth_LR | OK |
+-------------------+--------+
| FEAT_ETS3 | NA |
+-------------------+--------+
2022 Extensions
---------------
+--------------------------+--------+
| Feature | Status |
+==========================+========+
| FEAT_BWE | NA |
+--------------------------+--------+
| FEAT_ADERR | |
+--------------------------+--------+
| FEAT_ANERR | |
+--------------------------+--------+
| FEAT_DoubleFault2 | |
+--------------------------+--------+
| FEAT_PFAR | OK |
+--------------------------+--------+
| FEAT_RASv2 | |
+--------------------------+--------+
| FEAT_CSSC | NA |
+--------------------------+--------+
| FEAT_RPRFM | NA |
+--------------------------+--------+
| FEAT_PRFMSLC | NA |
+--------------------------+--------+
| FEAT_SPECRES2 | |
+--------------------------+--------+
| FEAT_CLRBHB | Ok |
+--------------------------+--------+
| FEAT_ECBHB | NA |
+--------------------------+--------+
| FEAT_SME2p1 | NA |
+--------------------------+--------+
| FEAT_SME_F16F16 | NA |
+--------------------------+--------+
| FEAT_SVE_B16B16 | NA |
+--------------------------+--------+
| FEAT_SME_B16B16 | NA |
+--------------------------+--------+
| FEAT_FGT2 | OK |
+--------------------------+--------+
| FEAT_MTE4 | NA |
+--------------------------+--------+
| FEAT_MTE_CANONICAL_TAGS | NA |
+--------------------------+--------+
| FEAT_MTE_NO_ADDRESS_TAGS | NA |
+--------------------------+--------+
| FEAT_MTE_TAGGED_FAR | NA |
+--------------------------+--------+
| FEAT_MTE_PERM | NA |
+--------------------------+--------+
| FEAT_MTE_STORE_ONLY | NA |
+--------------------------+--------+
| FEAT_ITE | NA |
+--------------------------+--------+
| FEAT_TRBE_EXT | NA |
+--------------------------+--------+
| FEAT_TRBE_MPAM | |
+--------------------------+--------+
| FEAT_ETEv1p3 | NA |
+--------------------------+--------+
| FEAT_GCS | OK |
+--------------------------+--------+
| FEAT_CHK | NA |
+--------------------------+--------+
| FEAT_SPE_DPFZS | NA |
+--------------------------+--------+
| FEAT_SPE_CRR | NA |
+--------------------------+--------+
| FEAT_EBEP | OK |
+--------------------------+--------+
| FEAT_SEBEP | OK |
+--------------------------+--------+
| FEAT_PMUv3_SS | |
+--------------------------+--------+
| FEAT_SPMU | |
+--------------------------+--------+
| FEAT_PMUv3_ICNTR | |
+--------------------------+--------+
| FEAT_PMUv3p9 | OK |
+--------------------------+--------+
| FEAT_SVE2p1 | NA |
+--------------------------+--------+
| FEAT_Debugv8p9 | OK |
+--------------------------+--------+
| FEAT_ABLE | NA |
+--------------------------+--------+
| FEAT_PCSRv8p9 | NA |
+--------------------------+--------+
| FEAT_LRCPC3 | NA |
+--------------------------+--------+
| FEAT_SPEv1p4 | NA |
+--------------------------+--------+
| FEAT_SPE_FDS | OK |
+--------------------------+--------+
| FEAT_PMUv3_EDGE | NA |
+--------------------------+--------+
| FEAT_D128 | OK |
+--------------------------+--------+
| FEAT_AIE | OK |
+--------------------------+--------+
| FEAT_S1PIE | OK |
+--------------------------+--------+
| FEAT_ATS1A | NA |
+--------------------------+--------+
| FEAT_S1POE | OK |
+--------------------------+--------+
| FEAT_S2PIE | OK |
+--------------------------+--------+
| FEAT_S2POE | OK |
+--------------------------+--------+
| FEAT_SYSREG128 | OK |
+--------------------------+--------+
| FEAT_SYSINSTR128 | NA |
+--------------------------+--------+
| FEAT_LSE128 | NA |
+--------------------------+--------+
| FEAT_HAFT | NA |
+--------------------------+--------+
| FEAT_THE | OK |
+--------------------------+--------+
| FEAT_LVA3 | NA |
+--------------------------+--------+
| FEAT_MTE_ASYNC | NA |
+--------------------------+--------+
| FEAT_EDHSR | NA |
+--------------------------+--------+
| FEAT_AMU_EXT64 | NA |
+--------------------------+--------+
2021 Extensions
---------------
+------------------+--------+
| Feature | Status |
+==================+========+
| FEAT_SME2 | OK |
+------------------+--------+
| FEAT_MEC | OK |
+------------------+--------+
| FEAT_BRBEv1p1 | OK |
+------------------+--------+
| FEAT_CMOW | NA |
+------------------+--------+
| FEAT_Debugv8p8 | NA |
+------------------+--------+
| FEAT_HBC | NA |
+------------------+--------+
| FEAT_MOPS | OK |
+------------------+--------+
| FEAT_NMI | OK |
+------------------+--------+
| FEAT_SPEv1p3 | NA |
+------------------+--------+
| FEAT_TIDCP1 | NA |
+------------------+--------+
| FEAT_PMUv3_TH | NA |
+------------------+--------+
| FEAT_PMUv3p8 | NA |
+------------------+--------+
| FEAT_SCTLR2 | OK |
+------------------+--------+
| FEAT_TCR2 | OK |
+------------------+--------+
| FEAT_PMUv3_EXT64 | NA |
+------------------+--------+
2020 Extensions
---------------
+---------------------+--------+
| Feature | Status |
+=====================+========+
| FEAT_EBF16 | NA |
+---------------------+--------+
| FEAT_ETEv1p1 | NA |
+---------------------+--------+
| FEAT_HCX | OK |
+---------------------+--------+
| FEAT_PAN3 | OK |
+---------------------+--------+
| FEAT_WFxT | NA |
+---------------------+--------+
| FEAT_XS | NO |
+---------------------+--------+
| FEAT_AFP | NA |
+---------------------+--------+
| FEAT_RPRES | NA |
+---------------------+--------+
| FEAT_LPA2 | NO |
+---------------------+--------+
| FEAT_LS64 | NA |
+---------------------+--------+
| FEAT_LS64_V | NA |
+---------------------+--------+
| FEAT_LS64_ACCDATA | OK |
+---------------------+--------+
| FEAT_MTE3 | NA |
+---------------------+--------+
| FEAT_MTE_ASYM_FAULT | NA |
+---------------------+--------+
| FEAT_SPEv1p2 | OK |
+---------------------+--------+
| FEAT_SPE_FnE | NA |
+---------------------+--------+
| FEAT_SPE_PBT | OK |
+---------------------+--------+
| FEAT_PMUv3p7 | OK |
+---------------------+--------+
.. _enable_feat_mechanism:
The ``ENABLE_FEAT`` mechanism
-----------------------------
The Arm architecture defines several architecture extension features, named
FEAT_xxx in the architecure manual. Some of those features require setup code in
higher exception levels, other features might be used by TF-A code itself.
Most of the feature flags defined in the TF-A build system are allowed to take
the values 0, 1 or 2, with the following meaning:
::
ENABLE_FEAT_* = 0: Feature is unconditionally disabled at compile time.
ENABLE_FEAT_* = 1: Feature is unconditionally enabled at compile time.
ENABLE_FEAT_* = 2: Feature support is compiled in, but only enabled if the
feature present at runtime.
When setting the flag to 0, the feature is disabled during compilation, and the
compiler's optimization stage and the linker will try to remove as much of this
code as possible.
If it is defined to 1, the code will use the feature unconditionally, so the CPU
is expected to support that feature. The FEATURE_DETECTION debug feature, if
enabled, will verify this.
If the feature flag is set to 2, support for the feature will be compiled in,
but its existence will be checked at runtime, so it works on CPUs with or
without the feature. This is mostly useful for platforms which either support
multiple different CPUs, or where the CPU is configured at runtime, like in
emulators.
Adding support for a new feature
--------------------------------
Adding support for a feature is required when:
a) a feature is added to the architecture and it includes controls at EL3
b) a feature is to be used by EL3 itself
c) EL3 wants to hide a feature from lower ELs (eg. with ``FEAT_IDTE3``)
The following is a checklist with guidance on what to do to add a new feature,
in this case a fictional ``FEAT_ABC``. This is not an exhaustive list on how to
do this, so please consult with previous such patches and/or maintainers. Please
consult the Arm ARM on any specifics about the feature itself. You can speed
this process up by using the ``new-cpu-feature`` agent skill.
- Add a feature flag to the build system.
- The flag's name should be in the form ``ENABLE_FEAT_ABC``.
- Add it to the ``assert_numerics`` and ``add_defines`` lists in the
``Makefile``.
- Add a default of ``0`` for it in ``make_helpers/defaults.mk``.
- If the feature is listed as mandatory from a certain revision of the
architecture, add it to the appropriate list in
``make_helpers/arch_features.mk``.
- Add any constraints in ``make_helpers/constraints.mk``. This will usually be
other features which this feature depends on or is incompatible with and can
be found in the main description of the feature in the Arm ARM.
- Create a macro for the feature in ``include/arch/aarch64/arch_features.h`` and
add it to the appropriate list to register with other frameworks. If the
feature doesn't neatly fit in the standard pattern, it can be progressively
unravelled.
- In rare occasions, the feature must be checked in assembly. A
``is_feat_abc_present_asm`` macro must be added to
``include/lib/cpus/aarch64/cpu_macros.S``.
- Add support for the feature. This will be very feature specific and exact code
will depend on why support is being added. Usually, support will be a few
lines in ``lib/el3_runtime/aarch64/context_mgmt.c``. Some common things to do
include:
- If support requires more extensive code sequences, consider adding them to a
file in ``lib/extensions/abc/``. Functions in this file must be named
similar to other features. Those are likely to be ``abc_enable()``,
``abc_enable_el3()``, or ``abc_disable()``. Naming depends on the call site.
- If the feature introduces ``SCR_EL3``, ``MDCR_EL3``, or ``CPTR_EL3`` controls
for lower ELs, access must be enabled for at least NS world, preferably all
worlds by setting/clearing the bit in the context copy of this register.
- If the feature introduces any control bits in ``SCR_EL3``, ``MDCR_EL3``,
``CPTR_EL3``, or ``MPAM3_EL3``, those must be added to the appropriate list
in ``include/services/arm_arch_svc.h`` to register with
``ARCH_FEATURE_AVAILABILITY``. This must also be done in the
``test_smccc_arch_feature_availability`` test in TFTF, otherwise CI will
fail.
- If the feature comes with lower EL registers:
- those should be context switched if enabling the feature for multiple worlds.
- if these are EL2 control registers, consider their fields' reset values. If
they can reset to a value that would make a field active (like enabling a
trap), a safe inactive reset value should be added to
``setup_el2_context()`` in ``lib/el3_runtime/aarch64/context_mgmt.c``.
- Consider whether the feature introduces any potential side channels and how
to close them.
- Add documentation in ``docs/getting_started/build-options.rst``. This should
include a brief description of what the enablement does, what values the flag
can take, the default, and that it conforms to the ``ENABLE_FEAT`` mechanism.
Adding feature enablement that does not conform to this mechanism is only done
in exceptional cases. You should also update the list of features at the top
of this file.
- Enable the feature for the FVP platform in ``plat/arm/board/fvp/platform.mk``,
setting it to ``2`` (``FEAT_STATE_CHECKED``).
- If the feature is optional, enable it in CI in the "allconfig" fragments.
Those are currently ``run_config/fvp-aemv8a.all.bmcov``,
``run_config/fvp-spm.all.bmcov``, ``run_config/fvp-spm.all``, and
``run_config/fvp-aemv8a.all``. Mandatory features are expected to be covered
by the architecture revision passed to the model.
- Optionally, although recommended, is to add a test in TFTF. This should only
be done if there are observable effects from lower ELs like register traps. It
is not necessary to add a test for functionality that does not have EL3
involvement (eg. whether a new instruction that cannot trap works).
.. _Feature_description: https://developer.arm.com/documentation/109697/latest/
|