blob: bd2934d22f181475bfecc68cfc92a1643dfc6f2c [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
David Hud9baf202022-05-17 15:47:21 +0800156 - Arm Compiler v6.10.1 ~ 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
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
Anton Komlev3c785b22022-06-19 16:08:49 +0100240 set PATH=<IAR_COMPILER_PATH>\bin;%PATH%
Summer Qin6d5c91c2021-05-24 15:32:44 +0800241
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
Anton Komlev81506422022-02-15 21:53:13 +0000287
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
Summer Qin6d5c91c2021-05-24 15:32:44 +0800301###########################
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
Anton Komlev4c436bf2021-10-18 21:59:55 +0100405 - 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``
Summer Qin6d5c91c2021-05-24 15:32:44 +0800411
Anton Komlev91281f02022-04-22 09:24:20 +0100412****************
Anton Komlev4c436bf2021-10-18 21:59:55 +0100413Dependency chain
Anton Komlev91281f02022-04-22 09:24:20 +0100414****************
Summer Qin6d5c91c2021-05-24 15:32:44 +0800415
416.. uml::
417
418 @startuml
419 skinparam state {
420 BackgroundColor #92AEE0
421 FontColor black
422 FontSize 16
423 AttributeFontColor black
424 AttributeFontSize 16
Summer Qin6d5c91c2021-05-24 15:32:44 +0800425 }
426 state fw as "Firmware" : TF-M binary
427 state c_comp as "C Compiler" : C99
Anton Komlev4c436bf2021-10-18 21:59:55 +0100428 state python as "Python" : v3.x
Summer Qin6d5c91c2021-05-24 15:32:44 +0800429
Summer Qin6d5c91c2021-05-24 15:32:44 +0800430 fw --> c_comp
431 fw --> CMake
432 CMake --> gmake
Anton Komlev4c436bf2021-10-18 21:59:55 +0100433 CMake --> Ninja
Summer Qin6d5c91c2021-05-24 15:32:44 +0800434 fw --> cryptography
435 fw --> pyasn1
436 fw --> yaml
437 fw --> jinja2
Ross Burton5ba82392021-11-10 16:56:10 +0000438 fw --> cbor2
Summer Qin6d5c91c2021-05-24 15:32:44 +0800439 fw --> click
440 fw --> imgtool
Anton Komlev4c436bf2021-10-18 21:59:55 +0100441 c_comp --> GCC
442 c_comp --> CLANG
443 c_comp --> IAR
444 cryptography --> python
445 pyasn1 --> python
446 yaml --> python
447 jinja2 --> python
Ross Burton5ba82392021-11-10 16:56:10 +0000448 cbor2 --> python
Anton Komlev4c436bf2021-10-18 21:59:55 +0100449 click --> python
450 imgtool --> python
Jianliang Shendfddc982022-11-29 15:08:19 +0800451 kconfiglib --> python
Summer Qin6d5c91c2021-05-24 15:32:44 +0800452 @enduml
453
Anton Komlev91281f02022-04-22 09:24:20 +0100454.. rubric:: Next steps
Summer Qin6d5c91c2021-05-24 15:32:44 +0800455
456Here are some next steps for exploring TF-M:
457
Anton Komlev0dbe8f12022-06-17 16:48:12 +0100458 - 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>`.
Summer Qin6d5c91c2021-05-24 15:32:44 +0800462
463--------------
464
David Hu3aca3ed2022-01-12 20:58:05 +0800465*Copyright (c) 2017-2022, Arm Limited. All rights reserved.*