blob: 88a786a363ccad845194b6325722ea0321fb874b [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
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
Chris Brand4b381f82022-12-01 16:30:23 -0800156 - Arm Compiler v6.13 ~ v6.14, v6.18+
Summer Qin6d5c91c2021-05-24 15:32:44 +0800157
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
David Hu3aca3ed2022-01-12 20:58:05 +0800167 export PATH=<ARM_CLANG_PATH>/bin:$PATH
Summer Qin6d5c91c2021-05-24 15:32:44 +0800168 export ARM_PRODUCT_PATH=<ARM_CLANG_PATH>/sw/mappings
169
David Hu3aca3ed2022-01-12 20:58:05 +0800170 - Configure proper tool variant and license.
171
Summer Qin6d5c91c2021-05-24 15:32:44 +0800172 .. 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
Anton Komlev3c785b22022-06-19 16:08:49 +0100179 set PATH=<ARM_CLANG_PATH>\bin;%PATH%
Summer Qin6d5c91c2021-05-24 15:32:44 +0800180 set ARM_PRODUCT_PATH=<ARM_CLANG_PATH>\sw\mappings
181
David Hu3aca3ed2022-01-12 20:58:05 +0800182 - Configure proper tool variant and license.
183
Anton Komlevc52e2d92021-11-25 17:20:09 +0000184 .. note::
185
David Hud9baf202022-05-17 15:47:21 +0800186 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
Anton Komlevc52e2d92021-11-25 17:20:09 +0000191
Summer Qin6d5c91c2021-05-24 15:32:44 +0800192 - 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
Anton Komlev3c785b22022-06-19 16:08:49 +0100212 set PATH=<GNU_ARM_PATH>\bin;%PATH%
Summer Qin6d5c91c2021-05-24 15:32:44 +0800213
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
Summer Qinb0d4a022023-03-16 15:42:18 +0800220 GNU Arm compiler version greater and equal than *11.3.Rel1* has a linker issue in syscall.
221 Select other GNU Arm compiler versions instead.
222
Summer Qin6d5c91c2021-05-24 15:32:44 +0800223 - IAR Arm compiler v8.42.x, v8.50.x
224
225 .. tabs::
226
227 .. group-tab:: Linux
228
229 - Download IAR build tools from `here <https://www.iar.com/iar-embedded-workbench/build-tools-for-linux/>`__.
230 - Add IAR Arm compiler into environment:
231
232 .. code-block:: bash
233
234 export PATH=<IAR_COMPILER_PATH>/bin:$PATH
235
236 .. group-tab:: Windows
237
238 - Download IAR build tools from `here <https://www.iar.com/iar-embedded-workbench/#!?architecture=Arm>`__.
239 - Add IAR Arm compiler into environment:
240
241 .. code-block:: bash
242
Anton Komlev3c785b22022-06-19 16:08:49 +0100243 set PATH=<IAR_COMPILER_PATH>\bin;%PATH%
Summer Qin6d5c91c2021-05-24 15:32:44 +0800244
245#############################
246Build AN521 regression sample
247#############################
248
249Here, we take building TF-M for AN521 platform with regression tests using GCC
250as an example:
251
252.. tabs::
253
254 .. group-tab:: Linux
255
256 .. code-block:: bash
257
258 cd trusted-firmware-m
259 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
260 cmake --build cmake_build -- install
261
262 Alternately using traditional cmake syntax
263
264 .. code-block:: bash
265
266 cd trusted-firmware-m
267 mkdir cmake_build
268 cd cmake_build
269 cmake .. -DTFM_PLATFORM=arm/mps2/an521 -DTFM_TOOLCHAIN_FILE=../toolchain_GNUARM.cmake -DTEST_S=ON -DTEST_NS=ON
270 make install
271
272 .. group-tab:: Windows
273
274 .. code-block:: bash
275
276 cd trusted-firmware-m
277 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
278 cmake --build cmake_build -- install
279
280 Alternately using traditional cmake syntax
281
282 .. code-block:: bash
283
284 cd trusted-firmware-m
285 mkdir cmake_build
286 cd cmake_build
287 cmake -G"Unix Makefiles" .. -DTFM_PLATFORM=arm/mps2/an521 -DTFM_TOOLCHAIN_FILE=../toolchain_GNUARM.cmake -DTEST_S=ON -DTEST_NS=ON
288 make install
289
Anton Komlev81506422022-02-15 21:53:13 +0000290
291 .. note::
292 The latest Windows support long paths, but if you are less lucky
293 then you can reduce paths by moving the build directory closer to
294 the root, using the 'out of tree' build.
295 For example to build in ``C:\build`` folder you can:
296
297 .. code-block:: bash
298
299 cd trusted-firmware-m
300 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
301 cmake --build C:/build -- install
302
303
Summer Qin6d5c91c2021-05-24 15:32:44 +0800304###########################
305Run AN521 regression sample
306###########################
307
308Run the sample code on SSE-200 Fast-Model, using FVP_MPS2_AEMv8M provided by
309Arm Development Studio.
310
311.. note::
312
313 Arm Development Studio is not essential to develop TF-M, you can skip this
314 section if don't want to try on Arm develop boards.
315
316.. tabs::
317
318 .. group-tab:: Linux
319
320 1. install Arm Development Studio to get the fast-model.
321
322 Download Arm Development Studio from `here <https://developer.arm.com/tools-and-software/embedded/arm-development-studio>`__.
323
324 2. Add ``bl2.axf`` and ``tfm_s_ns_signed.bin`` to symbol files in Debug
325 Configuration menu.
326
327 .. code-block:: bash
328
329 <DS_PATH>/sw/models/bin/FVP_MPS2_AEMv8M \
330 --parameter fvp_mps2.platform_type=2 \
331 --parameter cpu0.baseline=0 \
332 --parameter cpu0.INITVTOR_S=0x10000000 \
333 --parameter cpu0.semihosting-enable=0 \
334 --parameter fvp_mps2.DISABLE_GATING=0 \
335 --parameter fvp_mps2.telnetterminal0.start_telnet=1 \
336 --parameter fvp_mps2.telnetterminal1.start_telnet=0 \
337 --parameter fvp_mps2.telnetterminal2.start_telnet=0 \
338 --parameter fvp_mps2.telnetterminal0.quiet=0 \
339 --parameter fvp_mps2.telnetterminal1.quiet=1 \
340 --parameter fvp_mps2.telnetterminal2.quiet=1 \
341 --application cpu0=<build_dir>/bin/bl2.axf \
342 --data cpu0=<build_dir>/bin/tfm_s_ns_signed.bin@0x10080000
343
Jason Guof64dc6b2023-07-06 15:55:26 +0800344 .. note::
345
346 The log is output to telnet by default.
347 It can be also redirected to stdout by adding the following parameter.
348
349 .. code-block:: bash
350
351 --parameter fvp_mps2.UART0.out_file=/dev/stdout
352
353 To automatically terminate the fast-model when it finishes running,
354 you can add the following parameters:
355
356 .. code-block:: bash
357
358 --parameter fvp_mps2.UART0.shutdown_on_eot=1
359
Summer Qin6d5c91c2021-05-24 15:32:44 +0800360 .. group-tab:: Windows
361
362 1. install Arm Development Studio to get the fast-model.
363
364 Download Arm Development Studio from `here <https://developer.arm.com/tools-and-software/embedded/arm-development-studio>`__.
365
366 2. Add ``bl2.axf`` and ``tfm_s_ns_signed.bin`` to symbol files in Debug
367 Configuration menu.
368
369 .. code-block:: bash
370
371 <DS_PATH>\sw\models\bin\FVP_MPS2_AEMv8M \
372 --parameter fvp_mps2.platform_type=2 \
373 --parameter cpu0.baseline=0 \
374 --parameter cpu0.INITVTOR_S=0x10000000 \
375 --parameter cpu0.semihosting-enable=0 \
376 --parameter fvp_mps2.DISABLE_GATING=0 \
377 --parameter fvp_mps2.telnetterminal0.start_telnet=1 \
378 --parameter fvp_mps2.telnetterminal1.start_telnet=0 \
379 --parameter fvp_mps2.telnetterminal2.start_telnet=0 \
380 --parameter fvp_mps2.telnetterminal0.quiet=0 \
381 --parameter fvp_mps2.telnetterminal1.quiet=1 \
382 --parameter fvp_mps2.telnetterminal2.quiet=1 \
383 --application cpu0=<build_dir>/bin/bl2.axf \
384 --data cpu0=<build_dir>/bin/tfm_s_ns_signed.bin@0x10080000
385
Jason Guof64dc6b2023-07-06 15:55:26 +0800386 .. note::
387
388 To automatically terminate the fast-model when it finishes running,
389 you can add the following parameters:
390
391 .. code-block:: bash
392
393 --parameter fvp_mps2.UART0.shutdown_on_eot=1
394
Summer Qin6d5c91c2021-05-24 15:32:44 +0800395After completing the procedure you should see the following messages on the
396DAPLink UART (baud 115200 8n1)::
397
398 [INF] Starting bootloader
399 [INF] Image 0: magic=good, copy_done=0xff, image_ok=0xff
400 [INF] Scratch: magic=bad, copy_done=0x5, image_ok=0x9
401 [INF] Boot source: primary slot
402 [INF] Swap type: none
403 [INF] Bootloader chainload address offset: 0x20000
404 [INF] Jumping to the first image slot
405 [Sec Thread] Secure image initializing!
406
407 #### Execute test suites for the protected storage service ####
408 Running Test Suite PS secure interface tests (TFM_PS_TEST_2XXX)...
409 > Executing 'TFM_PS_TEST_2001'
410 Description: 'Create interface'
411 TEST PASSED!
412 > Executing 'TFM_PS_TEST_2002'
413 Description: 'Get handle interface (DEPRECATED)'
414 This test is DEPRECATED and the test execution was SKIPPED
415 TEST PASSED!
416 > Executing 'TFM_PS_TEST_2003'
417 Description: 'Get handle with null handle pointer (DEPRECATED)'
418 This test is DEPRECATED and the test execution was SKIPPED
419 TEST PASSED!
420 > Executing 'TFM_PS_TEST_2004'
421 Description: 'Get attributes interface'
422 TEST PASSED!
423 > Executing 'TFM_PS_TEST_2005'
424 Description: 'Get attributes with null attributes struct pointer'
425 ....
426
427##########################
428Tool & Dependency overview
429##########################
430
431To build the TF-M firmware the following tools are needed:
432
Anton Komlev4c436bf2021-10-18 21:59:55 +0100433 - C compiler of supported toolchains
434 - CMake version 3.15 or later
435 - Git
436 - gmake, aka GNU Make
437 - Python v3.x
438 - a set of python modules listed in ``tools/requiremtns.txt``
Summer Qin6d5c91c2021-05-24 15:32:44 +0800439
Anton Komlev91281f02022-04-22 09:24:20 +0100440****************
Anton Komlev4c436bf2021-10-18 21:59:55 +0100441Dependency chain
Anton Komlev91281f02022-04-22 09:24:20 +0100442****************
Summer Qin6d5c91c2021-05-24 15:32:44 +0800443
444.. uml::
445
446 @startuml
447 skinparam state {
448 BackgroundColor #92AEE0
449 FontColor black
450 FontSize 16
451 AttributeFontColor black
452 AttributeFontSize 16
Summer Qin6d5c91c2021-05-24 15:32:44 +0800453 }
454 state fw as "Firmware" : TF-M binary
455 state c_comp as "C Compiler" : C99
Anton Komlev4c436bf2021-10-18 21:59:55 +0100456 state python as "Python" : v3.x
Summer Qin6d5c91c2021-05-24 15:32:44 +0800457
Summer Qin6d5c91c2021-05-24 15:32:44 +0800458 fw --> c_comp
459 fw --> CMake
460 CMake --> gmake
Anton Komlev4c436bf2021-10-18 21:59:55 +0100461 CMake --> Ninja
Summer Qin6d5c91c2021-05-24 15:32:44 +0800462 fw --> cryptography
463 fw --> pyasn1
464 fw --> yaml
465 fw --> jinja2
Ross Burton5ba82392021-11-10 16:56:10 +0000466 fw --> cbor2
Summer Qin6d5c91c2021-05-24 15:32:44 +0800467 fw --> click
468 fw --> imgtool
Anton Komlev4c436bf2021-10-18 21:59:55 +0100469 c_comp --> GCC
470 c_comp --> CLANG
471 c_comp --> IAR
472 cryptography --> python
473 pyasn1 --> python
474 yaml --> python
475 jinja2 --> python
Ross Burton5ba82392021-11-10 16:56:10 +0000476 cbor2 --> python
Anton Komlev4c436bf2021-10-18 21:59:55 +0100477 click --> python
478 imgtool --> python
Jianliang Shendfddc982022-11-29 15:08:19 +0800479 kconfiglib --> python
Summer Qin6d5c91c2021-05-24 15:32:44 +0800480 @enduml
481
Anton Komlev91281f02022-04-22 09:24:20 +0100482.. rubric:: Next steps
Summer Qin6d5c91c2021-05-24 15:32:44 +0800483
484Here are some next steps for exploring TF-M:
485
Anton Komlev0dbe8f12022-06-17 16:48:12 +0100486 - Detailed :doc:`Build instructions </building/tfm_build_instruction>`.
487 - :doc:`IAR Build instructions </building/tfm_build_instruction_iar>`.
488 - Try other :doc:`Samples and Demos </building/run_tfm_examples_on_arm_platforms>`.
489 - :doc:`Documentation generation </building/documentation_generation>`.
Summer Qin6d5c91c2021-05-24 15:32:44 +0800490
491--------------
492
David Hu3aca3ed2022-01-12 20:58:05 +0800493*Copyright (c) 2017-2022, Arm Limited. All rights reserved.*
Chris Brand4b381f82022-12-01 16:30:23 -0800494*Copyright (c) 2022 Cypress Semiconductor Corporation (an Infineon company)
495or an affiliate of Cypress Semiconductor Corporation. All rights reserved.*