Jayanth Dodderi Chidanand | 346777f | 2023-10-30 17:34:48 +0000 | [diff] [blame] | 1 | Context Management Library |
| 2 | ************************** |
| 3 | |
| 4 | This document provides an overview of the Context Management library implementation |
| 5 | in Trusted Firmware-A (TF-A). It enumerates and describes the APIs implemented |
| 6 | and their accessibility from other components at EL3. |
| 7 | |
| 8 | Overview |
| 9 | ======== |
| 10 | |
| 11 | Arm TrustZone architecture facilitates hardware-enforced isolation between |
| 12 | software running in various security states (Secure/Non-Secure/Realm). |
| 13 | The general-purpose registers, most of the system registers and vector registers |
| 14 | are not banked per world. When moving between the security states it is the |
| 15 | responsibility of the secure monitor software (BL31(AArch64) / BL32(Aarch32)) |
| 16 | in TF-A, not the hardware, to save and restore register state. |
| 17 | Refer to `Trustzone for AArch64`_ for more details. |
| 18 | |
| 19 | EL3 Runtime Firmware, also termed as secure monitor firmware, is integrated |
| 20 | with a context management library to handle the context of the CPU, managing the |
| 21 | saving and restoring of register states across the worlds. |
| 22 | |
| 23 | TF-A Context |
| 24 | ============ |
| 25 | |
| 26 | In TF-A, the context is represented as a data structure used by the EL3 firmware |
| 27 | to preserve the state of the CPU at the next lower exception level (EL) in a given |
| 28 | security state and save enough EL3 metadata to be able to return to that exception |
| 29 | level and security state. The memory for the context data structures are allocated |
| 30 | in BSS section of EL3 firmware. |
| 31 | |
| 32 | In a trusted system at any instance, a given CPU could be executing in one of the |
| 33 | security states (Non-Secure, Secure, Realm). Each world must have its |
| 34 | configuration of system registers independent of other security states to access |
| 35 | and execute any of the architectural features. |
| 36 | |
| 37 | If the CPU switches across security states (for example: from Non-secure to Secure |
| 38 | or 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 |
| 40 | running in either state has the privileges to access them. Additionally, some of |
| 41 | the architectural features enabled in the former security state will be unconditionally |
| 42 | accessible in the latter security state as well. This can be a major concern when |
| 43 | dealing with security-specific bits, as they need to be explicitly enabled or |
| 44 | disabled in each state to prevent data leakage across the worlds. |
| 45 | |
| 46 | In general, an ideal trusted system should have Secure world-specific configurations |
| 47 | that are not influenced by Normal World operations. Therefore, for each CPU, we |
| 48 | need to maintain world-specific context to ensure that register entries from one |
| 49 | world do not leak or impact the execution of the CPU in other worlds. |
| 50 | This will help ensure the integrity and security of the system, preventing any |
| 51 | unauthorized access or data corruption between the different security states. |
| 52 | |
| 53 | Design |
| 54 | ====== |
| 55 | |
| 56 | The Context Management library in TF-A is designed to cover all the requirements |
| 57 | for maintaining world-specific context essential for a trusted system. |
| 58 | This includes implementing CPU context initialization and management routines, |
| 59 | as well as other helper APIs that are required by dispatcher components in EL3 |
| 60 | firmware, which are collectively referred to as CPU Context Management. |
| 61 | The APIs and their usecases are listed in detail under the :ref:`Library APIs` |
| 62 | section. |
| 63 | |
| 64 | Originally, the Context Management library in TF-A was designed to cater for a |
| 65 | two-world system, comprising of Non-Secure and Secure Worlds. In this case, the |
| 66 | EL3 Firmware is assumed to be running in Secure World. |
| 67 | With introduction of Realm Management Extension (RME), from Armv9.2 a system |
| 68 | can have four distinct worlds (Non-Secure, Secure, Realm, Root). |
| 69 | RME isolates EL3 from all other Security states and moves it into its own security |
| 70 | state called root. EL3 firmware now runs at Root World and thereby is |
| 71 | trusted from software in Non-secure, Secure, and Realm states. |
| 72 | Refer to `Security States with RME`_ for more details. |
| 73 | |
| 74 | Key principles followed in designing the context management library : |
| 75 | |
| 76 | 1. **EL3 should only initialize immediate used lower EL** |
| 77 | |
| 78 | Context Management library running at EL3 should only initialize and monitor the |
| 79 | immediate used lower EL. This implies that, when S-EL2 is present in the system, |
| 80 | EL3 should initialise and monitor S-EL2 registers only. S-EL1 registers should |
| 81 | not be the concern of EL3 while S-EL2 is in place. In systems where S-EL2 is |
| 82 | absent, S-EL1 registers should be initialised from EL3. |
| 83 | |
| 84 | 2. **Decentralized model for context management** |
| 85 | |
| 86 | Each world (Non-Secure, Secure, and Realm) should have their separate component |
| 87 | in EL3 responsible for their respective world context management. |
| 88 | Both the Secure and Realm world have associated dispatcher components in EL3 |
| 89 | firmware to allow management of the respective worlds. For the Non-Secure world, |
| 90 | PSCI Library (BL31)/context management library provides routines to help |
| 91 | initialize the Non-Secure world context. |
| 92 | |
| 93 | 3. **Flexibility for Dispatchers to select desired feature set to save and restore** |
| 94 | |
| 95 | Each feature is supported with a helper function ``is_feature_supported(void)``, |
| 96 | to detect its presence at runtime. This helps dispatchers to select the desired |
| 97 | feature set, and thereby save and restore the configuration associated with them. |
| 98 | |
| 99 | 4. **Dynamic discovery of Feature enablement by EL3** |
| 100 | |
Manish Pandey | 771d40d | 2024-07-18 15:18:20 +0100 | [diff] [blame] | 101 | TF-A supports four states for feature enablement at EL3, to make them available |
Jayanth Dodderi Chidanand | 346777f | 2023-10-30 17:34:48 +0000 | [diff] [blame] | 102 | for lower exception levels. |
| 103 | |
| 104 | .. code:: c |
| 105 | |
Manish Pandey | 771d40d | 2024-07-18 15:18:20 +0100 | [diff] [blame] | 106 | #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 Chidanand | 346777f | 2023-10-30 17:34:48 +0000 | [diff] [blame] | 110 | |
| 111 | A pattern is established for feature enablement behavior. |
| 112 | Each 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 Pandey | 771d40d | 2024-07-18 15:18:20 +0100 | [diff] [blame] | 123 | - **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 Chidanand | 346777f | 2023-10-30 17:34:48 +0000 | [diff] [blame] | 143 | ``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 | |
| 147 | Code Structure |
| 148 | ============== |
| 149 | |
| 150 | `lib/el3_runtime/(aarch32/aarch64)`_ - Context library code directory. |
| 151 | |
| 152 | Source 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 | |
| 169 | Header 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 | |
| 184 | Apart from these files, we have some context related source files under ``BL1`` |
| 185 | and ``BL31`` directory. ``bl1_context_mgmt.c`` ``bl31_context_mgmt.c`` |
| 186 | |
| 187 | Bootloader 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 | |
| 202 | CPU Data Structure |
| 203 | ================== |
| 204 | For a given system, depending on the CPU count, the platform statically |
| 205 | allocates 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 | |
| 212 | This CPU data structure has a member element with an array of pointers to hold |
| 213 | the 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 | |
| 229 | At runtime, ``cpu_context[CPU_DATA_CONTEXT_NUM]`` array will be intitialised with |
| 230 | the Secure, Non-Secure and Realm context structure addresses to ensure proper |
| 231 | handling of the register state. |
| 232 | See :ref:`Library APIs` section for more details. |
| 233 | |
| 234 | CPU Context and Memory allocation |
| 235 | ================================= |
| 236 | |
| 237 | CPU Context |
| 238 | ~~~~~~~~~~~ |
| 239 | The members of the context structure used by the EL3 firmware to preserve the |
| 240 | state 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; |
| 247 | el1_sysregs_t el1_sysregs_ctx; |
| 248 | |
| 249 | #if CTX_INCLUDE_EL2_REGS |
| 250 | el2_sysregs_t el2_sysregs_ctx; |
| 251 | #endif |
| 252 | |
| 253 | #if CTX_INCLUDE_FPREGS |
| 254 | fp_regs_t fpregs_ctx; |
| 255 | #endif |
| 256 | |
| 257 | cve_2018_3639_t cve_2018_3639_ctx; |
| 258 | #if CTX_INCLUDE_PAUTH_REGS |
| 259 | pauth_t pauth_ctx; |
| 260 | #endif |
| 261 | |
| 262 | #if CTX_INCLUDE_MPAM_REGS |
| 263 | mpam_t mpam_ctx; |
| 264 | #endif |
| 265 | |
| 266 | } cpu_context_t; |
| 267 | |
| 268 | Context Memory Allocation |
| 269 | ~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 270 | |
| 271 | CPUs maintain their context per world. The individual context memory allocation |
| 272 | for each CPU per world is allocated by the world-specific dispatcher components |
| 273 | at compile time as shown below. |
| 274 | |
| 275 | |Context memory allocation| |
| 276 | |
| 277 | NS-Context Memory |
| 278 | ~~~~~~~~~~~~~~~~~ |
| 279 | It's important to note that the Normal world doesn't possess the dispatcher |
| 280 | component found in the Secure and Realm worlds. Instead, the PSCI library at EL3 |
| 281 | handles memory allocation for ``Non-Secure`` world context for all CPUs. |
| 282 | |
| 283 | .. code:: c |
| 284 | |
| 285 | static cpu_context_t psci_ns_context[PLATFORM_CORE_COUNT]; |
| 286 | |
| 287 | Secure-Context Memory |
| 288 | ~~~~~~~~~~~~~~~~~~~~~ |
| 289 | Secure World dispatcher (such as SPMD) at EL3 allocates the memory for ``Secure`` |
| 290 | world context of all CPUs. |
| 291 | |
| 292 | .. code:: c |
| 293 | |
| 294 | static spmd_spm_core_context_t spm_core_context[PLATFORM_CORE_COUNT]; |
| 295 | |
| 296 | Realm-Context Memory |
| 297 | ~~~~~~~~~~~~~~~~~~~~ |
| 298 | Realm World dispatcher (RMMD) at EL3 allocates the memory for ``Realm`` world |
| 299 | context of all CPUs. |
| 300 | |
| 301 | .. code:: c |
| 302 | |
| 303 | rmmd_rmm_context_t rmm_context[PLATFORM_CORE_COUNT]; |
| 304 | |
| 305 | To summarize, the world-specific context structures are synchronized with |
| 306 | per-CPU data structures, which means that each CPU will have an array of pointers |
| 307 | to individual worlds. The figure below illustrates the same. |
| 308 | |
| 309 | |CPU Context Memory Configuration| |
| 310 | |
| 311 | Context Setup/Initialization |
| 312 | ============================ |
| 313 | |
| 314 | The CPU has been assigned context structures for every security state, which include |
| 315 | Non-Secure, Secure and Realm. It is crucial to initialize each of these structures |
| 316 | during the bootup of every CPU before they enter any security state for the |
| 317 | first time. This section explains the specifics of how the initialization of |
| 318 | every CPU context takes place during both cold and warm boot paths. |
| 319 | |
| 320 | Context Setup during Cold boot |
| 321 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 322 | The cold boot path is mainly executed by the primary CPU, other than essential |
| 323 | CPU initialization executed by all CPUs. After executing BL1 and BL2, the Primary |
| 324 | CPU jumps to the BL31 image for runtime services initialization. |
| 325 | During this process, the per_cpu_data structure gets initialized with statically |
| 326 | allocated world-specific context memory. |
| 327 | |
| 328 | Later in the cold boot sequence, the BL31 image at EL3 checks for the presence |
| 329 | of a Secure world image at S-EL2. If detected, it invokes the secure context |
| 330 | initialization sequence under SPMD. Additionally, based on RME enablement, |
| 331 | the Realm context gets initialized from the RMMD at EL3. Finally, before exiting |
| 332 | to the normal world, the Non-Secure context gets initialized via the context |
| 333 | management library. At this stage, all Primary CPU contexts are initialized |
| 334 | and the CPU exits EL3 to enter the Normal world. |
| 335 | |
| 336 | |Context Init ColdBoot| |
| 337 | |
| 338 | .. note:: |
| 339 | The figure above illustrates a scenario on FVP for one of the build |
| 340 | configurations with TFTF component at NS-EL2. |
| 341 | |
| 342 | Context Setup during Warmboot |
| 343 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 344 | |
| 345 | During a warm boot sequence, the primary CPU is responsible for powering on the |
| 346 | secondary CPUs. Refer to :ref:`CPU Reset` and :ref:`Firmware Design` sections for |
| 347 | more details on the warm boot. |
| 348 | |
| 349 | |Context Init WarmBoot| |
| 350 | |
| 351 | The primary CPU initializes the Non-Secure context for the secondary CPU while |
| 352 | restoring re-entry information for the Non-Secure world. |
| 353 | It initialises via ``cm_init_context_by_index(target_idx, ep )``. |
| 354 | |
| 355 | ``psci_warmboot_entrypoint()`` is the warm boot entrypoint procedure. |
| 356 | During the warm bootup process, secondary CPUs have their secure context |
| 357 | initialized through SPMD at EL3. Upon successful SP initialization, the SPD |
| 358 | power management operations become shared with the PSCI library. During this |
| 359 | process, the SPMD duly registers its handlers with the PSCI library. |
| 360 | |
| 361 | .. code:: c |
| 362 | |
| 363 | file: psci_common.c |
| 364 | const spd_pm_ops_t *psci_spd_pm; |
| 365 | |
| 366 | file: spmd_pm.c |
| 367 | const spd_pm_ops_t spmd_pm = { |
| 368 | .svc_on_finish = spmd_cpu_on_finish_handler, |
| 369 | .svc_off = spmd_cpu_off_handler |
| 370 | } |
| 371 | |
| 372 | Secondary CPUs during their bootup in the ``psci_cpu_on_finish()`` routine get |
| 373 | their secure context initialised via the registered SPMD handler |
| 374 | ``spmd_cpu_on_finish_handler()`` at EL3. |
| 375 | The figure above illustrates the same with reference of Primary CPU running at |
| 376 | NS-EL2. |
| 377 | |
| 378 | .. _Library APIs: |
| 379 | |
| 380 | Library APIs |
| 381 | ============ |
| 382 | |
| 383 | The public APIs and types can be found in ``include/lib/el3_runtime/context_management.h`` |
| 384 | and this section is intended to provide additional details and clarifications. |
| 385 | |
| 386 | Context Initialization for Individual Worlds |
| 387 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 388 | The library implements high level APIs for the CPUs in setting up their individual |
| 389 | context for each world (Non-Secure, Secure and Realm). |
| 390 | |
| 391 | .. c:function:: static void setup_context_common(cpu_context_t *ctx, const entry_point_info_t *ep); |
| 392 | |
| 393 | This function is responsible for the general context initialization that applies |
| 394 | to all worlds. It will be invoked first, before calling the individual |
| 395 | world-specific context setup APIs. |
| 396 | |
| 397 | .. c:function:: static void setup_ns_context(cpu_context_t *ctx, const struct entry_point_info *ep); |
| 398 | .. c:function:: static void setup_realm_context(cpu_context_t *ctx, const struct entry_point_info *ep); |
| 399 | .. c:function:: static void setup_secure_context(cpu_context_t *ctx, const struct entry_point_info *ep); |
| 400 | |
| 401 | Depending on the security state that the CPU needs to enter, the respective |
| 402 | world-specific context setup handlers listed above will be invoked once per-CPU |
| 403 | to set up the context for their execution. |
| 404 | |
| 405 | .. c:function:: void cm_manage_extensions_el3(void) |
| 406 | |
| 407 | This function initializes all EL3 registers whose values do not change during the |
| 408 | lifetime of EL3 runtime firmware. It is invoked from each CPU via the cold boot |
| 409 | path ``bl31_main()`` and in the WarmBoot entry path ``void psci_warmboot_entrypoint()``. |
| 410 | |
| 411 | Runtime Save and Restore of Registers |
| 412 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 413 | |
| 414 | EL1 Registers |
| 415 | ------------- |
| 416 | |
| 417 | .. c:function:: void cm_el1_sysregs_context_save(uint32_t security_state); |
| 418 | .. c:function:: void cm_el1_sysregs_context_restore(uint32_t security_state); |
| 419 | |
| 420 | These functions are utilized by the world-specific dispatcher components running |
| 421 | at EL3 to facilitate the saving and restoration of the EL1 system registers |
| 422 | during a world switch. |
| 423 | |
| 424 | EL2 Registers |
| 425 | ------------- |
| 426 | |
| 427 | .. c:function:: void cm_el2_sysregs_context_save(uint32_t security_state); |
| 428 | .. c:function:: void cm_el2_sysregs_context_restore(uint32_t security_state); |
| 429 | |
| 430 | These functions are utilized by the world-specific dispatcher components running |
| 431 | at EL3 to facilitate the saving and restoration of the EL2 system registers |
| 432 | during a world switch. |
| 433 | |
| 434 | Pauth Registers |
| 435 | --------------- |
| 436 | |
| 437 | Pointer Authentication feature is enabled by default for Non-Secure world and |
| 438 | disabled for Secure and Realm worlds. In this case, we don't need to explicitly |
| 439 | save and restore the Pauth registers during world switch. |
| 440 | However, ``CTX_INCLUDE_PAUTH_REGS`` flag is explicitly used to enable Pauth for |
| 441 | lower exception levels of Secure and Realm worlds. In this scenario, we save the |
| 442 | general purpose and Pauth registers while we enter EL3 from lower ELs via |
| 443 | ``prepare_el3_entry`` and restore them back while we exit EL3 to lower ELs |
| 444 | via ``el3_exit``. |
| 445 | |
| 446 | .. code:: c |
| 447 | |
| 448 | .macro save_gp_pmcr_pauth_regs |
| 449 | func restore_gp_pmcr_pauth_regs |
| 450 | |
| 451 | Feature Enablement for Individual Worlds |
| 452 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 453 | |
| 454 | .. c:function:: static void manage_extensions_nonsecure(cpu_context_t *ctx); |
| 455 | .. c:function:: static void manage_extensions_secure(cpu_context_t *ctx); |
| 456 | .. c:function:: static void manage_extensions_realm(cpu_context_t *ctx) |
| 457 | |
| 458 | Functions that allow the enabling and disabling of architectural features for |
| 459 | each security state. These functions are invoked from the top-level setup APIs |
| 460 | during context initialization. |
| 461 | |
| 462 | Further, a pattern is established for feature enablement code (AArch64). |
| 463 | Each feature implements following APIs as applicable: |
| 464 | Note: (``xxx`` is the name of the feature in the APIs) |
| 465 | |
| 466 | - ``is_feat_xxx_supported()`` and ``is_feat_xxx_present()`` - mandatory for all features. |
| 467 | |
| 468 | - ``xxx_enable(cpu_context * )`` and ``xxx_disable(cpu_context * )`` - optional |
| 469 | functions to enable the feature for the passed context only. To be called in |
| 470 | the respective world's setup_context to select behaviour. |
| 471 | |
| 472 | - ``xxx_init_el3()`` - optional function to enable the feature in-place in any EL3 |
| 473 | registers that are never context switched. The values they write must never |
| 474 | change, otherwise the functions mentioned in previous point should be used. |
| 475 | Invoked from ``cm_manage_extensions_el3()``. |
| 476 | |
| 477 | - ``xxx_init_el2_unused()`` - optional function to enable the feature in-place |
| 478 | in any EL2 registers that are necessary for execution in EL1 with no EL2 present. |
| 479 | |
| 480 | The above mentioned rules, followed for ``FEAT_SME`` is shown below: |
| 481 | |
| 482 | .. code:: c |
| 483 | |
| 484 | void sme_enable(cpu_context_t *context); |
| 485 | void sme_init_el3(void); |
| 486 | void sme_init_el2_unused(void); |
| 487 | void sme_disable(cpu_context_t *context); |
| 488 | |
| 489 | Per-world Context |
| 490 | ================= |
| 491 | |
| 492 | Apart from the CPU context structure, we have another structure to manage some |
| 493 | of the EL3 system registers whose values are identical across all the CPUs |
| 494 | referred to as ``per_world_context_t``. |
| 495 | The Per-world context structure is intended for managing EL3 system registers with |
| 496 | identical values across all CPUs, requiring only a singular context entry for each |
| 497 | individual world. This structure operates independently of the CPU context |
| 498 | structure and is intended to manage specific EL3 registers. |
| 499 | |
| 500 | .. code-block:: c |
| 501 | |
| 502 | typedef struct per_world_context { |
| 503 | uint64_t ctx_cptr_el3; |
| 504 | uint64_t ctx_zcr_el3; |
| 505 | uint64_t ctx_mpam3_el3; |
| 506 | } per_world_context_t; |
| 507 | |
| 508 | These functions facilitate the activation of architectural extensions that possess |
| 509 | identical values across all cores for the individual Non-secure, Secure, and |
| 510 | Realm worlds. |
| 511 | |
| 512 | *Copyright (c) 2024, Arm Limited and Contributors. All rights reserved.* |
| 513 | |
| 514 | .. |Context Memory Allocation| image:: ../resources/diagrams/context_memory_allocation.png |
| 515 | .. |CPU Context Memory Configuration| image:: ../resources/diagrams/cpu_data_config_context_memory.png |
| 516 | .. |CPU Data Structure| image:: ../resources/diagrams/percpu-data-struct.png |
| 517 | .. |Context Init ColdBoot| image:: ../resources/diagrams/context_init_coldboot.png |
| 518 | .. |Context Init WarmBoot| image:: ../resources/diagrams/context_init_warmboot.png |
| 519 | .. _Trustzone for AArch64: https://developer.arm.com/documentation/102418/0101/TrustZone-in-the-processor/Switching-between-Security-states |
| 520 | .. _Security States with RME: https://developer.arm.com/documentation/den0126/0100/Security-states |
Manish Pandey | 771d40d | 2024-07-18 15:18:20 +0100 | [diff] [blame] | 521 | .. _lib/el3_runtime/(aarch32/aarch64): https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git/tree/lib/el3_runtime |