From e36950bd6994f0168db66626394398a6dec1ae1d Mon Sep 17 00:00:00 2001 From: Sathees Balya <sathees.balya@arm.com> Date: Wed, 30 Jan 2019 15:56:44 +0000 Subject: [PATCH] docs: Document romlib design Change-Id: I2b75be16f452a8ab7c2445ccd519fb057a135812 Co-authored-by: John Tsichritzis <john.tsichritzis@arm.com> Signed-off-by: John Tsichritzis <john.tsichritzis@arm.com> --- docs/diagrams/romlib_design.dia | Bin 0 -> 2985 bytes docs/diagrams/romlib_design.png | Bin 0 -> 17244 bytes docs/diagrams/romlib_wrapper.dia | Bin 0 -> 2543 bytes docs/diagrams/romlib_wrapper.png | Bin 0 -> 12085 bytes docs/firmware-design.rst | 6 ++ docs/romlib-design.rst | 125 +++++++++++++++++++++++++++++++ 6 files changed, 131 insertions(+) create mode 100755 docs/diagrams/romlib_design.dia create mode 100755 docs/diagrams/romlib_design.png create mode 100755 docs/diagrams/romlib_wrapper.dia create mode 100755 docs/diagrams/romlib_wrapper.png create mode 100644 docs/romlib-design.rst diff --git a/docs/diagrams/romlib_design.dia b/docs/diagrams/romlib_design.dia new file mode 100755 index 0000000000000000000000000000000000000000..d12eec07dde88316538645ac5605977de5e1222f GIT binary patch literal 2985 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 literal 0 HcmV?d00001 diff --git a/docs/diagrams/romlib_design.png b/docs/diagrams/romlib_design.png new file mode 100755 index 0000000000000000000000000000000000000000..bfffcde7bacedf077f78339ec488b51ec16b1c23 GIT binary patch literal 17244 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 literal 0 HcmV?d00001 diff --git a/docs/diagrams/romlib_wrapper.dia b/docs/diagrams/romlib_wrapper.dia new file mode 100755 index 0000000000000000000000000000000000000000..30cfbd801033ef4fdf501d26dfb54be746793f22 GIT binary patch literal 2543 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 F005p7;Vu9G literal 0 HcmV?d00001 diff --git a/docs/diagrams/romlib_wrapper.png b/docs/diagrams/romlib_wrapper.png new file mode 100755 index 0000000000000000000000000000000000000000..ec3a44118b71f2f31e13a4c9b81fc0b793e2ab83 GIT binary patch literal 12085 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 L+p>8wCeQvKK0#5L literal 0 HcmV?d00001 diff --git a/docs/firmware-design.rst b/docs/firmware-design.rst index 617cbb886..4f51ff1d3 100644 --- a/docs/firmware-design.rst +++ b/docs/firmware-design.rst @@ -1866,6 +1866,11 @@ BL image during boot. | MHU | 0x04000000 +----------+ +Library at ROM +--------------- + +Please refer to the `ROMLIB Design`_ document. + Firmware Image Package (FIP) ---------------------------- @@ -2662,5 +2667,6 @@ References .. _TF-A Interrupt Management Design guide: ./interrupt-framework-design.rst .. _Xlat_tables design: xlat-tables-lib-v2-design.rst .. _Exception Handling Framework: exception-handling.rst +.. _ROMLIB Design: romlib-design.rst .. |Image 1| image:: diagrams/rt-svc-descs-layout.png?raw=true diff --git a/docs/romlib-design.rst b/docs/romlib-design.rst new file mode 100644 index 000000000..34a7980be --- /dev/null +++ b/docs/romlib-design.rst @@ -0,0 +1,125 @@ +Library at ROM +============== + +.. section-numbering:: + :suffix: . + +.. contents:: + +This document provides an overview of the "library at ROM" implementation in +Trusted Firmware-A (TF-A). + +Introduction +~~~~~~~~~~~~ + +The "library at ROM" feature allows platforms to build a library of functions to +be placed in ROM. This reduces SRAM usage by utilising the available space in +ROM. The "library at ROM" contains a jump table with the list of functions that +are placed in ROM. The capabilities of the "library at ROM" are: + +1. Functions can be from one or several libraries. + +2. Functions can be patched after they have been programmed into ROM. + +3. Platform-specific libraries can be placed in ROM. + +4. Functions can be accessed by one or more BL images. + +Index file +~~~~~~~~~~ + +.. image:: diagrams/romlib_design.png + :width: 600 + +Library at ROM is described by an index file with the list of functions to be +placed in ROM. The index file is platform specific and its format is: + +:: + + lib function [patch] + + lib -- Name of the library the function belongs to + function -- Name of the function to be placed in library at ROM + [patch] -- Option to patch the function + +It is also possible to insert reserved spaces in the list by using the keyword +"reserved" rather than the "lib" and "function" names as shown below: + +:: + + reserved reserved + +The reserved spaces can be used to add more functions in the future without +affecting the order and location of functions already existing in the jump +table. Also, for additional flexibility and modularity, the index file can +include other index files. + +For an index file example, refer to ``lib/romlib/jmptbl.i``. + +Wrapper functions +~~~~~~~~~~~~~~~~~ + +.. image:: diagrams/romlib_wrapper.png + :width: 600 + +When invoking a function of the "library at ROM", the calling sequence is as +follows: + +BL image --> wrapper function --> jump table entry --> library at ROM + +The index file is used to create a jump table which is placed in ROM. Then, the +wrappers refer to the jump table to call the "library at ROM" functions. The +wrappers essentially contain a branch instruction to the jump table entry +corresponding to the original function. Finally, the original function in the BL +image(s) is replaced with the wrapper function. + +The "library at ROM" contains a necessary init function that initialises the +global variables defined by the functions inside "library at ROM". + +Scripts +~~~~~~~ + +There are several scripts that generate the necessary files for the "library at +ROM" to work: + +1. ``gentbl.sh`` - Generates the jump table by parsing the index file. + +2. ``genvar.sh`` - Generates the jump table global variable (**not** the jump +table itself) with the absolute address in ROM. This global variable is, +basically, a pointer to the jump table. + +3. ``genwrappers.sh`` - Generates a wrapper function for each entry in the index +file except for the ones that contain the keyword ``patch``. The generated +wrapper file is called ``<lib>_<fn_name>.S``. + +Patching of functions in library at ROM +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The ``genwrappers.sh`` script does not generate wrappers for the entries in the +index file that contain the keyword ``patch``. Thus, it allows calling the +function from the actual library by breaking the link to the "library at ROM" +version of this function. + +The calling sequence for a patched function is as follows: + +BL image --> function + +Build library at ROM +~~~~~~~~~~~~~~~~~~~~~ + +The environment variable ``CROSS_COMPILE`` must be set as per the user guide. + +:: + + make PLAT=fvp \ + MBEDTLS_DIR=</path/to/mbedtls/> \ + TRUSTED_BOARD_BOOT=1 GENERATE_COT=1 \ + ARM_ROTPK_LOCATION=devel_rsa \ + ROT_KEY=plat/arm/board/common/rotpk/arm_rotprivk_rsa.pem \ + BL33=</path/to/bl33.bin> \ + USE_ROMLIB=1 \ + all fip + +-------------- + +*Copyright (c) 2019, Arm Limited. All rights reserved.* -- GitLab