blob: d55f010a327ca0e1120f211516572e315bccc45c [file] [log] [blame]
Antonio Nino Diazb5d68092017-05-23 11:49:22 +01001Translation Tables Library Design
2=================================
3
4
Paul Beesleyea225122019-02-11 17:54:45 +00005
Antonio Nino Diazb5d68092017-05-23 11:49:22 +01006
7.. contents::
8
9
10This document describes the design of the translation tables library (version 2)
Dan Handley610e7e12018-03-01 18:44:00 +000011used by Trusted Firmware-A (TF-A). This library provides APIs to create page
Antonio Nino Diazb5d68092017-05-23 11:49:22 +010012tables 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
Sandrine Bailleux15530dd2019-02-08 15:26:36 +010039in 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
Antonio Nino Diazb5d68092017-05-23 11:49:22 +010041support 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;
Sandrine Bailleux8f23fa82017-09-28 21:58:12 +010068- its attributes;
69- its mapping granularity (optional).
Antonio Nino Diazb5d68092017-05-23 11:49:22 +010070
Sandrine Bailleux15530dd2019-02-08 15:26:36 +010071See the ``struct mmap_region`` type in `xlat_tables_v2.h`_.
Antonio Nino Diazb5d68092017-05-23 11:49:22 +010072
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
Antonio Nino Diazdcf9d922017-10-04 16:52:15 +010079read-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
Antonio Nino Diaz8643a812018-06-21 14:39:16 +010081a User region (EL0) or Privileged region (EL1). See the ``MT_xxx`` definitions
Sandrine Bailleux15530dd2019-02-08 15:26:36 +010082in `xlat_tables_v2.h`_. Note that for the EL1&0 translation regime the Execute
Antonio Nino Diaz8643a812018-06-21 14:39:16 +010083Never attribute is set simultaneously for both EL1 and EL0.
Antonio Nino Diazb5d68092017-05-23 11:49:22 +010084
Sandrine Bailleux8f23fa82017-09-28 21:58:12 +010085The 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).
Antonio Nino Diazb5d68092017-05-23 11:49:22 +0100110
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
Sandrine Bailleux15530dd2019-02-08 15:26:36 +0100210`xlat_tables_v2.h`_ header file. This should be the reference point for
Antonio Nino Diazb5d68092017-05-23 11:49:22 +0100211getting 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
Sandrine Bailleux8f23fa82017-09-28 21:58:12 +0100221The ``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
Antonio Nino Diazb5d68092017-05-23 11:49:22 +0100226As 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
Antonio Nino Diaz27818082018-07-03 14:56:31 +0100284The library is divided into 4 modules:
Antonio Nino Diazb5d68092017-05-23 11:49:22 +0100285
Antonio Nino Diaz27818082018-07-03 14:56:31 +0100286- **Core module**
Antonio Nino Diazb5d68092017-05-23 11:49:22 +0100287
Antonio Nino Diaz27818082018-07-03 14:56:31 +0100288 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.
Antonio Nino Diazb5d68092017-05-23 11:49:22 +0100292
Sandrine Bailleux15530dd2019-02-08 15:26:36 +0100293 See `xlat_tables_core.c`_.
Antonio Nino Diazb5d68092017-05-23 11:49:22 +0100294
Antonio Nino Diaz27818082018-07-03 14:56:31 +0100295- **Active context module**
Antonio Nino Diazb5d68092017-05-23 11:49:22 +0100296
Antonio Nino Diaz27818082018-07-03 14:56:31 +0100297 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
Sandrine Bailleux15530dd2019-02-08 15:26:36 +0100302 See `xlat_tables_context.c`_.
Antonio Nino Diaz27818082018-07-03 14:56:31 +0100303
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
Sandrine Bailleux15530dd2019-02-08 15:26:36 +0100309 See `xlat_tables_utils.c`_.
Antonio Nino Diaz27818082018-07-03 14:56:31 +0100310
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
Sandrine Bailleux15530dd2019-02-08 15:26:36 +0100318 See `aarch32/xlat_tables_arch.c`_ and `aarch64/xlat_tables_arch.c`_.
Antonio Nino Diazb5d68092017-05-23 11:49:22 +0100319
Sandrine Bailleux8f23fa82017-09-28 21:58:12 +0100320From mmap regions to translation tables
Antonio Nino Diaz27818082018-07-03 14:56:31 +0100321~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sandrine Bailleux8f23fa82017-09-28 21:58:12 +0100322
Antonio Nino Diaz27818082018-07-03 14:56:31 +0100323A 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.
Antonio Nino Diazb5d68092017-05-23 11:49:22 +0100327
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
Sandrine Bailleux8f23fa82017-09-28 21:58:12 +0100345The memory mapping algorithm
Antonio Nino Diaz27818082018-07-03 14:56:31 +0100346~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sandrine Bailleux8f23fa82017-09-28 21:58:12 +0100347
Antonio Nino Diazb5d68092017-05-23 11:49:22 +0100348The mapping function is implemented as a recursive algorithm. It is however
Dan Handley610e7e12018-03-01 18:44:00 +0000349bound by the level of depth of the translation tables (the Armv8-A architecture
Antonio Nino Diazb5d68092017-05-23 11:49:22 +0100350allows up to 4 lookup levels).
351
Sandrine Bailleux8f23fa82017-09-28 21:58:12 +0100352By 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.
Antonio Nino Diazb5d68092017-05-23 11:49:22 +0100357
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
Sandrine Bailleux8f23fa82017-09-28 21:58:12 +0100383.. [#granularity-ref] That is, when mmap regions do not enforce their mapping
384 granularity.
385
386TLB maintenance operations
Antonio Nino Diaz27818082018-07-03 14:56:31 +0100387~~~~~~~~~~~~~~~~~~~~~~~~~~
Sandrine Bailleux8f23fa82017-09-28 21:58:12 +0100388
Antonio Nino Diazb5d68092017-05-23 11:49:22 +0100389The 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,
Dan Handley610e7e12018-03-01 18:44:00 +0000396explicit TLB maintenance is not required. The Armv8-A architecture guarantees
Antonio Nino Diazb5d68092017-05-23 11:49:22 +0100397that 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
Antonio Nino Diaz27818082018-07-03 14:56:31 +0100411.. [#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.
Antonio Nino Diazb5d68092017-05-23 11:49:22 +0100413
414--------------
415
Dan Handley610e7e12018-03-01 18:44:00 +0000416*Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.*
Antonio Nino Diazb5d68092017-05-23 11:49:22 +0100417
Paul Beesleyea225122019-02-11 17:54:45 +0000418.. _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