blob: 6a76ada317ebcef393e615809555931563b55779 [file] [log] [blame]
Jayanth Dodderi Chidanand346777f2023-10-30 17:34:48 +00001Context Management Library
2**************************
3
4This document provides an overview of the Context Management library implementation
5in Trusted Firmware-A (TF-A). It enumerates and describes the APIs implemented
6and their accessibility from other components at EL3.
7
8Overview
9========
10
11Arm TrustZone architecture facilitates hardware-enforced isolation between
12software running in various security states (Secure/Non-Secure/Realm).
13The general-purpose registers, most of the system registers and vector registers
14are not banked per world. When moving between the security states it is the
15responsibility of the secure monitor software (BL31(AArch64) / BL32(Aarch32))
16in TF-A, not the hardware, to save and restore register state.
17Refer to `Trustzone for AArch64`_ for more details.
18
19EL3 Runtime Firmware, also termed as secure monitor firmware, is integrated
20with a context management library to handle the context of the CPU, managing the
21saving and restoring of register states across the worlds.
22
23TF-A Context
24============
25
26In TF-A, the context is represented as a data structure used by the EL3 firmware
27to preserve the state of the CPU at the next lower exception level (EL) in a given
28security state and save enough EL3 metadata to be able to return to that exception
29level and security state. The memory for the context data structures are allocated
30in BSS section of EL3 firmware.
31
32In a trusted system at any instance, a given CPU could be executing in one of the
33security states (Non-Secure, Secure, Realm). Each world must have its
34configuration of system registers independent of other security states to access
35and execute any of the architectural features.
36
37If the CPU switches across security states (for example: from Non-secure to Secure
38or vice versa), the register contents, especially the ones that are not banked
39(EL2/EL1, vector, general-purpose registers), will be overwritten, as the software
40running in either state has the privileges to access them. Additionally, some of
41the architectural features enabled in the former security state will be unconditionally
42accessible in the latter security state as well. This can be a major concern when
43dealing with security-specific bits, as they need to be explicitly enabled or
44disabled in each state to prevent data leakage across the worlds.
45
46In general, an ideal trusted system should have Secure world-specific configurations
47that are not influenced by Normal World operations. Therefore, for each CPU, we
48need to maintain world-specific context to ensure that register entries from one
49world do not leak or impact the execution of the CPU in other worlds.
50This will help ensure the integrity and security of the system, preventing any
51unauthorized access or data corruption between the different security states.
52
53Design
54======
55
56The Context Management library in TF-A is designed to cover all the requirements
57for maintaining world-specific context essential for a trusted system.
58This includes implementing CPU context initialization and management routines,
59as well as other helper APIs that are required by dispatcher components in EL3
60firmware, which are collectively referred to as CPU Context Management.
61The APIs and their usecases are listed in detail under the :ref:`Library APIs`
62section.
63
64Originally, the Context Management library in TF-A was designed to cater for a
65two-world system, comprising of Non-Secure and Secure Worlds. In this case, the
66EL3 Firmware is assumed to be running in Secure World.
67With introduction of Realm Management Extension (RME), from Armv9.2 a system
68can have four distinct worlds (Non-Secure, Secure, Realm, Root).
69RME isolates EL3 from all other Security states and moves it into its own security
70state called root. EL3 firmware now runs at Root World and thereby is
71trusted from software in Non-secure, Secure, and Realm states.
72Refer to `Security States with RME`_ for more details.
73
74Key principles followed in designing the context management library :
75
761. **EL3 should only initialize immediate used lower EL**
77
78Context Management library running at EL3 should only initialize and monitor the
79immediate used lower EL. This implies that, when S-EL2 is present in the system,
80EL3 should initialise and monitor S-EL2 registers only. S-EL1 registers should
81not be the concern of EL3 while S-EL2 is in place. In systems where S-EL2 is
82absent, S-EL1 registers should be initialised from EL3.
83
842. **Decentralized model for context management**
85
86Each world (Non-Secure, Secure, and Realm) should have their separate component
87in EL3 responsible for their respective world context management.
88Both the Secure and Realm world have associated dispatcher components in EL3
89firmware to allow management of the respective worlds. For the Non-Secure world,
90PSCI Library (BL31)/context management library provides routines to help
91initialize the Non-Secure world context.
92
933. **Flexibility for Dispatchers to select desired feature set to save and restore**
94
95Each feature is supported with a helper function ``is_feature_supported(void)``,
96to detect its presence at runtime. This helps dispatchers to select the desired
97feature set, and thereby save and restore the configuration associated with them.
98
994. **Dynamic discovery of Feature enablement by EL3**
100
Manish Pandey771d40d2024-07-18 15:18:20 +0100101TF-A supports four states for feature enablement at EL3, to make them available
Jayanth Dodderi Chidanand346777f2023-10-30 17:34:48 +0000102for lower exception levels.
103
104.. code:: c
105
Manish Pandey771d40d2024-07-18 15:18:20 +0100106 #define FEAT_STATE_DISABLED 0
107 #define FEAT_STATE_ENABLED 1
108 #define FEAT_STATE_CHECK 2
109 #define FEAT_STATE_CHECK_ASYMMETRIC 3
Jayanth Dodderi Chidanand346777f2023-10-30 17:34:48 +0000110
111A pattern is established for feature enablement behavior.
112Each feature must support the 3 possible values with rigid semantics.
113
114- **FEAT_STATE_DISABLED** - all code relating to this feature is always skipped.
115 Firmware is unaware of this feature.
116
117- **FEAT_STATE_ALWAYS** - all code relating to this feature is always executed.
118 Firmware expects this feature to be present in hardware.
119
120- **FEAT_STATE_CHECK** - same as ``FEAT_STATE_ALWAYS`` except that the feature's
121 existence will be checked at runtime. Default on dynamic platforms (example: FVP).
122
Manish Pandey771d40d2024-07-18 15:18:20 +0100123- **FEAT_STATE_CHECK_ASYMMETRIC** - same as ``FEAT_STATE_CHECK`` except that the feature's
124 existence is asymmetric across cores, which requires the feature existence is checked
125 during warmboot path also. Note that only limited number of features can be asymmetric.
126
127 .. note::
128 Only limited number of features can be ``FEAT_STATE_CHECK_ASYMMETRIC`` this is due to
129 the fact that Operating systems are designed for SMP systems.
130 There are no clear guidelines what kind of mismatch is allowed but following pointers
131 can help making a decision
132
133 - All mandatory features must be symmetric.
134 - Any feature that impacts the generation of page tables must be symmetric.
135 - Any feature access which does not trap to EL3 should be symmetric.
136 - Features related with profiling, debug and trace could be asymmetric
137 - Migration of vCPU/tasks between CPUs should not cause an error
138
139 Whenever there is asymmetric feature support is added for a feature TF-A need to add
140 feature specific code in context management code.
141
142 .. note::
Jayanth Dodderi Chidanand346777f2023-10-30 17:34:48 +0000143 ``FEAT_RAS`` is an exception here, as it impacts the execution of EL3 and
144 it is essential to know its presence at compile time. Refer to ``ENABLE_FEAT``
145 macro under :ref:`Build Options` section for more details.
146
147Code Structure
148==============
149
150`lib/el3_runtime/(aarch32/aarch64)`_ - Context library code directory.
151
152Source Files
153~~~~~~~~~~~~
154
155#. ``context_mgmt.c`` : consists of core functions that setup, save and restore
156 context for different security states alongside high level feature enablement
157 APIs for individual worlds.
158
159#. ``cpu_data_array.c`` : contains per_cpu_data structure instantiation.
160
161#. ``context.S`` : consists of functions that save and restore some of the context
162 structure members in assembly code.
163
164#. ``cpu_data.S`` : consists of helper functions to initialise per_cpu_data pointers.
165
166#. ``el3_common_macros.S`` : consists of macros to facilitate actions to be performed
167 during cold and warmboot and el3 registers initialisation in assembly code.
168
169Header Files
170~~~~~~~~~~~~
171
172#. ``context_mgmt.h`` : contains the public interface to Context Management Library.
173
174#. ``context.h`` : contains the helper macros and definitions for context entries.
175
176#. ``cpu_data.h`` : contains the public interface to Per CPU data structure.
177
178#. ``context_debug.h`` : contains public interface to report context memory
179 utilisation across the security states.
180
181#. ``context_el2.h`` : internal header consisting of helper macros to access EL2
182 context entries. Used by ``context.h``.
183
184Apart from these files, we have some context related source files under ``BL1``
185and ``BL31`` directory. ``bl1_context_mgmt.c`` ``bl31_context_mgmt.c``
186
187Bootloader Images utilizing Context Management Library
188======================================================
189
190+-------------------------------------------+-----------------------------+
191| Bootloader | Context Management Library |
192+-------------------------------------------+-----------------------------+
193| BL1 | Yes |
194+-------------------------------------------+-----------------------------+
195| BL2 | No |
196+-------------------------------------------+-----------------------------+
197| BL31 (Aarch64- EL3runtime firmware) | Yes |
198+-------------------------------------------+-----------------------------+
199| BL32 (Aarch32- EL3runtime firmware) | Yes |
200+-------------------------------------------+-----------------------------+
201
202CPU Data Structure
203==================
204For a given system, depending on the CPU count, the platform statically
205allocates memory for the CPU data structure.
206
207.. code:: c
208
209 /* The per_cpu_ptr_cache_t space allocation */
210 cpu_data_t percpu_data[PLATFORM_CORE_COUNT];
211
212This CPU data structure has a member element with an array of pointers to hold
213the Non-Secure, Realm and Secure security state context structures as listed below.
214
215.. code:: c
216
217 typedef struct cpu_data {
218 #ifdef __aarch64__
219 void *cpu_context[CPU_DATA_CONTEXT_NUM];
220 #endif
221
222 ....
223 ....
224
225 }cpu_data_t;
226
227|CPU Data Structure|
228
229At runtime, ``cpu_context[CPU_DATA_CONTEXT_NUM]`` array will be intitialised with
230the Secure, Non-Secure and Realm context structure addresses to ensure proper
231handling of the register state.
232See :ref:`Library APIs` section for more details.
233
234CPU Context and Memory allocation
235=================================
236
237CPU Context
238~~~~~~~~~~~
239The members of the context structure used by the EL3 firmware to preserve the
240state of CPU across exception levels for a given security state are listed below.
241
242.. code:: c
243
244 typedef struct cpu_context {
245 gp_regs_t gpregs_ctx;
246 el3_state_t el3state_ctx;
Jayanth Dodderi Chidanand346777f2023-10-30 17:34:48 +0000247
Jayanth Dodderi Chidanande81e30d2024-11-10 10:24:45 +0000248 cve_2018_3639_t cve_2018_3639_ctx;
Jayanth Dodderi Chidanand346777f2023-10-30 17:34:48 +0000249
Jayanth Dodderi Chidanande81e30d2024-11-10 10:24:45 +0000250 #if ERRATA_SPECULATIVE_AT
251 errata_speculative_at_t errata_speculative_at_ctx;
Jayanth Dodderi Chidanand346777f2023-10-30 17:34:48 +0000252 #endif
253
Jayanth Dodderi Chidanand346777f2023-10-30 17:34:48 +0000254 #if CTX_INCLUDE_PAUTH_REGS
255 pauth_t pauth_ctx;
256 #endif
257
Jayanth Dodderi Chidanande81e30d2024-11-10 10:24:45 +0000258 #if (CTX_INCLUDE_EL2_REGS && IMAGE_BL31)
259 el2_sysregs_t el2_sysregs_ctx;
260 #else
261 el1_sysregs_t el1_sysregs_ctx;
Jayanth Dodderi Chidanand346777f2023-10-30 17:34:48 +0000262 #endif
Jayanth Dodderi Chidanand346777f2023-10-30 17:34:48 +0000263 } cpu_context_t;
264
265Context Memory Allocation
266~~~~~~~~~~~~~~~~~~~~~~~~~
267
268CPUs maintain their context per world. The individual context memory allocation
269for each CPU per world is allocated by the world-specific dispatcher components
270at compile time as shown below.
271
272|Context memory allocation|
273
274NS-Context Memory
275~~~~~~~~~~~~~~~~~
276It's important to note that the Normal world doesn't possess the dispatcher
277component found in the Secure and Realm worlds. Instead, the PSCI library at EL3
278handles memory allocation for ``Non-Secure`` world context for all CPUs.
279
280.. code:: c
281
282 static cpu_context_t psci_ns_context[PLATFORM_CORE_COUNT];
283
284Secure-Context Memory
285~~~~~~~~~~~~~~~~~~~~~
286Secure World dispatcher (such as SPMD) at EL3 allocates the memory for ``Secure``
287world context of all CPUs.
288
289.. code:: c
290
291 static spmd_spm_core_context_t spm_core_context[PLATFORM_CORE_COUNT];
292
293Realm-Context Memory
294~~~~~~~~~~~~~~~~~~~~
295Realm World dispatcher (RMMD) at EL3 allocates the memory for ``Realm`` world
296context of all CPUs.
297
298.. code:: c
299
300 rmmd_rmm_context_t rmm_context[PLATFORM_CORE_COUNT];
301
302To summarize, the world-specific context structures are synchronized with
303per-CPU data structures, which means that each CPU will have an array of pointers
304to individual worlds. The figure below illustrates the same.
305
306|CPU Context Memory Configuration|
307
308Context Setup/Initialization
309============================
310
311The CPU has been assigned context structures for every security state, which include
312Non-Secure, Secure and Realm. It is crucial to initialize each of these structures
313during the bootup of every CPU before they enter any security state for the
314first time. This section explains the specifics of how the initialization of
315every CPU context takes place during both cold and warm boot paths.
316
317Context Setup during Cold boot
318~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
319The cold boot path is mainly executed by the primary CPU, other than essential
320CPU initialization executed by all CPUs. After executing BL1 and BL2, the Primary
321CPU jumps to the BL31 image for runtime services initialization.
322During this process, the per_cpu_data structure gets initialized with statically
323allocated world-specific context memory.
324
325Later in the cold boot sequence, the BL31 image at EL3 checks for the presence
326of a Secure world image at S-EL2. If detected, it invokes the secure context
327initialization sequence under SPMD. Additionally, based on RME enablement,
328the Realm context gets initialized from the RMMD at EL3. Finally, before exiting
329to the normal world, the Non-Secure context gets initialized via the context
330management library. At this stage, all Primary CPU contexts are initialized
331and the CPU exits EL3 to enter the Normal world.
332
333|Context Init ColdBoot|
334
335.. note::
336 The figure above illustrates a scenario on FVP for one of the build
337 configurations with TFTF component at NS-EL2.
338
339Context Setup during Warmboot
340~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
341
342During a warm boot sequence, the primary CPU is responsible for powering on the
343secondary CPUs. Refer to :ref:`CPU Reset` and :ref:`Firmware Design` sections for
344more details on the warm boot.
345
346|Context Init WarmBoot|
347
348The primary CPU initializes the Non-Secure context for the secondary CPU while
349restoring re-entry information for the Non-Secure world.
350It initialises via ``cm_init_context_by_index(target_idx, ep )``.
351
352``psci_warmboot_entrypoint()`` is the warm boot entrypoint procedure.
353During the warm bootup process, secondary CPUs have their secure context
354initialized through SPMD at EL3. Upon successful SP initialization, the SPD
355power management operations become shared with the PSCI library. During this
356process, the SPMD duly registers its handlers with the PSCI library.
357
358.. code:: c
359
360 file: psci_common.c
361 const spd_pm_ops_t *psci_spd_pm;
362
363 file: spmd_pm.c
364 const spd_pm_ops_t spmd_pm = {
365 .svc_on_finish = spmd_cpu_on_finish_handler,
366 .svc_off = spmd_cpu_off_handler
367 }
368
369Secondary CPUs during their bootup in the ``psci_cpu_on_finish()`` routine get
370their secure context initialised via the registered SPMD handler
371``spmd_cpu_on_finish_handler()`` at EL3.
372The figure above illustrates the same with reference of Primary CPU running at
373NS-EL2.
374
375.. _Library APIs:
376
377Library APIs
378============
379
380The public APIs and types can be found in ``include/lib/el3_runtime/context_management.h``
381and this section is intended to provide additional details and clarifications.
382
383Context Initialization for Individual Worlds
384~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
385The library implements high level APIs for the CPUs in setting up their individual
386context for each world (Non-Secure, Secure and Realm).
387
388.. c:function:: static void setup_context_common(cpu_context_t *ctx, const entry_point_info_t *ep);
389
390This function is responsible for the general context initialization that applies
391to all worlds. It will be invoked first, before calling the individual
392world-specific context setup APIs.
393
394.. c:function:: static void setup_ns_context(cpu_context_t *ctx, const struct entry_point_info *ep);
395.. c:function:: static void setup_realm_context(cpu_context_t *ctx, const struct entry_point_info *ep);
396.. c:function:: static void setup_secure_context(cpu_context_t *ctx, const struct entry_point_info *ep);
397
398Depending on the security state that the CPU needs to enter, the respective
399world-specific context setup handlers listed above will be invoked once per-CPU
400to set up the context for their execution.
401
402.. c:function:: void cm_manage_extensions_el3(void)
403
404This function initializes all EL3 registers whose values do not change during the
405lifetime of EL3 runtime firmware. It is invoked from each CPU via the cold boot
406path ``bl31_main()`` and in the WarmBoot entry path ``void psci_warmboot_entrypoint()``.
407
408Runtime Save and Restore of Registers
409~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
410
411EL1 Registers
412-------------
413
414.. c:function:: void cm_el1_sysregs_context_save(uint32_t security_state);
415.. c:function:: void cm_el1_sysregs_context_restore(uint32_t security_state);
416
417These functions are utilized by the world-specific dispatcher components running
418at EL3 to facilitate the saving and restoration of the EL1 system registers
419during a world switch.
420
421EL2 Registers
422-------------
423
424.. c:function:: void cm_el2_sysregs_context_save(uint32_t security_state);
425.. c:function:: void cm_el2_sysregs_context_restore(uint32_t security_state);
426
427These functions are utilized by the world-specific dispatcher components running
428at EL3 to facilitate the saving and restoration of the EL2 system registers
429during a world switch.
430
431Pauth Registers
432---------------
433
434Pointer Authentication feature is enabled by default for Non-Secure world and
435disabled for Secure and Realm worlds. In this case, we don't need to explicitly
436save and restore the Pauth registers during world switch.
437However, ``CTX_INCLUDE_PAUTH_REGS`` flag is explicitly used to enable Pauth for
438lower exception levels of Secure and Realm worlds. In this scenario, we save the
439general purpose and Pauth registers while we enter EL3 from lower ELs via
440``prepare_el3_entry`` and restore them back while we exit EL3 to lower ELs
441via ``el3_exit``.
442
443.. code:: c
444
445 .macro save_gp_pmcr_pauth_regs
446 func restore_gp_pmcr_pauth_regs
447
448Feature Enablement for Individual Worlds
449~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
450
451.. c:function:: static void manage_extensions_nonsecure(cpu_context_t *ctx);
452.. c:function:: static void manage_extensions_secure(cpu_context_t *ctx);
453.. c:function:: static void manage_extensions_realm(cpu_context_t *ctx)
454
455Functions that allow the enabling and disabling of architectural features for
456each security state. These functions are invoked from the top-level setup APIs
457during context initialization.
458
459Further, a pattern is established for feature enablement code (AArch64).
460Each feature implements following APIs as applicable:
461Note: (``xxx`` is the name of the feature in the APIs)
462
463- ``is_feat_xxx_supported()`` and ``is_feat_xxx_present()`` - mandatory for all features.
464
465- ``xxx_enable(cpu_context * )`` and ``xxx_disable(cpu_context * )`` - optional
466 functions to enable the feature for the passed context only. To be called in
467 the respective world's setup_context to select behaviour.
468
469- ``xxx_init_el3()`` - optional function to enable the feature in-place in any EL3
470 registers that are never context switched. The values they write must never
471 change, otherwise the functions mentioned in previous point should be used.
472 Invoked from ``cm_manage_extensions_el3()``.
473
474- ``xxx_init_el2_unused()`` - optional function to enable the feature in-place
475 in any EL2 registers that are necessary for execution in EL1 with no EL2 present.
476
477The above mentioned rules, followed for ``FEAT_SME`` is shown below:
478
479.. code:: c
480
481 void sme_enable(cpu_context_t *context);
482 void sme_init_el3(void);
483 void sme_init_el2_unused(void);
484 void sme_disable(cpu_context_t *context);
485
486Per-world Context
487=================
488
489Apart from the CPU context structure, we have another structure to manage some
490of the EL3 system registers whose values are identical across all the CPUs
491referred to as ``per_world_context_t``.
492The Per-world context structure is intended for managing EL3 system registers with
493identical values across all CPUs, requiring only a singular context entry for each
494individual world. This structure operates independently of the CPU context
495structure and is intended to manage specific EL3 registers.
496
497.. code-block:: c
498
499 typedef struct per_world_context {
500 uint64_t ctx_cptr_el3;
501 uint64_t ctx_zcr_el3;
502 uint64_t ctx_mpam3_el3;
503 } per_world_context_t;
504
505These functions facilitate the activation of architectural extensions that possess
506identical values across all cores for the individual Non-secure, Secure, and
507Realm worlds.
508
Jayanth Dodderi Chidanande81e30d2024-11-10 10:24:45 +0000509Root-Context (EL3-Execution-Context)
510====================================
511
512EL3/Root Context is the execution environment while the CPU is running at EL3.
513
514Previously, while the CPU is in execution at EL3, the system registers persist
515with the values of the incoming world. This implies that if the CPU is entering
516EL3 from NS world, the EL1 and EL2 system registers which might be modified in
517lower exception levels NS(EL2/EL1) will carry forward those values to EL3.
518Further the EL3 registers also hold on to the values configured for Non-secure
519world, written during the previous ERET from EL3 to NS(EL2/EL1).
520Same policy is followed with respect to other worlds (Secure/Realm) depending on
521the system configuration.
522
523The firmware at EL3 has traditionally operated within the context of the incoming
524world (Secure/Non-Secure/Realm). This becomes problematic in scenarios where the
525EL3/Root world must explicitly use architectural features that depend on system
526registers configured for lower exception levels.
527A good example of this is the PAuth regs. The Root world would need to program
528its own PAuth Keys while executing in EL3 and this needs to be restored in entry
529to EL3 from any world.
530Therefore, Root world should maintain its own distinct settings to access
531features for its own execution at EL3.
532
533Register values which are currently known to be of importance during EL3 execution,
534is referred to as the EL3/Root context.
535This includes ( MDCR_EL3.SDD, SCR_EL3.{EA, SIF}, PMCR_EL0.DP, PSTATE.DIT)
536EL3 Context ensures, CPU executes under fixed EL3 system register settings
537which is not affected by settings of other worlds.
538
539Root Context needs to be setup as early as possible before we try and access/modify
540architectural features at EL3. Its a simple restore operation ``setup_el3_execution_context``
541that overwrites the selected bits listed above. EL3 never changes its mind about
542what those values should be, sets it as required for EL3. Henceforth, a Root
543context save operation is not required.
544
545The figure below illustrates the same with NS-world as a reference while entering
546EL3.
547
548|Root Context Sequence|
549
550.. code:: c
551
552 # EL3/Root_Context routine
553 .macro setup_el3_execution_context
554
555EL3 execution context needs to setup at both boot time (cold and warm boot)
556entrypaths and at all the possible exception handlers routing to EL3 at runtime.
557
Jayanth Dodderi Chidanand346777f2023-10-30 17:34:48 +0000558*Copyright (c) 2024, Arm Limited and Contributors. All rights reserved.*
559
560.. |Context Memory Allocation| image:: ../resources/diagrams/context_memory_allocation.png
561.. |CPU Context Memory Configuration| image:: ../resources/diagrams/cpu_data_config_context_memory.png
562.. |CPU Data Structure| image:: ../resources/diagrams/percpu-data-struct.png
563.. |Context Init ColdBoot| image:: ../resources/diagrams/context_init_coldboot.png
564.. |Context Init WarmBoot| image:: ../resources/diagrams/context_init_warmboot.png
Jayanth Dodderi Chidanande81e30d2024-11-10 10:24:45 +0000565.. |Root Context Sequence| image:: ../resources/diagrams/root_context_sequence.png
Jayanth Dodderi Chidanand346777f2023-10-30 17:34:48 +0000566.. _Trustzone for AArch64: https://developer.arm.com/documentation/102418/0101/TrustZone-in-the-processor/Switching-between-Security-states
567.. _Security States with RME: https://developer.arm.com/documentation/den0126/0100/Security-states
Manish Pandey771d40d2024-07-18 15:18:20 +0100568.. _lib/el3_runtime/(aarch32/aarch64): https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git/tree/lib/el3_runtime