1Library at ROM 2============== 3 4This 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 26.. image:: ../resources/diagrams/romlib_design.png 27 :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 45 reserved 46 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 57.. image:: ../resources/diagrams/romlib_wrapper.png 58 :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 74Wrapper 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 83Script 84~~~~~~ 85 86There is a ``romlib_generator.py`` Python script that generates the necessary 87files for the "library at ROM" to work. It implements multiple functions: 88 891. ``romlib_generator.py gentbl [args]`` - Generates the jump table by parsing 90 the index file. 91 922. ``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. 95 963. ``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 98 ``patch``. The generated wrapper file is called ``wrappers.s``. 99 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 105Each ``romlib_generator.py`` function has its own manual which is accessible by 106runing ``romlib_generator.py [function] --help``. 107 108``romlib_generator.py`` requires Python 3 environment. 109 110 111Patching of functions in library at ROM 112~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 114The ``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. 118 119The calling sequence for a patched function is as follows: 120 121BL image --> function 122 123Memory impact 124~~~~~~~~~~~~~ 125 126Using library at ROM will modify the memory layout of the BL images: 127 128- The ROM library needs a page aligned RAM section to hold the RW data. This 129 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 133- Depending on the functions moved to the ROM library, the size of the BL images 134 will be reduced. 135 For example: moving MbedTLS function into the ROM library reduces BL1 and 136 BL2, but not BL31. 137 138- This change in BL images size can be taken into consideration to optimize the 139 memory layout when defining the BLx_BASE macros. 140 141Build library at ROM 142~~~~~~~~~~~~~~~~~~~~~ 143 144The environment variable ``CROSS_COMPILE`` must be set appropriately. Refer to 145:ref:`Performing an Initial Build` for more information about setting this 146variable. 147 148In 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. 150 151.. code:: shell 152 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 162-------------- 163 164*Copyright (c) 2019, Arm Limited. All rights reserved.* 165