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