1Translation Tables Library Design 2================================= 3 4 5 6 7.. contents:: 8 9 10This document describes the design of the translation tables library (version 2) 11used by Trusted Firmware-A (TF-A). This library provides APIs to create page 12tables based on a description of the memory layout, as well as setting up system 13registers related to the Memory Management Unit (MMU) and performing the 14required Translation Lookaside Buffer (TLB) maintenance operations. 15 16More specifically, some use cases that this library aims to support are: 17 18#. Statically allocate translation tables and populate them (at run-time) based 19 on a description of the memory layout. The memory layout is typically 20 provided by the platform port as a list of memory regions; 21 22#. Support for generating translation tables pertaining to a different 23 translation regime than the exception level the library code is executing at; 24 25#. Support for dynamic mapping and unmapping of regions, even while the MMU is 26 on. This can be used to temporarily map some memory regions and unmap them 27 later on when no longer needed; 28 29#. Support for non-identity virtual to physical mappings to compress the virtual 30 address space; 31 32#. Support for changing memory attributes of memory regions at run-time. 33 34 35About version 1 and version 2 36----------------------------- 37 38This document focuses on version 2 of the library, whose sources are available 39in the `lib/xlat_tables_v2`_ directory. Version 1 of the library can still be 40found in `lib/xlat_tables`_ directory but it is less flexible and doesn't 41support dynamic mapping. Although potential bug fixes will be applied to both 42versions, future features enhancements will focus on version 2 and might not be 43back-ported to version 1. Therefore, it is recommended to use version 2, 44especially for new platform ports. 45 46However, please note that version 2 is still in active development and is not 47considered stable yet. Hence, compatibility breaks might be introduced. 48 49From this point onwards, this document will implicitly refer to version 2 of the 50library. 51 52 53Design concepts and interfaces 54------------------------------ 55 56This section presents some of the key concepts and data structures used in the 57translation tables library. 58 59`mmap` regions 60~~~~~~~~~~~~~~ 61 62An ``mmap_region`` is an abstract, concise way to represent a memory region to 63map. It is one of the key interfaces to the library. It is identified by: 64 65- its physical base address; 66- its virtual base address; 67- its size; 68- its attributes; 69- its mapping granularity (optional). 70 71See the ``struct mmap_region`` type in `xlat_tables_v2.h`_. 72 73The user usually provides a list of such mmap regions to map and lets the 74library transpose that in a set of translation tables. As a result, the library 75might create new translation tables, update or split existing ones. 76 77The region attributes specify the type of memory (for example device or cached 78normal memory) as well as the memory access permissions (read-only or 79read-write, executable or not, secure or non-secure, and so on). In the case of 80the EL1&0 translation regime, the attributes also specify whether the region is 81a User region (EL0) or Privileged region (EL1). See the ``MT_xxx`` definitions 82in `xlat_tables_v2.h`_. Note that for the EL1&0 translation regime the Execute 83Never attribute is set simultaneously for both EL1 and EL0. 84 85The granularity controls the translation table level to go down to when mapping 86the region. For example, assuming the MMU has been configured to use a 4KB 87granule size, the library might map a 2MB memory region using either of the two 88following options: 89 90- using a single level-2 translation table entry; 91- using a level-2 intermediate entry to a level-3 translation table (which 92 contains 512 entries, each mapping 4KB). 93 94The first solution potentially requires less translation tables, hence 95potentially less memory. However, if part of this 2MB region is later remapped 96with different memory attributes, the library might need to split the existing 97page tables to refine the mappings. If a single level-2 entry has been used 98here, a level-3 table will need to be allocated on the fly and the level-2 99modified to point to this new level-3 table. This has a performance cost at 100run-time. 101 102If the user knows upfront that such a remapping operation is likely to happen 103then they might enforce a 4KB mapping granularity for this 2MB region from the 104beginning; remapping some of these 4KB pages on the fly then becomes a 105lightweight operation. 106 107The region's granularity is an optional field; if it is not specified the 108library will choose the mapping granularity for this region as it sees fit (more 109details can be found in `The memory mapping algorithm`_ section below). 110 111Translation Context 112~~~~~~~~~~~~~~~~~~~ 113 114The library can create or modify translation tables pertaining to a different 115translation regime than the exception level the library code is executing at. 116For example, the library might be used by EL3 software (for instance BL31) to 117create translation tables pertaining to the S-EL1&0 translation regime. 118 119This flexibility comes from the use of *translation contexts*. A *translation 120context* constitutes the superset of information used by the library to track 121the status of a set of translation tables for a given translation regime. 122 123The library internally allocates a default translation context, which pertains 124to the translation regime of the current exception level. Additional contexts 125may be explicitly allocated and initialized using the 126``REGISTER_XLAT_CONTEXT()`` macro. Separate APIs are provided to act either on 127the default translation context or on an alternative one. 128 129To register a translation context, the user must provide the library with the 130following information: 131 132* A name. 133 134 The resulting translation context variable will be called after this name, to 135 which ``_xlat_ctx`` is appended. For example, if the macro name parameter is 136 ``foo``, the context variable name will be ``foo_xlat_ctx``. 137 138* The maximum number of `mmap` regions to map. 139 140 Should account for both static and dynamic regions, if applicable. 141 142* The number of sub-translation tables to allocate. 143 144 Number of translation tables to statically allocate for this context, 145 excluding the initial lookup level translation table, which is always 146 allocated. For example, if the initial lookup level is 1, this parameter would 147 specify the number of level-2 and level-3 translation tables to pre-allocate 148 for this context. 149 150* The size of the virtual address space. 151 152 Size in bytes of the virtual address space to map using this context. This 153 will incidentally determine the number of entries in the initial lookup level 154 translation table : the library will allocate as many entries as is required 155 to map the entire virtual address space. 156 157* The size of the physical address space. 158 159 Size in bytes of the physical address space to map using this context. 160 161The default translation context is internally initialized using information 162coming (for the most part) from platform-specific defines: 163 164- name: hard-coded to ``tf`` ; hence the name of the default context variable is 165 ``tf_xlat_ctx``; 166- number of `mmap` regions: ``MAX_MMAP_REGIONS``; 167- number of sub-translation tables: ``MAX_XLAT_TABLES``; 168- size of the virtual address space: ``PLAT_VIRT_ADDR_SPACE_SIZE``; 169- size of the physical address space: ``PLAT_PHY_ADDR_SPACE_SIZE``. 170 171Please refer to the `Porting Guide`_ for more details about these macros. 172 173 174Static and dynamic memory regions 175~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 176 177The library optionally supports dynamic memory mapping. This feature may be 178enabled using the ``PLAT_XLAT_TABLES_DYNAMIC`` platform build flag. 179 180When dynamic memory mapping is enabled, the library categorises mmap regions as 181*static* or *dynamic*. 182 183- *Static regions* are fixed for the lifetime of the system. They can only be 184 added early on, before the translation tables are created and populated. They 185 cannot be removed afterwards. 186 187- *Dynamic regions* can be added or removed any time. 188 189When the dynamic memory mapping feature is disabled, only static regions exist. 190 191The dynamic memory mapping feature may be used to map and unmap transient memory 192areas. This is useful when the user needs to access some memory for a fixed 193period of time, after which the memory may be discarded and reclaimed. For 194example, a memory region that is only required at boot time while the system is 195initializing, or to temporarily share a memory buffer between the normal world 196and trusted world. Note that it is up to the caller to ensure that these regions 197are not accessed concurrently while the regions are being added or removed. 198 199Although this feature provides some level of dynamic memory allocation, this 200does not allow dynamically allocating an arbitrary amount of memory at an 201arbitrary memory location. The user is still required to declare at compile-time 202the limits of these allocations ; the library will deny any mapping request that 203does not fit within this pre-allocated pool of memory. 204 205 206Library APIs 207------------ 208 209The external APIs exposed by this library are declared and documented in the 210`xlat_tables_v2.h`_ header file. This should be the reference point for 211getting information about the usage of the different APIs this library 212provides. This section just provides some extra details and clarifications. 213 214Although the ``mmap_region`` structure is a publicly visible type, it is not 215recommended to populate these structures by hand. Instead, wherever APIs expect 216function arguments of type ``mmap_region_t``, these should be constructed using 217the ``MAP_REGION*()`` family of helper macros. This is to limit the risk of 218compatibility breaks, should the ``mmap_region`` structure type evolve in the 219future. 220 221The ``MAP_REGION()`` and ``MAP_REGION_FLAT()`` macros do not allow specifying a 222mapping granularity, which leaves the library implementation free to choose 223it. However, in cases where a specific granularity is required, the 224``MAP_REGION2()`` macro might be used instead. 225 226As explained earlier in this document, when the dynamic mapping feature is 227disabled, there is no notion of dynamic regions. Conceptually, there are only 228static regions. For this reason (and to retain backward compatibility with the 229version 1 of the library), the APIs that map static regions do not embed the 230word *static* in their functions names (for example ``mmap_add_region()``), in 231contrast with the dynamic regions APIs (for example 232``mmap_add_dynamic_region()``). 233 234Although the definition of static and dynamic regions is not based on the state 235of the MMU, the two are still related in some way. Static regions can only be 236added before ``init_xlat_tables()`` is called and ``init_xlat_tables()`` must be 237called while the MMU is still off. As a result, static regions cannot be added 238once the MMU has been enabled. Dynamic regions can be added with the MMU on or 239off. In practice, the usual call flow would look like this: 240 241#. The MMU is initially off. 242 243#. Add some static regions, add some dynamic regions. 244 245#. Initialize translation tables based on the list of mmap regions (using one of 246 the ``init_xlat_tables*()`` APIs). 247 248#. At this point, it is no longer possible to add static regions. Dynamic 249 regions can still be added or removed. 250 251#. Enable the MMU. 252 253#. Dynamic regions can continue to be added or removed. 254 255Because static regions are added early on at boot time and are all in the 256control of the platform initialization code, the ``mmap_add*()`` family of APIs 257are not expected to fail. They do not return any error code. 258 259Nonetheless, these APIs will check upfront whether the region can be 260successfully added before updating the translation context structure. If the 261library detects that there is insufficient memory to meet the request, or that 262the new region will overlap another one in an invalid way, or if any other 263unexpected error is encountered, they will print an error message on the UART. 264Additionally, when asserts are enabled (typically in debug builds), an assertion 265will be triggered. Otherwise, the function call will just return straight away, 266without adding the offending memory region. 267 268 269Library limitations 270------------------- 271 272Dynamic regions are not allowed to overlap each other. Static regions are 273allowed to overlap as long as one of them is fully contained inside the other 274one. This is allowed for backwards compatibility with the previous behaviour in 275the version 1 of the library. 276 277 278Implementation details 279---------------------- 280 281Code structure 282~~~~~~~~~~~~~~ 283 284The library is divided into 4 modules: 285 286- **Core module** 287 288 Provides the main functionality of the library, such as the initialization of 289 translation tables contexts and mapping/unmapping memory regions. This module 290 provides functions such as ``mmap_add_region_ctx`` that let the caller specify 291 the translation tables context affected by them. 292 293 See `xlat_tables_core.c`_. 294 295- **Active context module** 296 297 Instantiates the context that is used by the current BL image and provides 298 helpers to manipulate it, abstracting it from the rest of the code. 299 This module provides functions such as ``mmap_add_region``, that directly 300 affect the BL image using them. 301 302 See `xlat_tables_context.c`_. 303 304- **Utilities module** 305 306 Provides additional functionality like debug print of the current state of the 307 translation tables and helpers to query memory attributes and to modify them. 308 309 See `xlat_tables_utils.c`_. 310 311- **Architectural module** 312 313 Provides functions that are dependent on the current execution state 314 (AArch32/AArch64), such as the functions used for TLB invalidation, setup the 315 MMU, or calculate the Physical Address Space size. They do not need a 316 translation context to work on. 317 318 See `aarch32/xlat_tables_arch.c`_ and `aarch64/xlat_tables_arch.c`_. 319 320From mmap regions to translation tables 321~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 322 323A translation context contains a list of ``mmap_region_t``, which holds the 324information of all the regions that are mapped at any given time. Whenever there 325is a request to map (resp. unmap) a memory region, it is added to (resp. removed 326from) the ``mmap_region_t`` list. 327 328The mmap regions list is a conceptual way to represent the memory layout. At 329some point, the library has to convert this information into actual translation 330tables to program into the MMU. 331 332Before the ``init_xlat_tables()`` API is called, the library only acts on the 333mmap regions list. Adding a static or dynamic region at this point through one 334of the ``mmap_add*()`` APIs does not affect the translation tables in any way, 335they only get registered in the internal mmap region list. It is only when the 336user calls the ``init_xlat_tables()`` that the translation tables are populated 337in memory based on the list of mmap regions registered so far. This is an 338optimization that allows creation of the initial set of translation tables in 339one go, rather than having to edit them every time while the MMU is disabled. 340 341After the ``init_xlat_tables()`` API has been called, only dynamic regions can 342be added. Changes to the translation tables (as well as the mmap regions list) 343will take effect immediately. 344 345The memory mapping algorithm 346~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 347 348The mapping function is implemented as a recursive algorithm. It is however 349bound by the level of depth of the translation tables (the Armv8-A architecture 350allows up to 4 lookup levels). 351 352By default [#granularity-ref]_, the algorithm will attempt to minimize the 353number of translation tables created to satisfy the user's request. It will 354favour mapping a region using the biggest possible blocks, only creating a 355sub-table if it is strictly necessary. This is to reduce the memory footprint of 356the firmware. 357 358The most common reason for needing a sub-table is when a specific mapping 359requires a finer granularity. Misaligned regions also require a finer 360granularity than what the user may had originally expected, using a lot more 361memory than expected. The reason is that all levels of translation are 362restricted to address translations of the same granularity as the size of the 363blocks of that level. For example, for a 4 KiB page size, a level 2 block entry 364can only translate up to a granularity of 2 MiB. If the Physical Address is not 365aligned to 2 MiB then additional level 3 tables are also needed. 366 367Note that not every translation level allows any type of descriptor. Depending 368on the page size, levels 0 and 1 of translation may only allow table 369descriptors. If a block entry could be able to describe a translation, but that 370level does not allow block descriptors, a table descriptor will have to be used 371instead, as well as additional tables at the next level. 372 373|Alignment Example| 374 375The mmap regions are sorted in a way that simplifies the code that maps 376them. Even though this ordering is only strictly needed for overlapping static 377regions, it must also be applied for dynamic regions to maintain a consistent 378order of all regions at all times. As each new region is mapped, existing 379entries in the translation tables are checked to ensure consistency. Please 380refer to the comments in the source code of the core module for more details 381about the sorting algorithm in use. 382 383.. [#granularity-ref] That is, when mmap regions do not enforce their mapping 384 granularity. 385 386TLB maintenance operations 387~~~~~~~~~~~~~~~~~~~~~~~~~~ 388 389The library takes care of performing TLB maintenance operations when required. 390For example, when the user requests removing a dynamic region, the library 391invalidates all TLB entries associated to that region to ensure that these 392changes are visible to subsequent execution, including speculative execution, 393that uses the changed translation table entries. 394 395A counter-example is the initialization of translation tables. In this case, 396explicit TLB maintenance is not required. The Armv8-A architecture guarantees 397that all TLBs are disabled from reset and their contents have no effect on 398address translation at reset [#tlb-reset-ref]_. Therefore, the TLBs invalidation 399is deferred to the ``enable_mmu*()`` family of functions, just before the MMU is 400turned on. 401 402TLB invalidation is not required when adding dynamic regions either. Dynamic 403regions are not allowed to overlap existing memory region. Therefore, if the 404dynamic mapping request is deemed legitimate, it automatically concerns memory 405that was not mapped in this translation regime and the library will have 406initialized its corresponding translation table entry to an invalid 407descriptor. Given that the TLBs are not architecturally permitted to hold any 408invalid translation table entry [#tlb-no-invalid-entry]_, this means that this 409mapping cannot be cached in the TLBs. 410 411.. [#tlb-reset-ref] See section D4.9 `Translation Lookaside Buffers (TLBs)`, subsection `TLB behavior at reset` in Armv8-A, rev C.a. 412.. [#tlb-no-invalid-entry] See section D4.10.1 `General TLB maintenance requirements` in Armv8-A, rev C.a. 413 414-------------- 415 416*Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.* 417 418.. _lib/xlat_tables_v2: ../../lib/xlat_tables_v2 419.. _lib/xlat_tables: ../../lib/xlat_tables 420.. _xlat_tables_v2.h: ../../include/lib/xlat_tables/xlat_tables_v2.h 421.. _xlat_tables_context.c: ../../lib/xlat_tables_v2/xlat_tables_context.c 422.. _xlat_tables_core.c: ../../lib/xlat_tables_v2/xlat_tables_core.c 423.. _xlat_tables_utils.c: ../../lib/xlat_tables_v2/xlat_tables_utils.c 424.. _aarch32/xlat_tables_arch.c: ../../lib/xlat_tables_v2/aarch32/xlat_tables_arch.c 425.. _aarch64/xlat_tables_arch.c: ../../lib/xlat_tables_v2/aarch64/xlat_tables_arch.c 426.. _Porting Guide: ../getting_started/porting-guide.rst 427.. |Alignment Example| image:: ../diagrams/xlat_align.png?raw=true 428