blob: c0f3ed34b7be9541dc57d5820be424383564d944 [file] [log] [blame]
Sathees Balya17d8eed2019-01-30 15:56:44 +00001Library at ROM
2==============
3
Sathees Balya17d8eed2019-01-30 15:56:44 +00004This document provides an overview of the "library at ROM" implementation in
5Trusted Firmware-A (TF-A).
6
7Introduction
8~~~~~~~~~~~~
9
10The "library at ROM" feature allows platforms to build a library of functions to
11be placed in ROM. This reduces SRAM usage by utilising the available space in
12ROM. The "library at ROM" contains a jump table with the list of functions that
13are placed in ROM. The capabilities of the "library at ROM" are:
14
151. Functions can be from one or several libraries.
16
172. Functions can be patched after they have been programmed into ROM.
18
193. Platform-specific libraries can be placed in ROM.
20
214. Functions can be accessed by one or more BL images.
22
23Index file
24~~~~~~~~~~
25
Paul Beesley814f8c02019-03-13 15:49:27 +000026.. image:: ../resources/diagrams/romlib_design.png
Sathees Balya17d8eed2019-01-30 15:56:44 +000027 :width: 600
28
29Library at ROM is described by an index file with the list of functions to be
30placed in ROM. The index file is platform specific and its format is:
31
32::
33
34 lib function [patch]
35
36 lib -- Name of the library the function belongs to
37 function -- Name of the function to be placed in library at ROM
38 [patch] -- Option to patch the function
39
40It is also possible to insert reserved spaces in the list by using the keyword
41"reserved" rather than the "lib" and "function" names as shown below:
42
43::
44
Imre Kis2d137c52019-07-09 18:30:58 +020045 reserved
Sathees Balya17d8eed2019-01-30 15:56:44 +000046
47The reserved spaces can be used to add more functions in the future without
48affecting the order and location of functions already existing in the jump
49table. Also, for additional flexibility and modularity, the index file can
50include other index files.
51
52For an index file example, refer to ``lib/romlib/jmptbl.i``.
53
54Wrapper functions
55~~~~~~~~~~~~~~~~~
56
Paul Beesley814f8c02019-03-13 15:49:27 +000057.. image:: ../resources/diagrams/romlib_wrapper.png
Sathees Balya17d8eed2019-01-30 15:56:44 +000058 :width: 600
59
60When invoking a function of the "library at ROM", the calling sequence is as
61follows:
62
63BL image --> wrapper function --> jump table entry --> library at ROM
64
65The index file is used to create a jump table which is placed in ROM. Then, the
66wrappers refer to the jump table to call the "library at ROM" functions. The
67wrappers essentially contain a branch instruction to the jump table entry
68corresponding to the original function. Finally, the original function in the BL
69image(s) is replaced with the wrapper function.
70
71The "library at ROM" contains a necessary init function that initialises the
72global variables defined by the functions inside "library at ROM".
73
Jimmy Brisson1dfa2712024-07-22 12:55:43 -050074Wrapper functions are specified at the link stage of compilation and cannot
75interpose uppon functions within the same translation unit. For example, if
76function ``fn_a`` calls ``fn_b`` within translation unit ``functions.c`` and
77the romlib jump table includes an entry for ``fn_b``, ``fn_a`` will include
78a reference to ``fn_b``'s original program text instead of the wrapper. Thus
79the jumptable author must take care to include public entry points into
80translation units to avoid paying the program text cost twice, once in the
81original executable and once in romlib.
82
Imre Kis2d137c52019-07-09 18:30:58 +020083Script
84~~~~~~
Sathees Balya17d8eed2019-01-30 15:56:44 +000085
Manish V Badarkheacf72eb2024-04-18 10:13:36 +010086There is a ``romlib_generator.py`` Python script that generates the necessary
Imre Kis2d137c52019-07-09 18:30:58 +020087files for the "library at ROM" to work. It implements multiple functions:
Sathees Balya17d8eed2019-01-30 15:56:44 +000088
Manish V Badarkheacf72eb2024-04-18 10:13:36 +0100891. ``romlib_generator.py gentbl [args]`` - Generates the jump table by parsing
Imre Kis2d137c52019-07-09 18:30:58 +020090 the index file.
Sathees Balya17d8eed2019-01-30 15:56:44 +000091
Imre Kis2d137c52019-07-09 18:30:58 +0200922. ``romlib_generator.py genvar [args]`` - Generates the jump table global
93 variable (**not** the jump table itself) with the absolute address in ROM.
94 This global variable is, basically, a pointer to the jump table.
Sathees Balya17d8eed2019-01-30 15:56:44 +000095
Imre Kis2d137c52019-07-09 18:30:58 +0200963. ``romlib_generator.py genwrappers [args]`` - Generates a wrapper function for
97 each entry in the index file except for the ones that contain the keyword
Jimmy Brisson1dfa2712024-07-22 12:55:43 -050098 ``patch``. The generated wrapper file is called ``wrappers.s``.
Imre Kis2d137c52019-07-09 18:30:58 +020099
1004. ``romlib_generator.py pre [args]`` - Preprocesses the index file which means
101 it resolves all the include commands in the file recursively. It can also
102 generate a dependency file of the included index files which can be directly
103 used in makefiles.
104
Manish V Badarkheacf72eb2024-04-18 10:13:36 +0100105Each ``romlib_generator.py`` function has its own manual which is accessible by
Imre Kis2d137c52019-07-09 18:30:58 +0200106runing ``romlib_generator.py [function] --help``.
107
Manish V Badarkheacf72eb2024-04-18 10:13:36 +0100108``romlib_generator.py`` requires Python 3 environment.
Imre Kis2d137c52019-07-09 18:30:58 +0200109
Sathees Balya17d8eed2019-01-30 15:56:44 +0000110
111Patching of functions in library at ROM
112~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
113
Imre Kis2d137c52019-07-09 18:30:58 +0200114The ``romlib_generator.py genwrappers`` does not generate wrappers for the
115entries in the index file that contain the keyword ``patch``. Thus, it allows
116calling the function from the actual library by breaking the link to the
117"library at ROM" version of this function.
Sathees Balya17d8eed2019-01-30 15:56:44 +0000118
119The calling sequence for a patched function is as follows:
120
121BL image --> function
122
Louis Mayencourtbb2c5382019-10-11 15:27:01 +0100123Memory impact
124~~~~~~~~~~~~~
125
126Using library at ROM will modify the memory layout of the BL images:
Paul Beesleyd2fcc4e2019-05-29 13:59:40 +0100127
Louis Mayencourtbb2c5382019-10-11 15:27:01 +0100128- The ROM library needs a page aligned RAM section to hold the RW data. This
Paul Beesleyd2fcc4e2019-05-29 13:59:40 +0100129 section is defined by the ROMLIB_RW_BASE and ROMLIB_RW_END macros.
130 On Arm platforms a section of 1 page (0x1000) is allocated at the top of SRAM.
131 This will have for effect to shift down all the BL images by 1 page.
132
Louis Mayencourtbb2c5382019-10-11 15:27:01 +0100133- Depending on the functions moved to the ROM library, the size of the BL images
Paul Beesleyd2fcc4e2019-05-29 13:59:40 +0100134 will be reduced.
135 For example: moving MbedTLS function into the ROM library reduces BL1 and
136 BL2, but not BL31.
137
Louis Mayencourtbb2c5382019-10-11 15:27:01 +0100138- This change in BL images size can be taken into consideration to optimize the
Paul Beesleyd2fcc4e2019-05-29 13:59:40 +0100139 memory layout when defining the BLx_BASE macros.
Louis Mayencourtbb2c5382019-10-11 15:27:01 +0100140
Sathees Balya17d8eed2019-01-30 15:56:44 +0000141Build library at ROM
142~~~~~~~~~~~~~~~~~~~~~
143
Paul Beesleyd2fcc4e2019-05-29 13:59:40 +0100144The environment variable ``CROSS_COMPILE`` must be set appropriately. Refer to
145:ref:`Performing an Initial Build` for more information about setting this
146variable.
147
John Tsichritzisaec19d32019-03-08 16:54:13 +0000148In the below example the usage of ROMLIB together with mbed TLS is demonstrated
149to showcase the benefits of library at ROM - it's not mandatory.
Sathees Balya17d8eed2019-01-30 15:56:44 +0000150
Paul Beesley493e3492019-03-13 15:11:04 +0000151.. code:: shell
Sathees Balya17d8eed2019-01-30 15:56:44 +0000152
153 make PLAT=fvp \
154 MBEDTLS_DIR=</path/to/mbedtls/> \
155 TRUSTED_BOARD_BOOT=1 GENERATE_COT=1 \
156 ARM_ROTPK_LOCATION=devel_rsa \
157 ROT_KEY=plat/arm/board/common/rotpk/arm_rotprivk_rsa.pem \
158 BL33=</path/to/bl33.bin> \
159 USE_ROMLIB=1 \
160 all fip
161
Sathees Balya17d8eed2019-01-30 15:56:44 +0000162--------------
163
164*Copyright (c) 2019, Arm Limited. All rights reserved.*