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
zcmV<L2@v)liwFP!000021MOW+Z{s);z2{dL?#nEYVOacTXOh9rVX=n=_OP?3#UhYx
z#nFr`8IqE8F8kY;q~wm{NRDHPPAj0%-DxTepGZBus^UlGmtViF(#b<ylu4dlO#$KQ
zB+lmfBFUCl(|`Z|x1ZJY*Xy%i7D@Eg{9P8&YGQsOD{bj&dRJBJuNN1OkB=yQDx)ed
zP@3GMGQRj<l%~;zsdO>DKATLo8(2hDWUn<>qpB*B*?kpHvS<}wO=r>k&t;L{XNzfF
ztEo57)4Z5GMCsM^%dPuNFPdg9UbM5P?RB(_XGI+S+1)fYAFYpRdL0+L&92sYnV2fo
z)B07Fj&|(7TXmXRrKyxHufP12eW`D$x$xXp+l_XDRI8|1CfREoGd5{G5Ckbgh#3s7
zmBx}u*o?{h;by0WOHT_|oE9!AZ`OHH6;V>XhMeVj8b?`;S{3*4@i^r?N)5&Kb*o1&
zZj-9Y-?;zVC@l}^Kz;f9+xFf!cUdHh{V(o|8Xc`XCX4Fs=9{PCs#|~Z)cQkGCbKkd
zyZa=o25bIlnC5q%j#KaFAMeSAy0uR8uuw6N`TNbo@;+I_<r_46S*N3=yQbR3Tcf^P
z@6ds%FYOp>2a!fkanUsY+q0RTG!M8@oJlmVl7~%cYfSRlAMw0uI{U9G$`(<vnEX8X
zE&n!s_CbsXk}R&K|HLl`Yqxu*F{6X8Mr)marxd|R3L(#dA}p}j9f;R5(gib{?V=Q>
zA5peU<7XsjkN}HI!VxfA7Kp>K$Z;C4ZsvKBz4jS~?xcfq67#yF8+l=f620{S(gW)*
zPL_97HyA|>Z+{3J2UgzYk2ft2<=fV>{ms63rtty1{yqLyZ4nz9V#5H$){b7pJbT~7
z-XH;!mxLm!q_RcLq&g0`vZL~br0>+}db-XBeo=47UH)UWu4XApI-KS`mZr;X$+M~r
z&|aV1Myn)!GWQi_<#bY3PgW9*oYg=2_c(ost7IN+EBE{F;MJ?s^7>$;@XHVD2l|qa
z@8aY!a4&7}o<I%ben7^<U1qDe{h7wu{i+$y15sKn?EBu12X{-m@5l44(340M=`B%!
zh_-ZK2*9sIZIF!3&_<#RAjR|?I8u5H616s8s@t<7F5}`MUYxD(t9g(s?{d|}&mdPn
zvRt)C3beOcX+*U)Y`_Qz=RVcSAh8+=OU^H;M$(lv!rW_|Fhmy*i4zO}?Ru97j}sJ9
zlJPApImS4loz<)_tEqVsT!C}m1@_5mi-a2_z>d`vfLe8BRQaU!AbmW9)(UA%L1SRl
zzQB@$M_Lm^h~x|u0WN@2V4o=b<pZd-*3?LuvEhP9ziM40VI+i<m()BMp&T-UW06nq
zT%tTUl-?c6E>Z@Ea(oV@7{c^|<~9n|ocguAL^ME{TEh!kv2##}O6}Y5_U++ec2^Ol
zsd4i(F=qE@)jiPeQYkQF0&5{SBT{}MyDNtvHRfO+Inhk{_9rb8Lqcn1?Jk8HnK3qo
zNuB#@9;~i^tJ_J*V0Fi5byZ)1Qb;Po>`X8y<#W#20MQ1BDsgF-c^xoAgetGgy+d^I
z5VI?h<lApD6&}qle4a@gJphNLeZbs0a-KO%8X(qi*Z~Vfn0F5M?qcAuKMn&PfW$&N
zJp}2S#LxhdhQtooxC6vHiF<c3kl5!go8H@OfFQx8Gq%F7KVjz+m8v&!X=->(P1Gxh
zEvus)ic`irvq?SE7$P3u5l<&6KSRU=<B52_4^)<!ciAXU`RY~Md}nfJw5p+KmAgP^
z^88(6N?vc#-Dz|nMI=KgBC7)(A$=>NpjulbtZGFRjJdKRBT>ZrstkH~3O#J4WYELW
z=%EQXK1LAfAc9y2976jSL@R(MYQ~Kqa_!2BjYbf|&c@RSVjCrcAdW^5^#|!;|1D=m
zjj(ostRl?o!Z$$@hzpSk(e#qq4O-HbwLBL2w0dX{r$qK#<SZ)V|KR@yZS=le*hSBv
zjUzmy0(=0u5}F%6NF<fwe&vd5MJy6%%B@^UO<h^jW05~nu1JupQ^-|2J%e2R$a3|M
zB#YaY)x;17+Cd3B*CD++S0E7M+~QD9FWnJy7inTCj+83vvEIbl!u95uKDGopcCk+=
zS92?4&-?DnaA3aPy`8qC6z^JV%N93LQRI)^lp~~P(>H0HE%z-PV#NDGys<QSFv3wW
zQ1_fr_s_ydPbl@?W2sH_VrMf6VuJddPuc(hQo^pB8&kvVbP_=V=m@5h%4(71D4+ba
zaZCOZ{1M;&NEbQ7X3H@~Pila3SW*C-YsCEqPa7a*kJy;li6g>|i(syfB6O;yDw_QC
zSVZe}Tm+>$#c8ZoY6hhmqf+SsPOb=TCyNCVN;1DES2jpk6Xs5?kh-ksvB;-Bx$-p#
z)Cmr*v@<d&)ELtx;UN?XTp9x{x#y#G4G>k>ovh;&+<6khN0Tin2-Hags*R9ApGG+K
zO!}vs<i?+=^JV!?Icbm>cSy!_l9$GnX98S8H*Egnd-}PnpY0iynCA7)Ll9y9`BTq7
zv-iwDQ_s`S?dP@#>3?oZ06#aO3oz;R)D{=~oFgrmyaZ*wa=XUKso;K(Z1wHk510SU
z9vqUO7^Vs^!%BXl{AYyrUrgbIvU7=;*2?Qz3X?Ss)5;Q>N#Uj^rMc{r(F1fa<UTv)
zp+v&^b6Rk1o;YygmC+VOAkK|I1JaIU6qAtgEJTQVnHa*u@#S41d;mjh4WMy-G$+if
zE;)l|fiPjt)KVLQQG^xvHnqLGcwoLWFo7pyOi)54$JDE>#nPB|^M^8<{X^5wWNXC$
zv{uYz|6~e-Us_urjg;bG4K9~8uAs-_o_Niu3>Nnk7Pp;`!RU_A=nk+|P*CP(Dj6fx
zzdG3oSxu-lx*Vu*OWHzFzecxz7ekWKlNw#spVm@hRwsV&>q^!*)QG9JHdiX#r0`=Q
z!DukKd)XK)?ihDz=>FQIuyi@Ei4@YSIMqN52?cHnj?o&J5h24avY<|T`55GBgz`l3
z0P<wqN_(b9a_-l6+5my^WSu<mx~wrDhxb$lc{+tWwem5@(-`FmhKTG0Jy(bc?m4hC
zFcK-}I0@}A1@N%DH7L_wDh6E|qb?1w>rDyG&N&iZfA!~g7%Z$VVPLkP@OVxz23_*4
zOYKw)x->>z>YrScB0+$k+ut@Le1>z+K)}F+bIhjHGbN?O2!c6;P!J~XSw%az7^G>8
z(!_?4CQaOLU8V{=OOpix#2E!AP1<hwB8VsjL7aj(?O|gOr!k5XA3&TGrY-}vCQSQP
zrwtM{x@6^v0oE@2gFF^F$kXSOr*=LDefm&+s>^Bg6c^WLb;0~y7SZbZ?Ej0npo|!s
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