Anton Komlev | 91281f0 | 2022-04-22 09:24:20 +0100 | [diff] [blame] | 1 | ################# |
Summer Qin | abf6698 | 2021-04-06 17:22:15 +0800 | [diff] [blame] | 2 | Integration Guide |
Anton Komlev | 91281f0 | 2022-04-22 09:24:20 +0100 | [diff] [blame] | 3 | ################# |
| 4 | The purpose of this document is to provide a guide on how to integrate TF-M |
| 5 | with other hardware platforms and operating systems. |
| 6 | |
| 7 | |
Minos Galanakis | e409401 | 2020-06-12 14:25:34 +0100 | [diff] [blame] | 8 | .. toctree:: |
| 9 | :maxdepth: 1 |
Minos Galanakis | e409401 | 2020-06-12 14:25:34 +0100 | [diff] [blame] | 10 | |
Anton Komlev | 91281f0 | 2022-04-22 09:24:20 +0100 | [diff] [blame] | 11 | NS client integration <non-secure_client_extension_integration_guide.rst> |
| 12 | OS migration to Armv8-M <os_migration_guide_armv8m.rst> |
| 13 | tfm_fpu_support.rst |
| 14 | tfm_secure_irq_integration_guide.rst |
Anton Komlev | 91281f0 | 2022-04-22 09:24:20 +0100 | [diff] [blame] | 15 | How to add a partition <services/tfm_secure_partition_addition> |
| 16 | |
| 17 | .. toctree:: |
| 18 | :maxdepth: 2 |
| 19 | |
| 20 | platform/index |
| 21 | services/index |
| 22 | |
| 23 | |
| 24 | ***************** |
| 25 | How to build TF-M |
| 26 | ***************** |
| 27 | Follow the :doc:`Build instructions </technical_references/instructions/tfm_build_instruction>`. |
| 28 | |
| 29 | ******************************************************** |
| 30 | How to export files for building non-secure applications |
| 31 | ******************************************************** |
| 32 | Explained in the :doc:`Build instructions </technical_references/instructions/tfm_build_instruction>`. |
| 33 | |
| 34 | ************************* |
| 35 | How to add a new platform |
| 36 | ************************* |
| 37 | |
| 38 | :doc:`Porting TF-M to a New Hardware </integration_guide/platform/porting_TFM_to_a_new_hardware>` |
| 39 | contains guidance on how to add a new platform. |
| 40 | |
| 41 | *************************** |
| 42 | How to integrate another OS |
| 43 | *************************** |
| 44 | |
| 45 | OS migration to Armv8-M platforms |
| 46 | ================================= |
| 47 | To work with TF-M on Armv8-M platforms, the OS needs to support the Armv8-M |
| 48 | architecture and, in particular, it needs to be able to run in the non-secure |
| 49 | world. More information about OS migration to the Armv8-M architecture can be |
| 50 | found in the :doc:`OS requirements <os_migration_guide_armv8m>`. Depending upon |
| 51 | the system configuration this may require configuring drivers to use appropriate |
| 52 | address ranges. |
| 53 | |
| 54 | Interface with TF-M |
| 55 | =================== |
| 56 | The 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 |
| 58 | TF-M secure functions (veneers) from the NS Thread mode. |
| 59 | |
| 60 | TF-M interface header files are exported in ``<install_dir>/interface/include`` |
| 61 | directory. For example, the Protected Storage (PS) service PSA API is declared |
| 62 | in the file ``<install_dir>/interface/include/psa/protected_storage.h``. |
| 63 | |
| 64 | TF-M also exports a reference implementation of PSA APIs for NS clients in the |
| 65 | ``<install_dir>/interface/src``. |
| 66 | |
| 67 | On Armv8-M TrustZone based platforms, NS OS shall implement interface API |
| 68 | ``tfm_ns_interface_dispatch()`` to integrate with TF-M implementation of PSA |
| 69 | APIs. See ``interface/include/tfm_ns_interface.h`` for the detailed declaration |
| 70 | of ``tfm_ns_interface_dispatch()``. |
| 71 | TF-M provides an example of ``tfm_ns_interface_dispatch()`` implementation on |
| 72 | Armv8-M TrustZone based platforms. In this example, NS OS calls mutex in |
| 73 | ``tfm_ns_interface_dispatch()`` to synchronize multiple NS client calls to TF-M. |
| 74 | See ``interface/src/tfm_ns_interface.c.example`` for more details. |
| 75 | |
| 76 | TF-M provides a reference implementation of NS mailbox on multi-core platforms, |
| 77 | under folder ``interface/src/multi_core``. |
| 78 | See :doc:`Mailbox design </technical_references/design_docs/dual-cpu/mailbox_design_on_dual_core_system>` |
| 79 | for TF-M multi-core mailbox design. |
| 80 | |
| 81 | Interface with non-secure world regression tests |
| 82 | ================================================ |
| 83 | A non-secure application that wants to run the non-secure regression tests |
| 84 | needs to call the ``tfm_non_secure_client_run_tests()``. This function is |
| 85 | exported into the header file ``test_framework_integ_test.h`` inside the |
| 86 | ``<build_dir>/install`` folder structure in the test specific files, |
| 87 | i.e. ``<build_dir>/install/export/tfm/test/inc``. The non-secure regression |
| 88 | tests are precompiled and delivered as a static library which is available in |
| 89 | ``<build_dir>/install/export/tfm/test/lib``, so that the non-secure application |
| 90 | needs to link against the library to be able to invoke the |
| 91 | ``tfm_non_secure_client_run_tests()`` function. The PS non-secure side |
| 92 | regression tests rely on some OS functionality e.g. threads, mutexes etc. These |
| 93 | functions comply with CMSIS RTOS2 standard and have been exported as thin |
| 94 | wrappers defined in ``os_wrapper.h`` contained in |
| 95 | ``<build_dir>/install/export/tfm/test/inc``. OS needs to provide the |
| 96 | implementation of these wrappers to be able to run the tests. |
| 97 | |
| 98 | NS client Identification |
| 99 | ======================== |
| 100 | |
| 101 | The NS client identification (NSID) is specified by either SPM or NSPE RTOS. |
| 102 | If SPM manages the NSID (default option), then the same NSID (-1) will be used |
| 103 | for all connections from NS clients. |
| 104 | For the case that NSPE RTOS manages the NSID and/or different NSIDs should be |
| 105 | used for different NS clients. See |
| 106 | :doc:`Non-secure Client Extension Integration Guide </integration_guide/non-secure_client_extension_integration_guide>`. |
| 107 | |
| 108 | ********************* |
| 109 | Non-secure interrupts |
| 110 | ********************* |
| 111 | Non-secure interrupts are allowed to preempt Secure thread mode. |
| 112 | With the current implementation, a NSPE task can spoof the identity of another |
| 113 | NSPE task. This is an issue only when NSPE has provisions for task isolation. |
| 114 | Note, that ``AIRCR.PRIS`` is still set to restrict the priority range available |
| 115 | to NS interrupts to the lower half of available priorities so that it wouldn't |
| 116 | be possible for any non-secure interrupt to preempt a higher-priority secure |
| 117 | interrupt. |
| 118 | |
| 119 | ********************************** |
| 120 | Integration with non-Cmake systems |
| 121 | ********************************** |
| 122 | |
| 123 | Generated Files |
| 124 | =============== |
| 125 | |
| 126 | Files that are derived from PSA manifests are generated at build-time by cmake. |
| 127 | For integration with systems that do no use cmake, the files must be generated |
| 128 | manually. |
| 129 | |
| 130 | The ``tools/tfm_parse_manifest_list.py`` script can be invoked manually. Some |
| 131 | arguments will be needed to be provided. Please refer to |
| 132 | ``tfm_parse_manifest_list.py --help`` for more details. |
| 133 | |
| 134 | Some variables are used in the template files, these will need to be set in the |
| 135 | environment before the script will succeed when the script is not run via cmake. |
Minos Galanakis | e409401 | 2020-06-12 14:25:34 +0100 | [diff] [blame] | 136 | |
| 137 | -------------- |
| 138 | |
Anton Komlev | 91281f0 | 2022-04-22 09:24:20 +0100 | [diff] [blame] | 139 | *Copyright (c) 2017-2022, Arm Limited. All rights reserved.* |