blob: a11de469f75dde803eb6cad2110305be8bd8d505 [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
344 .. group-tab:: Windows
345
346 1. install Arm Development Studio to get the fast-model.
347
348 Download Arm Development Studio from `here <https://developer.arm.com/tools-and-software/embedded/arm-development-studio>`__.
349
350 2. Add ``bl2.axf`` and ``tfm_s_ns_signed.bin`` to symbol files in Debug
351 Configuration menu.
352
353 .. code-block:: bash
354
355 <DS_PATH>\sw\models\bin\FVP_MPS2_AEMv8M \
356 --parameter fvp_mps2.platform_type=2 \
357 --parameter cpu0.baseline=0 \
358 --parameter cpu0.INITVTOR_S=0x10000000 \
359 --parameter cpu0.semihosting-enable=0 \
360 --parameter fvp_mps2.DISABLE_GATING=0 \
361 --parameter fvp_mps2.telnetterminal0.start_telnet=1 \
362 --parameter fvp_mps2.telnetterminal1.start_telnet=0 \
363 --parameter fvp_mps2.telnetterminal2.start_telnet=0 \
364 --parameter fvp_mps2.telnetterminal0.quiet=0 \
365 --parameter fvp_mps2.telnetterminal1.quiet=1 \
366 --parameter fvp_mps2.telnetterminal2.quiet=1 \
367 --application cpu0=<build_dir>/bin/bl2.axf \
368 --data cpu0=<build_dir>/bin/tfm_s_ns_signed.bin@0x10080000
369
370After completing the procedure you should see the following messages on the
371DAPLink UART (baud 115200 8n1)::
372
373 [INF] Starting bootloader
374 [INF] Image 0: magic=good, copy_done=0xff, image_ok=0xff
375 [INF] Scratch: magic=bad, copy_done=0x5, image_ok=0x9
376 [INF] Boot source: primary slot
377 [INF] Swap type: none
378 [INF] Bootloader chainload address offset: 0x20000
379 [INF] Jumping to the first image slot
380 [Sec Thread] Secure image initializing!
381
382 #### Execute test suites for the protected storage service ####
383 Running Test Suite PS secure interface tests (TFM_PS_TEST_2XXX)...
384 > Executing 'TFM_PS_TEST_2001'
385 Description: 'Create interface'
386 TEST PASSED!
387 > Executing 'TFM_PS_TEST_2002'
388 Description: 'Get handle interface (DEPRECATED)'
389 This test is DEPRECATED and the test execution was SKIPPED
390 TEST PASSED!
391 > Executing 'TFM_PS_TEST_2003'
392 Description: 'Get handle with null handle pointer (DEPRECATED)'
393 This test is DEPRECATED and the test execution was SKIPPED
394 TEST PASSED!
395 > Executing 'TFM_PS_TEST_2004'
396 Description: 'Get attributes interface'
397 TEST PASSED!
398 > Executing 'TFM_PS_TEST_2005'
399 Description: 'Get attributes with null attributes struct pointer'
400 ....
401
402##########################
403Tool & Dependency overview
404##########################
405
406To build the TF-M firmware the following tools are needed:
407
Anton Komlev4c436bf2021-10-18 21:59:55 +0100408 - C compiler of supported toolchains
409 - CMake version 3.15 or later
410 - Git
411 - gmake, aka GNU Make
412 - Python v3.x
413 - a set of python modules listed in ``tools/requiremtns.txt``
Summer Qin6d5c91c2021-05-24 15:32:44 +0800414
Anton Komlev91281f02022-04-22 09:24:20 +0100415****************
Anton Komlev4c436bf2021-10-18 21:59:55 +0100416Dependency chain
Anton Komlev91281f02022-04-22 09:24:20 +0100417****************
Summer Qin6d5c91c2021-05-24 15:32:44 +0800418
419.. uml::
420
421 @startuml
422 skinparam state {
423 BackgroundColor #92AEE0
424 FontColor black
425 FontSize 16
426 AttributeFontColor black
427 AttributeFontSize 16
Summer Qin6d5c91c2021-05-24 15:32:44 +0800428 }
429 state fw as "Firmware" : TF-M binary
430 state c_comp as "C Compiler" : C99
Anton Komlev4c436bf2021-10-18 21:59:55 +0100431 state python as "Python" : v3.x
Summer Qin6d5c91c2021-05-24 15:32:44 +0800432
Summer Qin6d5c91c2021-05-24 15:32:44 +0800433 fw --> c_comp
434 fw --> CMake
435 CMake --> gmake
Anton Komlev4c436bf2021-10-18 21:59:55 +0100436 CMake --> Ninja
Summer Qin6d5c91c2021-05-24 15:32:44 +0800437 fw --> cryptography
438 fw --> pyasn1
439 fw --> yaml
440 fw --> jinja2
Ross Burton5ba82392021-11-10 16:56:10 +0000441 fw --> cbor2
Summer Qin6d5c91c2021-05-24 15:32:44 +0800442 fw --> click
443 fw --> imgtool
Anton Komlev4c436bf2021-10-18 21:59:55 +0100444 c_comp --> GCC
445 c_comp --> CLANG
446 c_comp --> IAR
447 cryptography --> python
448 pyasn1 --> python
449 yaml --> python
450 jinja2 --> python
Ross Burton5ba82392021-11-10 16:56:10 +0000451 cbor2 --> python
Anton Komlev4c436bf2021-10-18 21:59:55 +0100452 click --> python
453 imgtool --> python
Jianliang Shendfddc982022-11-29 15:08:19 +0800454 kconfiglib --> python
Summer Qin6d5c91c2021-05-24 15:32:44 +0800455 @enduml
456
Anton Komlev91281f02022-04-22 09:24:20 +0100457.. rubric:: Next steps
Summer Qin6d5c91c2021-05-24 15:32:44 +0800458
459Here are some next steps for exploring TF-M:
460
Anton Komlev0dbe8f12022-06-17 16:48:12 +0100461 - Detailed :doc:`Build instructions </building/tfm_build_instruction>`.
462 - :doc:`IAR Build instructions </building/tfm_build_instruction_iar>`.
463 - Try other :doc:`Samples and Demos </building/run_tfm_examples_on_arm_platforms>`.
464 - :doc:`Documentation generation </building/documentation_generation>`.
Summer Qin6d5c91c2021-05-24 15:32:44 +0800465
466--------------
467
David Hu3aca3ed2022-01-12 20:58:05 +0800468*Copyright (c) 2017-2022, Arm Limited. All rights reserved.*
Chris Brand4b381f82022-12-01 16:30:23 -0800469*Copyright (c) 2022 Cypress Semiconductor Corporation (an Infineon company)
470or an affiliate of Cypress Semiconductor Corporation. All rights reserved.*