xref: /arm-trusted-firmware/docs/tools/memory-layout-tool.rst (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700SchasingluluTF-A Memory Layout Tool
2*91f16700Schasinglulu=======================
3*91f16700Schasinglulu
4*91f16700SchasingluluTF-A's memory layout tool is a Python script for analyzing the virtual
5*91f16700Schasinglulumemory layout of TF-A builds.
6*91f16700Schasinglulu
7*91f16700SchasingluluPrerequisites
8*91f16700Schasinglulu~~~~~~~~~~~~~
9*91f16700Schasinglulu
10*91f16700Schasinglulu#. Python (3.8 or later)
11*91f16700Schasinglulu#. `Poetry`_ Python package manager
12*91f16700Schasinglulu
13*91f16700SchasingluluGetting Started
14*91f16700Schasinglulu~~~~~~~~~~~~~~~
15*91f16700Schasinglulu
16*91f16700Schasinglulu#. Install Poetry
17*91f16700Schasinglulu
18*91f16700Schasinglulu    .. code:: shell
19*91f16700Schasinglulu
20*91f16700Schasinglulu        curl -sSL https://install.python-poetry.org | python3 -
21*91f16700Schasinglulu
22*91f16700Schasinglulu#. Install the required packages
23*91f16700Schasinglulu
24*91f16700Schasinglulu    .. code:: shell
25*91f16700Schasinglulu
26*91f16700Schasinglulu        poetry install --with memory
27*91f16700Schasinglulu
28*91f16700Schasinglulu#. Verify that the tool runs in the installed virtual environment
29*91f16700Schasinglulu
30*91f16700Schasinglulu    .. code:: shell
31*91f16700Schasinglulu
32*91f16700Schasinglulu        poetry run memory --help
33*91f16700Schasinglulu
34*91f16700SchasingluluSymbol Virtual Map
35*91f16700Schasinglulu~~~~~~~~~~~~~~~~~~
36*91f16700Schasinglulu
37*91f16700SchasingluluThe tool can be used to generate a visualisation of the symbol table. By
38*91f16700Schasingluludefault, it prints the symbols representing the start and end address of the
39*91f16700Schasinglulumain memory regions in an ELF file (i.e. text, bss, rodata) but can be modified
40*91f16700Schasingluluto print any set of symbols.
41*91f16700Schasinglulu
42*91f16700Schasinglulu.. code:: shell
43*91f16700Schasinglulu
44*91f16700Schasinglulu    $ poetry run memory -s
45*91f16700Schasinglulu    build-path: build/fvp/release
46*91f16700Schasinglulu    Virtual Address Map:
47*91f16700Schasinglulu               +------------__BL1_RAM_END__------------+---------------------------------------+
48*91f16700Schasinglulu               +---------__COHERENT_RAM_END__----------+                                       |
49*91f16700Schasinglulu               +--------__COHERENT_RAM_START__---------+                                       |
50*91f16700Schasinglulu    0x0403b000 +----------__XLAT_TABLE_END__-----------+                                       |
51*91f16700Schasinglulu    0x04036000 +---------__XLAT_TABLE_START__----------+                                       |
52*91f16700Schasinglulu               +--------__BASE_XLAT_TABLE_END__--------+                                       |
53*91f16700Schasinglulu    0x04035600 +--------------__BSS_END__--------------+                                       |
54*91f16700Schasinglulu               +-------__BASE_XLAT_TABLE_START__-------+                                       |
55*91f16700Schasinglulu               +-----__PMF_PERCPU_TIMESTAMP_END__------+                                       |
56*91f16700Schasinglulu               +---------__PMF_TIMESTAMP_END__---------+                                       |
57*91f16700Schasinglulu    0x04035400 +--------__PMF_TIMESTAMP_START__--------+                                       |
58*91f16700Schasinglulu               +-------------__BSS_START__-------------+                                       |
59*91f16700Schasinglulu    0x04034a00 +------------__STACKS_END__-------------+                                       |
60*91f16700Schasinglulu    0x04034500 +-----------__STACKS_START__------------+                                       |
61*91f16700Schasinglulu    0x040344c5 +-----------__DATA_RAM_END__------------+                                       |
62*91f16700Schasinglulu               +-----------__BL1_RAM_START__-----------+                                       |
63*91f16700Schasinglulu    0x04034000 +----------__DATA_RAM_START__-----------+                                       |
64*91f16700Schasinglulu               |                                       +---------__COHERENT_RAM_END__----------+
65*91f16700Schasinglulu               |                                       +--------__COHERENT_RAM_START__---------+
66*91f16700Schasinglulu    0x0402e000 |                                       +----------__XLAT_TABLE_END__-----------+
67*91f16700Schasinglulu    0x04029000 |                                       +---------__XLAT_TABLE_START__----------+
68*91f16700Schasinglulu               |                                       +--------__BASE_XLAT_TABLE_END__--------+
69*91f16700Schasinglulu    0x04028800 |                                       +--------------__BSS_END__--------------+
70*91f16700Schasinglulu               |                                       +-------__BASE_XLAT_TABLE_START__-------+
71*91f16700Schasinglulu               |                                       +-----__PMF_PERCPU_TIMESTAMP_END__------+
72*91f16700Schasinglulu               |                                       +---------__PMF_TIMESTAMP_END__---------+
73*91f16700Schasinglulu    0x04028580 |                                       +--------__PMF_TIMESTAMP_START__--------+
74*91f16700Schasinglulu    0x04028000 |                                       +-------------__BSS_START__-------------+
75*91f16700Schasinglulu    0x04027e40 |                                       +------------__STACKS_END__-------------+
76*91f16700Schasinglulu    0x04027840 |                                       +-----------__STACKS_START__------------+
77*91f16700Schasinglulu    0x04027000 |                                       +------------__RODATA_END__-------------+
78*91f16700Schasinglulu               |                                       +------------__CPU_OPS_END__------------+
79*91f16700Schasinglulu               |                                       +-----------__CPU_OPS_START__-----------+
80*91f16700Schasinglulu               |                                       +--------__FCONF_POPULATOR_END__--------+
81*91f16700Schasinglulu               |                                       +--------------__GOT_END__--------------+
82*91f16700Schasinglulu               |                                       +-------------__GOT_START__-------------+
83*91f16700Schasinglulu               |                                       +---------__PMF_SVC_DESCS_END__---------+
84*91f16700Schasinglulu    0x04026c10 |                                       +--------__PMF_SVC_DESCS_START__--------+
85*91f16700Schasinglulu    0x04026bf8 |                                       +-------__FCONF_POPULATOR_START__-------+
86*91f16700Schasinglulu               |                                       +-----------__RODATA_START__------------+
87*91f16700Schasinglulu    0x04026000 |                                       +-------------__TEXT_END__--------------+
88*91f16700Schasinglulu    0x04021000 |                                       +------------__TEXT_START__-------------+
89*91f16700Schasinglulu    0x000062b5 +------------__BL1_ROM_END__------------+                                       |
90*91f16700Schasinglulu    0x00005df0 +----------__DATA_ROM_START__-----------+                                       |
91*91f16700Schasinglulu               +------------__CPU_OPS_END__------------+                                       |
92*91f16700Schasinglulu               +--------------__GOT_END__--------------+                                       |
93*91f16700Schasinglulu               +-------------__GOT_START__-------------+                                       |
94*91f16700Schasinglulu    0x00005de8 +------------__RODATA_END__-------------+                                       |
95*91f16700Schasinglulu               +-----------__CPU_OPS_START__-----------+                                       |
96*91f16700Schasinglulu               +--------__FCONF_POPULATOR_END__--------+                                       |
97*91f16700Schasinglulu               +---------__PMF_SVC_DESCS_END__---------+                                       |
98*91f16700Schasinglulu    0x00005c98 +--------__PMF_SVC_DESCS_START__--------+                                       |
99*91f16700Schasinglulu    0x00005c80 +-------__FCONF_POPULATOR_START__-------+                                       |
100*91f16700Schasinglulu               +-----------__RODATA_START__------------+                                       |
101*91f16700Schasinglulu    0x00005000 +-------------__TEXT_END__--------------+                                       |
102*91f16700Schasinglulu    0x00000000 +------------__TEXT_START__-------------+---------------------------------------+
103*91f16700Schasinglulu
104*91f16700SchasingluluAddresses are displayed in hexadecimal by default but can be printed in decimal
105*91f16700Schasingluluinstead with the ``-d`` option.
106*91f16700Schasinglulu
107*91f16700SchasingluluBecause of the length of many of the symbols, the tool defaults to a text width
108*91f16700Schasingluluof 120 chars. This can be increased if needed with the ``-w`` option.
109*91f16700Schasinglulu
110*91f16700SchasingluluFor more detailed help instructions, run:
111*91f16700Schasinglulu
112*91f16700Schasinglulu.. code:: shell
113*91f16700Schasinglulu
114*91f16700Schasinglulu    poetry run memory --help
115*91f16700Schasinglulu
116*91f16700SchasingluluMemory Footprint
117*91f16700Schasinglulu~~~~~~~~~~~~~~~~
118*91f16700Schasinglulu
119*91f16700SchasingluluThe tool enables users to view static memory consumption. When the options
120*91f16700Schasinglulu``-f``, or ``--footprint`` are provided, the script analyses the ELF binaries in
121*91f16700Schasingluluthe build path to generate a table (per memory type), showing memory allocation
122*91f16700Schasingluluand usage. This is the default output generated by the tool.
123*91f16700Schasinglulu
124*91f16700Schasinglulu.. code:: shell
125*91f16700Schasinglulu
126*91f16700Schasinglulu    $ poetry run memory -f
127*91f16700Schasinglulu    build-path: build/fvp/release
128*91f16700Schasinglulu    +----------------------------------------------------------------------------+
129*91f16700Schasinglulu    |                         Memory Usage (bytes) [RAM]                         |
130*91f16700Schasinglulu    +-----------+------------+------------+------------+------------+------------+
131*91f16700Schasinglulu    | Component |   Start    |   Limit    |    Size    |    Free    |   Total    |
132*91f16700Schasinglulu    +-----------+------------+------------+------------+------------+------------+
133*91f16700Schasinglulu    |    BL1    |    4034000 |    4040000 |       7000 |       5000 |       c000 |
134*91f16700Schasinglulu    |    BL2    |    4021000 |    4034000 |       d000 |       6000 |      13000 |
135*91f16700Schasinglulu    |    BL2U   |    4021000 |    4034000 |       a000 |       9000 |      13000 |
136*91f16700Schasinglulu    |    BL31   |    4003000 |    4040000 |      1e000 |      1f000 |      3d000 |
137*91f16700Schasinglulu    +-----------+------------+------------+------------+------------+------------+
138*91f16700Schasinglulu
139*91f16700Schasinglulu    +----------------------------------------------------------------------------+
140*91f16700Schasinglulu    |                         Memory Usage (bytes) [ROM]                         |
141*91f16700Schasinglulu    +-----------+------------+------------+------------+------------+------------+
142*91f16700Schasinglulu    | Component |   Start    |   Limit    |    Size    |    Free    |   Total    |
143*91f16700Schasinglulu    +-----------+------------+------------+------------+------------+------------+
144*91f16700Schasinglulu    |    BL1    |          0 |    4000000 |       5df0 |    3ffa210 |    4000000 |
145*91f16700Schasinglulu    +-----------+------------+------------+------------+------------+------------+
146*91f16700Schasinglulu
147*91f16700SchasingluluThe script relies on symbols in the symbol table to determine the start, end,
148*91f16700Schasingluluand limit addresses of each bootloader stage.
149*91f16700Schasinglulu
150*91f16700SchasingluluMemory Tree
151*91f16700Schasinglulu~~~~~~~~~~~
152*91f16700Schasinglulu
153*91f16700SchasingluluA hierarchical view of the memory layout can be produced by passing the option
154*91f16700Schasinglulu``-t`` or ``--tree`` to the tool. This gives the start, end, and size of each
155*91f16700Schasinglulumodule, their ELF segments as well as sections.
156*91f16700Schasinglulu
157*91f16700Schasinglulu.. code:: shell
158*91f16700Schasinglulu
159*91f16700Schasinglulu    $ poetry run memory -t
160*91f16700Schasinglulu    build-path: build/fvp/release
161*91f16700Schasinglulu    name                                       start        end       size
162*91f16700Schasinglulu    bl1                                            0    400c000    400c000
163*91f16700Schasinglulu    ├── 00                                         0       5de0       5de0
164*91f16700Schasinglulu    │   ├── .text                                  0       5000       5000
165*91f16700Schasinglulu    │   └── .rodata                             5000       5de0        de0
166*91f16700Schasinglulu    ├── 01                                   4034000    40344c5        4c5
167*91f16700Schasinglulu    │   └── .data                            4034000    40344c5        4c5
168*91f16700Schasinglulu    ├── 02                                   4034500    4034a00        500
169*91f16700Schasinglulu    │   └── .stacks                          4034500    4034a00        500
170*91f16700Schasinglulu    ├── 04                                   4034a00    4035600        c00
171*91f16700Schasinglulu    │   └── .bss                             4034a00    4035600        c00
172*91f16700Schasinglulu    └── 03                                   4036000    403b000       5000
173*91f16700Schasinglulu        └── .xlat_table                      4036000    403b000       5000
174*91f16700Schasinglulu    bl2                                      4021000    4034000      13000
175*91f16700Schasinglulu    ├── 00                                   4021000    4027000       6000
176*91f16700Schasinglulu    │   ├── .text                            4021000    4026000       5000
177*91f16700Schasinglulu    │   └── .rodata                          4026000    4027000       1000
178*91f16700Schasinglulu    └── 01                                   4027000    402e000       7000
179*91f16700Schasinglulu        ├── .data                            4027000    4027809        809
180*91f16700Schasinglulu        ├── .stacks                          4027840    4027e40        600
181*91f16700Schasinglulu        ├── .bss                             4028000    4028800        800
182*91f16700Schasinglulu        └── .xlat_table                      4029000    402e000       5000
183*91f16700Schasinglulu    bl2u                                     4021000    4034000      13000
184*91f16700Schasinglulu    ├── 00                                   4021000    4025000       4000
185*91f16700Schasinglulu    │   ├── .text                            4021000    4024000       3000
186*91f16700Schasinglulu    │   └── .rodata                          4024000    4025000       1000
187*91f16700Schasinglulu    └── 01                                   4025000    402b000       6000
188*91f16700Schasinglulu        ├── .data                            4025000    4025065         65
189*91f16700Schasinglulu        ├── .stacks                          4025080    4025480        400
190*91f16700Schasinglulu        ├── .bss                             4025600    4025c00        600
191*91f16700Schasinglulu        └── .xlat_table                      4026000    402b000       5000
192*91f16700Schasinglulu    bl31                                     4003000    4040000      3d000
193*91f16700Schasinglulu    ├── 02                                  ffe00000   ffe03000       3000
194*91f16700Schasinglulu    │   └── .el3_tzc_dram                   ffe00000   ffe03000       3000
195*91f16700Schasinglulu    ├── 00                                   4003000    4010000       d000
196*91f16700Schasinglulu    │   └── .text                            4003000    4010000       d000
197*91f16700Schasinglulu    └── 01                                   4010000    4021000      11000
198*91f16700Schasinglulu        ├── .rodata                          4010000    4012000       2000
199*91f16700Schasinglulu        ├── .data                            4012000    401219d        19d
200*91f16700Schasinglulu        ├── .stacks                          40121c0    40161c0       4000
201*91f16700Schasinglulu        ├── .bss                             4016200    4018c00       2a00
202*91f16700Schasinglulu        ├── .xlat_table                      4019000    4020000       7000
203*91f16700Schasinglulu        └── .coherent_ram                    4020000    4021000       1000
204*91f16700Schasinglulu
205*91f16700Schasinglulu
206*91f16700SchasingluluThe granularity of this view can be modified with the ``--depth`` option. For
207*91f16700Schasingluluinstance, if you only require the tree up to the level showing segment data,
208*91f16700Schasingluluyou can specify the depth with:
209*91f16700Schasinglulu
210*91f16700Schasinglulu.. code::
211*91f16700Schasinglulu
212*91f16700Schasinglulu    $ poetry run memory -t --depth 2
213*91f16700Schasinglulu    build-path: build/fvp/release
214*91f16700Schasinglulu    name                          start        end       size
215*91f16700Schasinglulu    bl1                               0    400c000    400c000
216*91f16700Schasinglulu    ├── 00                            0       5df0       5df0
217*91f16700Schasinglulu    ├── 01                      4034000    40344c5        4c5
218*91f16700Schasinglulu    ├── 02                      4034500    4034a00        500
219*91f16700Schasinglulu    ├── 04                      4034a00    4035600        c00
220*91f16700Schasinglulu    └── 03                      4036000    403b000       5000
221*91f16700Schasinglulu    bl2                         4021000    4034000      13000
222*91f16700Schasinglulu    ├── 00                      4021000    4027000       6000
223*91f16700Schasinglulu    └── 01                      4027000    402e000       7000
224*91f16700Schasinglulu    bl2u                        4021000    4034000      13000
225*91f16700Schasinglulu    ├── 00                      4021000    4025000       4000
226*91f16700Schasinglulu    └── 01                      4025000    402b000       6000
227*91f16700Schasinglulu    bl31                        4003000    4040000      3d000
228*91f16700Schasinglulu    ├── 02                     ffe00000   ffe03000       3000
229*91f16700Schasinglulu    ├── 00                      4003000    4010000       d000
230*91f16700Schasinglulu    └── 01                      4010000    4021000      11000
231*91f16700Schasinglulu
232*91f16700Schasinglulu--------------
233*91f16700Schasinglulu
234*91f16700Schasinglulu*Copyright (c) 2023, Arm Limited. All rights reserved.*
235*91f16700Schasinglulu
236*91f16700Schasinglulu.. _Poetry: https://python-poetry.org/docs/
237