blob: ff5188e4b880cdd0bd87c5fbfc7ef6ee3ec3835a [file] [log] [blame]
TF-A Memory Layout Tool
=======================
TF-A's memory layout tool is a Python script for analyzing the virtual
memory layout of TF-A builds.
Prerequisites
~~~~~~~~~~~~~
#. Python (3.8 or later)
#. `Poetry`_ Python package manager
Getting Started
~~~~~~~~~~~~~~~
#. Install Poetry
.. code:: shell
curl -sSL https://install.python-poetry.org | python3 -
#. Install the required packages
.. code:: shell
poetry install --with memory
#. Verify that the tool runs in the installed virtual environment
.. code:: shell
poetry run memory --help
Symbol Virtual Map
~~~~~~~~~~~~~~~~~~
The tool can be used to generate a visualisation of the symbol table. By
default, it prints the symbols representing the start and end address of the
main memory regions in an ELF file (i.e. text, bss, rodata) but can be modified
to print any set of symbols.
.. code:: shell
$ poetry run memory -s
build-path: build/fvp/release
Virtual Address Map:
+------------__BL1_RAM_END__------------+---------------------------------------+
+---------__COHERENT_RAM_END__----------+ |
+--------__COHERENT_RAM_START__---------+ |
0x0403b000 +----------__XLAT_TABLE_END__-----------+ |
0x04036000 +---------__XLAT_TABLE_START__----------+ |
+--------__BASE_XLAT_TABLE_END__--------+ |
0x04035600 +--------------__BSS_END__--------------+ |
+-------__BASE_XLAT_TABLE_START__-------+ |
+-----__PMF_PERCPU_TIMESTAMP_END__------+ |
+---------__PMF_TIMESTAMP_END__---------+ |
0x04035400 +--------__PMF_TIMESTAMP_START__--------+ |
+-------------__BSS_START__-------------+ |
0x04034a00 +------------__STACKS_END__-------------+ |
0x04034500 +-----------__STACKS_START__------------+ |
0x040344c5 +-----------__DATA_RAM_END__------------+ |
+-----------__BL1_RAM_START__-----------+ |
0x04034000 +----------__DATA_RAM_START__-----------+ |
| +---------__COHERENT_RAM_END__----------+
| +--------__COHERENT_RAM_START__---------+
0x0402e000 | +----------__XLAT_TABLE_END__-----------+
0x04029000 | +---------__XLAT_TABLE_START__----------+
| +--------__BASE_XLAT_TABLE_END__--------+
0x04028800 | +--------------__BSS_END__--------------+
| +-------__BASE_XLAT_TABLE_START__-------+
| +-----__PMF_PERCPU_TIMESTAMP_END__------+
| +---------__PMF_TIMESTAMP_END__---------+
0x04028580 | +--------__PMF_TIMESTAMP_START__--------+
0x04028000 | +-------------__BSS_START__-------------+
0x04027e40 | +------------__STACKS_END__-------------+
0x04027840 | +-----------__STACKS_START__------------+
0x04027000 | +------------__RODATA_END__-------------+
| +------------__CPU_OPS_END__------------+
| +-----------__CPU_OPS_START__-----------+
| +--------__FCONF_POPULATOR_END__--------+
| +--------------__GOT_END__--------------+
| +-------------__GOT_START__-------------+
| +---------__PMF_SVC_DESCS_END__---------+
0x04026c10 | +--------__PMF_SVC_DESCS_START__--------+
0x04026bf8 | +-------__FCONF_POPULATOR_START__-------+
| +-----------__RODATA_START__------------+
0x04026000 | +-------------__TEXT_END__--------------+
0x04021000 | +------------__TEXT_START__-------------+
0x000062b5 +------------__BL1_ROM_END__------------+ |
0x00005df0 +----------__DATA_ROM_START__-----------+ |
+------------__CPU_OPS_END__------------+ |
+--------------__GOT_END__--------------+ |
+-------------__GOT_START__-------------+ |
0x00005de8 +------------__RODATA_END__-------------+ |
+-----------__CPU_OPS_START__-----------+ |
+--------__FCONF_POPULATOR_END__--------+ |
+---------__PMF_SVC_DESCS_END__---------+ |
0x00005c98 +--------__PMF_SVC_DESCS_START__--------+ |
0x00005c80 +-------__FCONF_POPULATOR_START__-------+ |
+-----------__RODATA_START__------------+ |
0x00005000 +-------------__TEXT_END__--------------+ |
0x00000000 +------------__TEXT_START__-------------+---------------------------------------+
Addresses are displayed in hexadecimal by default but can be printed in decimal
instead with the ``-d`` option.
Because of the length of many of the symbols, the tool defaults to a text width
of 120 chars. This can be increased if needed with the ``-w`` option.
For more detailed help instructions, run:
.. code:: shell
poetry run memory --help
Memory Footprint
~~~~~~~~~~~~~~~~
The tool enables users to view static memory consumption. When the options
``-f``, or ``--footprint`` are provided, the script analyses the ELF binaries in
the build path to generate a table (per memory type), showing memory allocation
and usage. This is the default output generated by the tool.
.. code:: shell
$ poetry run memory -f
build-path: build/fvp/release
+----------------------------------------------------------------------------+
| Memory Usage (bytes) [RAM] |
+-----------+------------+------------+------------+------------+------------+
| Component | Start | Limit | Size | Free | Total |
+-----------+------------+------------+------------+------------+------------+
| BL1 | 4034000 | 4040000 | 7000 | 5000 | c000 |
| BL2 | 4021000 | 4034000 | d000 | 6000 | 13000 |
| BL2U | 4021000 | 4034000 | a000 | 9000 | 13000 |
| BL31 | 4003000 | 4040000 | 1e000 | 1f000 | 3d000 |
+-----------+------------+------------+------------+------------+------------+
+----------------------------------------------------------------------------+
| Memory Usage (bytes) [ROM] |
+-----------+------------+------------+------------+------------+------------+
| Component | Start | Limit | Size | Free | Total |
+-----------+------------+------------+------------+------------+------------+
| BL1 | 0 | 4000000 | 5df0 | 3ffa210 | 4000000 |
+-----------+------------+------------+------------+------------+------------+
The script relies on symbols in the symbol table to determine the start, end,
and limit addresses of each bootloader stage.
--------------
*Copyright (c) 2023, Arm Limited. All rights reserved.*
.. _Poetry: https://python-poetry.org/docs/