blob: 589edf5c9a51296902840e9eca0971c67da92809 [file] [log] [blame]
Anton Komlev91281f02022-04-22 09:24:20 +01001#################
Summer Qinabf66982021-04-06 17:22:15 +08002Integration Guide
Anton Komlev91281f02022-04-22 09:24:20 +01003#################
4The purpose of this document is to provide a guide on how to integrate TF-M
5with other hardware platforms and operating systems.
6
Minos Galanakise4094012020-06-12 14:25:34 +01007.. toctree::
8 :maxdepth: 1
Minos Galanakise4094012020-06-12 14:25:34 +01009
Anton Komleve69cf682023-01-31 11:59:25 +000010 Source Structure <source_structure/index>
11 SPM Backends <spm_backends.rst>
12 NS client integration <non-secure_client_extension_integration_guide.rst>
Anton Komlev91281f02022-04-22 09:24:20 +010013 OS migration to Armv8-M <os_migration_guide_armv8m.rst>
Anton Komleve69cf682023-01-31 11:59:25 +000014 Floating-Point Support <tfm_fpu_support.rst>
15 Secure Interrupt <tfm_secure_irq_integration_guide.rst>
16 Platform Provisioning <platform_provisioning.rst>
Anton Komlev91281f02022-04-22 09:24:20 +010017
18.. toctree::
19 :maxdepth: 2
20
21 platform/index
22 services/index
23
Anton Komlev91281f02022-04-22 09:24:20 +010024*****************
25How to build TF-M
26*****************
Anton Komlev0dbe8f12022-06-17 16:48:12 +010027Follow the :doc:`Build instructions </building/tfm_build_instruction>`.
Anton Komlev91281f02022-04-22 09:24:20 +010028
29********************************************************
30How to export files for building non-secure applications
31********************************************************
Anton Komlev0dbe8f12022-06-17 16:48:12 +010032Explained in the :doc:`Build instructions </building/tfm_build_instruction>`.
Anton Komlev91281f02022-04-22 09:24:20 +010033
34*************************
35How to add a new platform
36*************************
37
Antonio de Angelis671c9712023-02-15 22:40:32 +000038:doc:`Porting TF-M to a New Hardware </integration_guide/platform/porting_tfm_to_a_new_hardware>`
Anton Komlev91281f02022-04-22 09:24:20 +010039contains guidance on how to add a new platform.
40
41***************************
42How to integrate another OS
43***************************
44
45OS migration to Armv8-M platforms
46=================================
47To work with TF-M on Armv8-M platforms, the OS needs to support the Armv8-M
48architecture and, in particular, it needs to be able to run in the non-secure
49world. More information about OS migration to the Armv8-M architecture can be
50found in the :doc:`OS requirements <os_migration_guide_armv8m>`. Depending upon
51the system configuration this may require configuring drivers to use appropriate
52address ranges.
53
54Interface with TF-M
55===================
56The files needed for the interface with TF-M are exported at the
57``<install_dir>/interface`` path. The NS side is only allowed to call
58TF-M secure functions (veneers) from the NS Thread mode.
59
60TF-M interface header files are exported in ``<install_dir>/interface/include``
61directory. For example, the Protected Storage (PS) service PSA API is declared
62in the file ``<install_dir>/interface/include/psa/protected_storage.h``.
63
64TF-M also exports a reference implementation of PSA APIs for NS clients in the
65``<install_dir>/interface/src``.
66
BohdanHunkof871df02023-02-03 14:36:41 +020067On Armv8-M TrustZone based platforms, NS OS uses ``tfm_ns_interface_dispatch()``
68to integrate with TF-M implementation of PSA APIs. TF-M provides a reference
69implementation of this function for RTOS and bare metal use cases.
70RTOS implementation of ``tfm_ns_interface_dispatch()`` (provided in
71``interface\src\os_wrapper\tfm_ns_interface_rtos.c``) uses mutex to provide
72multithread safety. Mutex wrapper functions defined in
73``interface/include/os_wrapper/mutex.h`` are expected to be provided by NS RTOS.
74When reference RTOS implementation of dispatch function is used NS application
75should call ``tfm_ns_interface_init()`` function before first PSA API call.
76Bare metal implementation ``tfm_ns_interface_dispatch()`` (provided in
77``interface\src\os_wrapper\tfm_ns_interface_bare_metal.c``) does not
78provide multithread safety and does not require implementation of mutex
79interface.
80If needed, instead of using reference implementation, NS application may provide
81its own implementation of ``tfm_ns_interface_dispatch()`` function.
Anton Komlev91281f02022-04-22 09:24:20 +010082
83TF-M provides a reference implementation of NS mailbox on multi-core platforms,
84under folder ``interface/src/multi_core``.
Anton Komlevff7cbae2023-01-12 16:28:26 +000085See :doc:`Mailbox design </design_docs/dual-cpu/mailbox_design_on_dual_core_system>`
Anton Komlev91281f02022-04-22 09:24:20 +010086for TF-M multi-core mailbox design.
87
88Interface with non-secure world regression tests
89================================================
90A non-secure application that wants to run the non-secure regression tests
91needs to call the ``tfm_non_secure_client_run_tests()``. This function is
92exported into the header file ``test_framework_integ_test.h`` inside the
93``<build_dir>/install`` folder structure in the test specific files,
94i.e. ``<build_dir>/install/export/tfm/test/inc``. The non-secure regression
95tests are precompiled and delivered as a static library which is available in
96``<build_dir>/install/export/tfm/test/lib``, so that the non-secure application
97needs to link against the library to be able to invoke the
98``tfm_non_secure_client_run_tests()`` function. The PS non-secure side
99regression tests rely on some OS functionality e.g. threads, mutexes etc. These
100functions comply with CMSIS RTOS2 standard and have been exported as thin
101wrappers defined in ``os_wrapper.h`` contained in
102``<build_dir>/install/export/tfm/test/inc``. OS needs to provide the
103implementation of these wrappers to be able to run the tests.
104
105NS client Identification
106========================
107
108The NS client identification (NSID) is specified by either SPM or NSPE RTOS.
109If SPM manages the NSID (default option), then the same NSID (-1) will be used
110for all connections from NS clients.
111For the case that NSPE RTOS manages the NSID and/or different NSIDs should be
112used for different NS clients. See
113:doc:`Non-secure Client Extension Integration Guide </integration_guide/non-secure_client_extension_integration_guide>`.
114
115*********************
116Non-secure interrupts
117*********************
118Non-secure interrupts are allowed to preempt Secure thread mode.
119With the current implementation, a NSPE task can spoof the identity of another
120NSPE task. This is an issue only when NSPE has provisions for task isolation.
121Note, that ``AIRCR.PRIS`` is still set to restrict the priority range available
122to NS interrupts to the lower half of available priorities so that it wouldn't
123be possible for any non-secure interrupt to preempt a higher-priority secure
124interrupt.
125
Chris Brand80326b72023-03-15 13:07:49 -0700126********************************
127Secure interrupts and scheduling
128********************************
129To ensure correct operation in the general case, the secure scheduler is not
130run after handling a secure interrupt that pre-empted the NSPE. On systems
131with specific constraints, it may be desirable to run the scheduler in this
132situation, which can be done by setting
133``CONFIG_TFM_SCHEDULE_WHEN_NS_INTERRUPTED`` to 1. This could be done if the
134NSPE is known to be a simple, single-threaded application or if non-secure
135interrupts cannot pre-empt the SPE, for example.
136
Anton Komlev91281f02022-04-22 09:24:20 +0100137**********************************
138Integration with non-Cmake systems
139**********************************
140
141Generated Files
142===============
143
144Files that are derived from PSA manifests are generated at build-time by cmake.
145For integration with systems that do no use cmake, the files must be generated
146manually.
147
148The ``tools/tfm_parse_manifest_list.py`` script can be invoked manually. Some
149arguments will be needed to be provided. Please refer to
150``tfm_parse_manifest_list.py --help`` for more details.
151
152Some variables are used in the template files, these will need to be set in the
153environment before the script will succeed when the script is not run via cmake.
Minos Galanakise4094012020-06-12 14:25:34 +0100154
155--------------
156
Anton Komlev91281f02022-04-22 09:24:20 +0100157*Copyright (c) 2017-2022, Arm Limited. All rights reserved.*
BohdanHunkof871df02023-02-03 14:36:41 +0200158*Copyright (c) 2023 Cypress Semiconductor Corporation (an Infineon company)
159or an affiliate of Cypress Semiconductor Corporation. All rights reserved.*