blob: b9dace5d0b464a0aa3677a71fe34489ef7ac764e [file] [log] [blame]
Anton Komlev91281f02022-04-22 09:24:20 +01001##################
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
Anton Komlev0dbe8f12022-06-17 16:48:12 +010028 :doc:`Build instructions </building/tfm_build_instruction>`
Anton Komlev91281f02022-04-22 09:24:20 +010029 to compile and build the TF-M source.
Anton Komlev0dbe8f12022-06-17 16:48:12 +010030 - Follow the :doc:`Run TF-M examples on Arm platforms </building/run_tfm_examples_on_arm_platforms>`
Anton Komlev91281f02022-04-22 09:24:20 +010031 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#########################
Summer Qin6d5c91c2021-05-24 15:32:44 +080042
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
Anton Komlev3c785b22022-06-19 16:08:49 +0100102 set PATH=<CMake_Path>\bin;%PATH%
Summer Qin6d5c91c2021-05-24 15:32:44 +0800103
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
Summer Qin6d5c91c2021-05-24 15:32:44 +0800119 git clone https://git.trustedfirmware.org/TF-M/trusted-firmware-m.git
120
121 2. TF-M's ``tools/requirements.txt`` file declares additional Python
122 dependencies. Install them with ``pip3``:
123
124 .. code-block:: bash
125
126 pip3 install --upgrade pip
127 cd trusted-firmware-m
128 pip3 install -r tools/requirements.txt
129
130 .. group-tab:: Windows
131
132 1. get the TF-M source code:
133
134 .. code-block:: bash
135
Summer Qin6d5c91c2021-05-24 15:32:44 +0800136 git clone https://git.trustedfirmware.org/TF-M/trusted-firmware-m.git
137
138 2. TF-M's ``tools/requirements.txt`` file declares additional Python
139 dependencies. Install them with ``pip3``:
140
141 .. code-block:: bash
142
143 cd trusted-firmware-m
144 pip3 install -r tools\requirements.txt
145
146###################
147Install a toolchain
148###################
149
150To compile TF-M code, at least one of the supported compiler toolchains have to
151be available in the build environment. The currently supported compiler
152versions are:
153
Chris Brand4b381f82022-12-01 16:30:23 -0800154 - Arm Compiler v6.13 ~ v6.14, v6.18+
Summer Qin6d5c91c2021-05-24 15:32:44 +0800155
156 .. tabs::
157
158 .. group-tab:: Linux
159
160 - Download the standalone packages from `here <https://developer.arm.com/products/software-development-tools/compilers/arm-compiler/downloads/version-6>`__.
161 - Add Arm Compiler into environment:
162
163 .. code-block:: bash
164
David Hu3aca3ed2022-01-12 20:58:05 +0800165 export PATH=<ARM_CLANG_PATH>/bin:$PATH
Summer Qin6d5c91c2021-05-24 15:32:44 +0800166 export ARM_PRODUCT_PATH=<ARM_CLANG_PATH>/sw/mappings
167
David Hu3aca3ed2022-01-12 20:58:05 +0800168 - Configure proper tool variant and license.
169
Summer Qin6d5c91c2021-05-24 15:32:44 +0800170 .. group-tab:: Windows
171
172 - Download the standalone packages from `here <https://developer.arm.com/products/software-development-tools/compilers/arm-compiler/downloads/version-6>`__.
173 - Add Arm Compiler into environment:
174
175 .. code-block:: bash
176
Anton Komlev3c785b22022-06-19 16:08:49 +0100177 set PATH=<ARM_CLANG_PATH>\bin;%PATH%
Summer Qin6d5c91c2021-05-24 15:32:44 +0800178 set ARM_PRODUCT_PATH=<ARM_CLANG_PATH>\sw\mappings
179
David Hu3aca3ed2022-01-12 20:58:05 +0800180 - Configure proper tool variant and license.
181
Anton Komlevc52e2d92021-11-25 17:20:09 +0000182 .. note::
183
David Hud9baf202022-05-17 15:47:21 +0800184 Arm compiler v6.15 ~ v6.17 may cause MemManage fault.
185 This defect has been fixed since Arm compiler v6.18.
186 See [SDCOMP-59788] in Armclang v6.18 `release note`__ for details.
187
188 .. __: https://developer.arm.com/-/media/Arm%20Developer%20Community/Downloads/Arm%20Compiler%20for%20Embedded/6-18/Release%20notes%20for%20Arm%20Compiler%20for%20Embedded%206.pdf
Anton Komlevc52e2d92021-11-25 17:20:09 +0000189
Summer Qin6d5c91c2021-05-24 15:32:44 +0800190 - GNU Arm compiler v7.3.1+
191
192 .. tabs::
193
194 .. group-tab:: Linux
195
196 - Download the GNU Arm compiler from `here <https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads>`__.
197 - Add GNU Arm into environment:
198
199 .. code-block:: bash
200
201 export PATH=<GNU_ARM_PATH>/bin:$PATH
202
203 .. group-tab:: Windows
204
205 - Download the GNU Arm compiler from `here <https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads>`__.
206 - Add GNU Arm into environment:
207
208 .. code-block:: bash
209
Anton Komlev3c785b22022-06-19 16:08:49 +0100210 set PATH=<GNU_ARM_PATH>\bin;%PATH%
Summer Qin6d5c91c2021-05-24 15:32:44 +0800211
212 .. note::
213
214 GNU Arm compiler version *10-2020-q4-major* has an issue in CMSE
215 support. The bug is reported in `here <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99157>`__.
216 Select other GNU Arm compiler versions instead.
217
218 - IAR Arm compiler v8.42.x, v8.50.x
219
220 .. tabs::
221
222 .. group-tab:: Linux
223
224 - Download IAR build tools from `here <https://www.iar.com/iar-embedded-workbench/build-tools-for-linux/>`__.
225 - Add IAR Arm compiler into environment:
226
227 .. code-block:: bash
228
229 export PATH=<IAR_COMPILER_PATH>/bin:$PATH
230
231 .. group-tab:: Windows
232
233 - Download IAR build tools from `here <https://www.iar.com/iar-embedded-workbench/#!?architecture=Arm>`__.
234 - Add IAR Arm compiler into environment:
235
236 .. code-block:: bash
237
Anton Komlev3c785b22022-06-19 16:08:49 +0100238 set PATH=<IAR_COMPILER_PATH>\bin;%PATH%
Summer Qin6d5c91c2021-05-24 15:32:44 +0800239
240#############################
241Build AN521 regression sample
242#############################
243
244Here, we take building TF-M for AN521 platform with regression tests using GCC
245as an example:
246
247.. tabs::
248
249 .. group-tab:: Linux
250
Kevin Peng2d170442023-11-20 14:09:07 +0800251 Get the TF-M tests source code:
Summer Qin6d5c91c2021-05-24 15:32:44 +0800252
253 .. code-block:: bash
254
Kevin Peng2d170442023-11-20 14:09:07 +0800255 git clone https://git.trustedfirmware.org/TF-M/tf-m-tests.git
256
257 Build SPE and NSPE.
258
259 .. code-block:: bash
260
261 cd </tf-m-tests/tests_reg>
262 cmake -S spe -B build_spe -DTFM_PLATFORM=arm/mps2/an521 -DCONFIG_TFM_SOURCE_PATH=<TF-M source dir> \
263 -DCMAKE_BUILD_TYPE=Debug -DTFM_TOOLCHAIN_FILE=<Absolute path to>/toolchain_GNUARM.cmake \
264 -DTEST_S=ON -DTEST_NS=ON \
265 cmake --build build_spe -- install
266
267 cmake -S . -B build_test -DCONFIG_SPE_PATH=<absolute path to>/build_spe/api_ns \
268 -DCMAKE_BUILD_TYPE=Debug -DTFM_TOOLCHAIN_FILE=<Absolute path to>/toolchain_GNUARM.cmake
269 cmake --build build_test
Summer Qin6d5c91c2021-05-24 15:32:44 +0800270
271 .. group-tab:: Windows
272
Ken Liu6792e042023-11-13 14:48:00 +0800273 .. important::
274 Use "/" instead of "\\" when assigning Windows paths to CMAKE
275 variables, for example, use "c:/build" instead of "c:\\\\build".
276
Kevin Peng2d170442023-11-20 14:09:07 +0800277 Get the TF-M tests source code:
Summer Qin6d5c91c2021-05-24 15:32:44 +0800278
279 .. code-block:: bash
280
Kevin Peng2d170442023-11-20 14:09:07 +0800281 git clone https://git.trustedfirmware.org/TF-M/tf-m-tests.git
Summer Qin6d5c91c2021-05-24 15:32:44 +0800282
Kevin Peng2d170442023-11-20 14:09:07 +0800283 Build SPE and NSPE.
284
285 .. code-block:: bash
286
287 cd </tf-m-tests/tests_reg>
288 cmake -G"Unix Makefiles" -S spe -B build_spe -DTFM_PLATFORM=arm/mps2/an521 -DCONFIG_TFM_SOURCE_PATH=<TF-M source dir> \
289 -DCMAKE_BUILD_TYPE=Debug -DTFM_TOOLCHAIN_FILE=<Absolute path to>/toolchain_GNUARM.cmake \
290 -DTEST_S=ON -DTEST_NS=ON \
291 cmake --build build_spe -- install
292
293 cmake -G"Unix Makefiles" -S . -B build_test -DCONFIG_SPE_PATH=<absolute path to>/build_spe/api_ns \
294 -DCMAKE_BUILD_TYPE=Debug -DTFM_TOOLCHAIN_FILE=<Absolute path to>/toolchain_GNUARM.cmake
295 cmake --build build_test
Anton Komlev81506422022-02-15 21:53:13 +0000296
297 .. note::
298 The latest Windows support long paths, but if you are less lucky
299 then you can reduce paths by moving the build directory closer to
Kevin Peng2d170442023-11-20 14:09:07 +0800300 the root by changing the ``-B`` option of the commands, for example,
301 to ``C:\build_spe`` and ``C:\build_test`` folders.
Anton Komlev81506422022-02-15 21:53:13 +0000302
Summer Qin6d5c91c2021-05-24 15:32:44 +0800303###########################
304Run AN521 regression sample
305###########################
306
307Run the sample code on SSE-200 Fast-Model, using FVP_MPS2_AEMv8M provided by
308Arm Development Studio.
309
310.. note::
311
312 Arm Development Studio is not essential to develop TF-M, you can skip this
313 section if don't want to try on Arm develop boards.
314
315.. tabs::
316
317 .. group-tab:: Linux
318
319 1. install Arm Development Studio to get the fast-model.
320
321 Download Arm Development Studio from `here <https://developer.arm.com/tools-and-software/embedded/arm-development-studio>`__.
322
323 2. Add ``bl2.axf`` and ``tfm_s_ns_signed.bin`` to symbol files in Debug
324 Configuration menu.
325
326 .. code-block:: bash
327
328 <DS_PATH>/sw/models/bin/FVP_MPS2_AEMv8M \
329 --parameter fvp_mps2.platform_type=2 \
330 --parameter cpu0.baseline=0 \
331 --parameter cpu0.INITVTOR_S=0x10000000 \
332 --parameter cpu0.semihosting-enable=0 \
333 --parameter fvp_mps2.DISABLE_GATING=0 \
334 --parameter fvp_mps2.telnetterminal0.start_telnet=1 \
335 --parameter fvp_mps2.telnetterminal1.start_telnet=0 \
336 --parameter fvp_mps2.telnetterminal2.start_telnet=0 \
337 --parameter fvp_mps2.telnetterminal0.quiet=0 \
338 --parameter fvp_mps2.telnetterminal1.quiet=1 \
339 --parameter fvp_mps2.telnetterminal2.quiet=1 \
Kevin Peng2d170442023-11-20 14:09:07 +0800340 --application cpu0=<build_spe>/api_ns/bin/bl2.axf \
341 --data cpu0=<build_test>/tfm_s_ns_signed.bin@0x10080000
Summer Qin6d5c91c2021-05-24 15:32:44 +0800342
Jason Guof64dc6b2023-07-06 15:55:26 +0800343 .. note::
344
345 The log is output to telnet by default.
346 It can be also redirected to stdout by adding the following parameter.
347
348 .. code-block:: bash
349
350 --parameter fvp_mps2.UART0.out_file=/dev/stdout
351
352 To automatically terminate the fast-model when it finishes running,
353 you can add the following parameters:
354
355 .. code-block:: bash
356
357 --parameter fvp_mps2.UART0.shutdown_on_eot=1
358
Summer Qin6d5c91c2021-05-24 15:32:44 +0800359 .. group-tab:: Windows
360
361 1. install Arm Development Studio to get the fast-model.
362
363 Download Arm Development Studio from `here <https://developer.arm.com/tools-and-software/embedded/arm-development-studio>`__.
364
365 2. Add ``bl2.axf`` and ``tfm_s_ns_signed.bin`` to symbol files in Debug
366 Configuration menu.
367
368 .. code-block:: bash
369
370 <DS_PATH>\sw\models\bin\FVP_MPS2_AEMv8M \
371 --parameter fvp_mps2.platform_type=2 \
372 --parameter cpu0.baseline=0 \
373 --parameter cpu0.INITVTOR_S=0x10000000 \
374 --parameter cpu0.semihosting-enable=0 \
375 --parameter fvp_mps2.DISABLE_GATING=0 \
376 --parameter fvp_mps2.telnetterminal0.start_telnet=1 \
377 --parameter fvp_mps2.telnetterminal1.start_telnet=0 \
378 --parameter fvp_mps2.telnetterminal2.start_telnet=0 \
379 --parameter fvp_mps2.telnetterminal0.quiet=0 \
380 --parameter fvp_mps2.telnetterminal1.quiet=1 \
381 --parameter fvp_mps2.telnetterminal2.quiet=1 \
Kevin Peng2d170442023-11-20 14:09:07 +0800382 --application cpu0=<build_spe>/api_ns/bin/bl2.axf \
383 --data cpu0=<build_test>/tfm_s_ns_signed.bin@0x10080000
Summer Qin6d5c91c2021-05-24 15:32:44 +0800384
Jason Guof64dc6b2023-07-06 15:55:26 +0800385 .. note::
386
387 To automatically terminate the fast-model when it finishes running,
388 you can add the following parameters:
389
390 .. code-block:: bash
391
392 --parameter fvp_mps2.UART0.shutdown_on_eot=1
393
Summer Qin6d5c91c2021-05-24 15:32:44 +0800394After completing the procedure you should see the following messages on the
395DAPLink UART (baud 115200 8n1)::
396
Kevin Peng2d170442023-11-20 14:09:07 +0800397 ...
398 #### Execute test suites for the Secure area ####
399 Running Test Suite PSA protected storage S interface tests (TFM_S_PS_TEST_1XXX)...
400 > Executing 'TFM_S_PS_TEST_1001'
401 Description: 'Set interface'
402 TEST: TFM_S_PS_TEST_1001 - PASSED!
403 > Executing 'TFM_S_PS_TEST_1002'
404 Description: 'Set interface with create flags'
405 TEST: TFM_S_PS_TEST_1002 - PASSED!
406 > Executing 'TFM_S_PS_TEST_1003'
407 Description: 'Set interface with NULL data pointer'
408 TEST: TFM_S_PS_TEST_1003 - PASSED!
409 > Executing 'TFM_S_PS_TEST_1005'
410 Description: 'Set interface with write once UID'
411 TEST: TFM_S_PS_TEST_1005 - PASSED!
Summer Qin6d5c91c2021-05-24 15:32:44 +0800412 ....
413
414##########################
415Tool & Dependency overview
416##########################
417
418To build the TF-M firmware the following tools are needed:
419
Anton Komlev4c436bf2021-10-18 21:59:55 +0100420 - C compiler of supported toolchains
421 - CMake version 3.15 or later
422 - Git
423 - gmake, aka GNU Make
424 - Python v3.x
425 - a set of python modules listed in ``tools/requiremtns.txt``
Summer Qin6d5c91c2021-05-24 15:32:44 +0800426
Anton Komlev91281f02022-04-22 09:24:20 +0100427****************
Anton Komlev4c436bf2021-10-18 21:59:55 +0100428Dependency chain
Anton Komlev91281f02022-04-22 09:24:20 +0100429****************
Summer Qin6d5c91c2021-05-24 15:32:44 +0800430
431.. uml::
432
433 @startuml
434 skinparam state {
435 BackgroundColor #92AEE0
436 FontColor black
437 FontSize 16
438 AttributeFontColor black
439 AttributeFontSize 16
Summer Qin6d5c91c2021-05-24 15:32:44 +0800440 }
441 state fw as "Firmware" : TF-M binary
442 state c_comp as "C Compiler" : C99
Anton Komlev4c436bf2021-10-18 21:59:55 +0100443 state python as "Python" : v3.x
Summer Qin6d5c91c2021-05-24 15:32:44 +0800444
Summer Qin6d5c91c2021-05-24 15:32:44 +0800445 fw --> c_comp
446 fw --> CMake
447 CMake --> gmake
Anton Komlev4c436bf2021-10-18 21:59:55 +0100448 CMake --> Ninja
Summer Qin6d5c91c2021-05-24 15:32:44 +0800449 fw --> cryptography
450 fw --> pyasn1
451 fw --> yaml
452 fw --> jinja2
Ross Burton5ba82392021-11-10 16:56:10 +0000453 fw --> cbor2
Summer Qin6d5c91c2021-05-24 15:32:44 +0800454 fw --> click
455 fw --> imgtool
Anton Komlev4c436bf2021-10-18 21:59:55 +0100456 c_comp --> GCC
457 c_comp --> CLANG
458 c_comp --> IAR
459 cryptography --> python
460 pyasn1 --> python
461 yaml --> python
462 jinja2 --> python
Ross Burton5ba82392021-11-10 16:56:10 +0000463 cbor2 --> python
Anton Komlev4c436bf2021-10-18 21:59:55 +0100464 click --> python
465 imgtool --> python
Jianliang Shendfddc982022-11-29 15:08:19 +0800466 kconfiglib --> python
Summer Qin6d5c91c2021-05-24 15:32:44 +0800467 @enduml
468
Anton Komlev91281f02022-04-22 09:24:20 +0100469.. rubric:: Next steps
Summer Qin6d5c91c2021-05-24 15:32:44 +0800470
471Here are some next steps for exploring TF-M:
472
Anton Komlev0dbe8f12022-06-17 16:48:12 +0100473 - Detailed :doc:`Build instructions </building/tfm_build_instruction>`.
474 - :doc:`IAR Build instructions </building/tfm_build_instruction_iar>`.
475 - Try other :doc:`Samples and Demos </building/run_tfm_examples_on_arm_platforms>`.
476 - :doc:`Documentation generation </building/documentation_generation>`.
Summer Qin6d5c91c2021-05-24 15:32:44 +0800477
478--------------
479
David Hu3aca3ed2022-01-12 20:58:05 +0800480*Copyright (c) 2017-2022, Arm Limited. All rights reserved.*
Chris Brand4b381f82022-12-01 16:30:23 -0800481*Copyright (c) 2022 Cypress Semiconductor Corporation (an Infineon company)
482or an affiliate of Cypress Semiconductor Corporation. All rights reserved.*