1##################
2First Things First
3##################
4
5************
6Prerequisite
7************
8Trusted Firmware M provides a reference implementation of platform security
9architecture  reference implementation aligning with PSA Certified guidelines.
10It is assumed that the reader is familiar with specifications can be found at
11`Platform Security Architecture Resources <https://developer.arm.com/architectures/security-architectures/platform-security-architecture>`__.
12
13The current TF-M implementation specifically targets TrustZone for ARMv8-M so a
14good understanding of the v8-M architecture is also necessary. A good place to
15get started with ARMv8-M is
16`developer.arm.com <https://developer.arm.com/architectures/cpu-architecture/m-profile>`__.
17
18**************************
19Build and run instructions
20**************************
21Trusted Firmware M source code is available on
22`git.trustedfirmware.org <https://git.trustedfirmware.org/TF-M/trusted-firmware-m.git/>`__.
23
24To build & run TF-M:
25
26    - Follow the this guide to set up and check your environment.
27    - Follow the
28      :doc:`Build instructions </building/tfm_build_instruction>`
29      to compile and build the TF-M source.
30    - Follow the :doc:`Run TF-M examples on Arm platforms </building/run_tfm_examples_on_arm_platforms>`
31      for information on running the example.
32
33To port TF-M to a another system or OS, follow the
34:doc:`OS Integration Guide </integration_guide/index>`
35
36:doc:`Contributing Guidelines </contributing/contributing_process>` contains guidance on how to
37contribute to this project.
38
39#########################
40Set up build environments
41#########################
42
43TF-M officially supports a limited set of build environments and setups. In
44this context, official support means that the environments listed below
45are actively used by team members and active developers, hence users should
46be able to recreate the same configurations by following the instructions
47described below. In case of problems, the TF-M team provides support
48only for these environments, but building in other environments can still be
49possible.
50
51The following environments are supported:
52
53.. tabs::
54
55    .. group-tab:: Linux
56
57        1. version supported:
58
59           Ubuntu 18.04 x64+
60
61        2. install dependencies:
62
63        .. code-block:: bash
64
65            sudo apt-get install -y git curl wget build-essential libssl-dev python3 \
66            python3-pip cmake make
67
68        3. verify cmake version:
69
70        .. code-block:: bash
71
72            cmake --version
73
74        .. note::
75
76            Please download cmake 3.15 or later version from https://cmake.org/download/.
77
78        4. add CMake path into environment:
79
80        .. code-block:: bash
81
82            export PATH=<CMake path>/bin:$PATH
83
84    .. group-tab:: Windows
85
86        1. version supported:
87
88           Windows 10 x64
89
90        2. install dependecies:
91
92        - Git client latest version (https://git-scm.com/download/win)
93        - CMake (`native Windows version <https://cmake.org/download/>`__)
94        - GNU make (http://gnuwin32.sourceforge.net/packages/make.htm)
95        - Python3 `(native Windows version) <https://www.python.org/downloads/>`__ and
96          the pip package manager (from Python 3.4 it's included)
97
98        3. add CMake path into environment:
99
100        .. code-block:: bash
101
102            set PATH=<CMake_Path>\bin;%PATH%
103
104###########################
105Install python dependencies
106###########################
107
108Clone the TF-M source code, and then install the TF-M's additional Python
109dependencies.
110
111.. tabs::
112
113    .. group-tab:: Linux
114
115        1. get the TF-M source code:
116
117        .. code-block:: bash
118
119            cd <base folder>
120            git clone https://git.trustedfirmware.org/TF-M/trusted-firmware-m.git
121
122        2. TF-M's ``tools/requirements.txt`` file declares additional Python
123           dependencies. Install them with ``pip3``:
124
125        .. code-block:: bash
126
127            pip3 install --upgrade pip
128            cd trusted-firmware-m
129            pip3 install -r tools/requirements.txt
130
131    .. group-tab:: Windows
132
133        1. get the TF-M source code:
134
135        .. code-block:: bash
136
137            cd <base folder>
138            git clone https://git.trustedfirmware.org/TF-M/trusted-firmware-m.git
139
140        2. TF-M's ``tools/requirements.txt`` file declares additional Python
141           dependencies. Install them with ``pip3``:
142
143        .. code-block:: bash
144
145            cd trusted-firmware-m
146            pip3 install -r tools\requirements.txt
147
148###################
149Install a toolchain
150###################
151
152To compile TF-M code, at least one of the supported compiler toolchains have to
153be available in the build environment. The currently supported compiler
154versions are:
155
156    - Arm Compiler v6.10.1 ~ v6.14, v6.18+
157
158      .. tabs::
159
160          .. group-tab:: Linux
161
162              - Download the standalone packages from `here <https://developer.arm.com/products/software-development-tools/compilers/arm-compiler/downloads/version-6>`__.
163              - Add Arm Compiler into environment:
164
165                .. code-block:: bash
166
167                    export PATH=<ARM_CLANG_PATH>/bin:$PATH
168                    export ARM_PRODUCT_PATH=<ARM_CLANG_PATH>/sw/mappings
169
170              - Configure proper tool variant and license.
171
172          .. group-tab:: Windows
173
174              - Download the standalone packages from `here <https://developer.arm.com/products/software-development-tools/compilers/arm-compiler/downloads/version-6>`__.
175              - Add Arm Compiler into environment:
176
177                .. code-block:: bash
178
179                    set PATH=<ARM_CLANG_PATH>\bin;%PATH%
180                    set ARM_PRODUCT_PATH=<ARM_CLANG_PATH>\sw\mappings
181
182              - Configure proper tool variant and license.
183
184      .. note::
185
186          Arm compiler v6.15 ~ v6.17 may cause MemManage fault.
187          This defect has been fixed since Arm compiler v6.18.
188          See [SDCOMP-59788] in Armclang v6.18 `release note`__ for details.
189
190          .. __: https://developer.arm.com/-/media/Arm%20Developer%20Community/Downloads/Arm%20Compiler%20for%20Embedded/6-18/Release%20notes%20for%20Arm%20Compiler%20for%20Embedded%206.pdf
191
192    - GNU Arm compiler v7.3.1+
193
194      .. tabs::
195
196          .. group-tab:: Linux
197
198              - Download the GNU Arm compiler from `here <https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads>`__.
199              - Add GNU Arm into environment:
200
201                .. code-block:: bash
202
203                    export PATH=<GNU_ARM_PATH>/bin:$PATH
204
205          .. group-tab:: Windows
206
207              - Download the GNU Arm compiler from `here <https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads>`__.
208              - Add GNU Arm into environment:
209
210                .. code-block:: bash
211
212                    set PATH=<GNU_ARM_PATH>\bin;%PATH%
213
214      .. note::
215
216          GNU Arm compiler version *10-2020-q4-major* has an issue in CMSE
217          support. The bug is reported in `here <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99157>`__.
218          Select other GNU Arm compiler versions instead.
219
220    - IAR Arm compiler v8.42.x, v8.50.x
221
222      .. tabs::
223
224          .. group-tab:: Linux
225
226              - Download IAR build tools from `here <https://www.iar.com/iar-embedded-workbench/build-tools-for-linux/>`__.
227              - Add IAR Arm compiler into environment:
228
229                .. code-block:: bash
230
231                    export PATH=<IAR_COMPILER_PATH>/bin:$PATH
232
233          .. group-tab:: Windows
234
235              - Download IAR build tools from `here <https://www.iar.com/iar-embedded-workbench/#!?architecture=Arm>`__.
236              - Add IAR Arm compiler into environment:
237
238                .. code-block:: bash
239
240                    set PATH=<IAR_COMPILER_PATH>\bin;%PATH%
241
242#############################
243Build AN521 regression sample
244#############################
245
246Here, we take building TF-M for AN521 platform with regression tests using GCC
247as an example:
248
249.. tabs::
250
251    .. group-tab:: Linux
252
253        .. code-block:: bash
254
255            cd trusted-firmware-m
256            cmake -S . -B cmake_build -DTFM_PLATFORM=arm/mps2/an521 -DTFM_TOOLCHAIN_FILE=toolchain_GNUARM.cmake -DCMAKE_BUILD_TYPE=Debug -DTEST_S=ON -DTEST_NS=ON
257            cmake --build cmake_build -- install
258
259        Alternately using traditional cmake syntax
260
261        .. code-block:: bash
262
263            cd trusted-firmware-m
264            mkdir cmake_build
265            cd cmake_build
266            cmake .. -DTFM_PLATFORM=arm/mps2/an521 -DTFM_TOOLCHAIN_FILE=../toolchain_GNUARM.cmake -DTEST_S=ON -DTEST_NS=ON
267            make install
268
269    .. group-tab:: Windows
270
271        .. code-block:: bash
272
273            cd trusted-firmware-m
274            cmake -G"Unix Makefiles" -S . -B cmake_build -DTFM_PLATFORM=arm/mps2/an521 -DTFM_TOOLCHAIN_FILE=toolchain_GNUARM.cmake -DCMAKE_BUILD_TYPE=Debug -DTEST_S=ON -DTEST_NS=ON
275            cmake --build cmake_build -- install
276
277        Alternately using traditional cmake syntax
278
279        .. code-block:: bash
280
281            cd trusted-firmware-m
282            mkdir cmake_build
283            cd cmake_build
284            cmake -G"Unix Makefiles" .. -DTFM_PLATFORM=arm/mps2/an521 -DTFM_TOOLCHAIN_FILE=../toolchain_GNUARM.cmake -DTEST_S=ON -DTEST_NS=ON
285            make install
286
287
288        .. note::
289           The latest Windows support long paths, but if you are less lucky
290           then you can reduce paths by moving the build directory closer to
291           the root, using the 'out of tree' build.
292           For example to build in ``C:\build`` folder you can:
293
294           .. code-block:: bash
295
296               cd trusted-firmware-m
297               cmake -G"Unix Makefiles" -S . -B C:/build -DTFM_PLATFORM=arm/mps2/an521 -DTFM_TOOLCHAIN_FILE=toolchain_GNUARM.cmake -DCMAKE_BUILD_TYPE=Debug -DTEST_S=ON -DTEST_NS=ON
298               cmake --build C:/build -- install
299
300
301###########################
302Run AN521 regression sample
303###########################
304
305Run the sample code on SSE-200 Fast-Model, using FVP_MPS2_AEMv8M provided by
306Arm Development Studio.
307
308.. note::
309
310    Arm Development Studio is not essential to develop TF-M, you can skip this
311    section if don't want to try on Arm develop boards.
312
313.. tabs::
314
315    .. group-tab:: Linux
316
317        1. install Arm Development Studio to get the fast-model.
318
319           Download Arm Development Studio from `here <https://developer.arm.com/tools-and-software/embedded/arm-development-studio>`__.
320
321        2. Add ``bl2.axf`` and ``tfm_s_ns_signed.bin`` to symbol files in Debug
322           Configuration menu.
323
324        .. code-block:: bash
325
326            <DS_PATH>/sw/models/bin/FVP_MPS2_AEMv8M  \
327            --parameter fvp_mps2.platform_type=2 \
328            --parameter cpu0.baseline=0 \
329            --parameter cpu0.INITVTOR_S=0x10000000 \
330            --parameter cpu0.semihosting-enable=0 \
331            --parameter fvp_mps2.DISABLE_GATING=0 \
332            --parameter fvp_mps2.telnetterminal0.start_telnet=1 \
333            --parameter fvp_mps2.telnetterminal1.start_telnet=0 \
334            --parameter fvp_mps2.telnetterminal2.start_telnet=0 \
335            --parameter fvp_mps2.telnetterminal0.quiet=0 \
336            --parameter fvp_mps2.telnetterminal1.quiet=1 \
337            --parameter fvp_mps2.telnetterminal2.quiet=1 \
338            --application cpu0=<build_dir>/bin/bl2.axf \
339            --data cpu0=<build_dir>/bin/tfm_s_ns_signed.bin@0x10080000
340
341    .. group-tab:: Windows
342
343        1. install Arm Development Studio to get the fast-model.
344
345           Download Arm Development Studio from `here <https://developer.arm.com/tools-and-software/embedded/arm-development-studio>`__.
346
347        2. Add ``bl2.axf`` and ``tfm_s_ns_signed.bin`` to symbol files in Debug
348           Configuration menu.
349
350        .. code-block:: bash
351
352            <DS_PATH>\sw\models\bin\FVP_MPS2_AEMv8M  \
353            --parameter fvp_mps2.platform_type=2 \
354            --parameter cpu0.baseline=0 \
355            --parameter cpu0.INITVTOR_S=0x10000000 \
356            --parameter cpu0.semihosting-enable=0 \
357            --parameter fvp_mps2.DISABLE_GATING=0 \
358            --parameter fvp_mps2.telnetterminal0.start_telnet=1 \
359            --parameter fvp_mps2.telnetterminal1.start_telnet=0 \
360            --parameter fvp_mps2.telnetterminal2.start_telnet=0 \
361            --parameter fvp_mps2.telnetterminal0.quiet=0 \
362            --parameter fvp_mps2.telnetterminal1.quiet=1 \
363            --parameter fvp_mps2.telnetterminal2.quiet=1 \
364            --application cpu0=<build_dir>/bin/bl2.axf \
365            --data cpu0=<build_dir>/bin/tfm_s_ns_signed.bin@0x10080000
366
367After completing the procedure you should see the following messages on the
368DAPLink UART (baud 115200 8n1)::
369
370    [INF] Starting bootloader
371    [INF] Image 0: magic=good, copy_done=0xff, image_ok=0xff
372    [INF] Scratch: magic=bad, copy_done=0x5, image_ok=0x9
373    [INF] Boot source: primary slot
374    [INF] Swap type: none
375    [INF] Bootloader chainload address offset: 0x20000
376    [INF] Jumping to the first image slot
377    [Sec Thread] Secure image initializing!
378
379    #### Execute test suites for the protected storage service ####
380    Running Test Suite PS secure interface tests (TFM_PS_TEST_2XXX)...
381    > Executing 'TFM_PS_TEST_2001'
382      Description: 'Create interface'
383      TEST PASSED!
384    > Executing 'TFM_PS_TEST_2002'
385      Description: 'Get handle interface (DEPRECATED)'
386    This test is DEPRECATED and the test execution was SKIPPED
387      TEST PASSED!
388    > Executing 'TFM_PS_TEST_2003'
389      Description: 'Get handle with null handle pointer (DEPRECATED)'
390    This test is DEPRECATED and the test execution was SKIPPED
391      TEST PASSED!
392    > Executing 'TFM_PS_TEST_2004'
393      Description: 'Get attributes interface'
394      TEST PASSED!
395    > Executing 'TFM_PS_TEST_2005'
396      Description: 'Get attributes with null attributes struct pointer'
397    ....
398
399##########################
400Tool & Dependency overview
401##########################
402
403To build the TF-M firmware the following tools are needed:
404
405   - C compiler of supported toolchains
406   - CMake version 3.15 or later
407   - Git
408   - gmake, aka GNU Make
409   - Python v3.x
410   - a set of python modules listed in ``tools/requiremtns.txt``
411
412****************
413Dependency chain
414****************
415
416.. uml::
417
418   @startuml
419    skinparam state {
420      BackgroundColor #92AEE0
421      FontColor black
422      FontSize 16
423      AttributeFontColor black
424      AttributeFontSize 16
425    }
426    state fw as "Firmware" : TF-M binary
427    state c_comp as "C Compiler" : C99
428    state python as "Python" : v3.x
429
430    fw --> c_comp
431    fw --> CMake
432    CMake --> gmake
433    CMake --> Ninja
434    fw --> cryptography
435    fw --> pyasn1
436    fw --> yaml
437    fw --> jinja2
438    fw --> cbor2
439    fw --> click
440    fw --> imgtool
441    c_comp --> GCC
442    c_comp --> CLANG
443    c_comp --> IAR
444    cryptography --> python
445    pyasn1 --> python
446    yaml --> python
447    jinja2 --> python
448    cbor2 --> python
449    click --> python
450    imgtool --> python
451    kconfiglib --> python
452   @enduml
453
454.. rubric:: Next steps
455
456Here are some next steps for exploring TF-M:
457
458    - Detailed :doc:`Build instructions </building/tfm_build_instruction>`.
459    - :doc:`IAR Build instructions </building/tfm_build_instruction_iar>`.
460    - Try other :doc:`Samples and Demos </building/run_tfm_examples_on_arm_platforms>`.
461    - :doc:`Documentation generation </building/documentation_generation>`.
462
463--------------
464
465*Copyright (c) 2017-2022, Arm Limited. All rights reserved.*
466