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