1.. zephyr:code-sample:: tfm_ipc 2 :name: TF-M IPC 3 4 Implement communication between the secure and non-secure images using IPC. 5 6Overview 7******** 8 9This is a simple TF-M integration example that can be used with an ARMv8-M 10supported board. 11 12It uses **IPC Mode** for communication, where TF-M API calls are made to the 13secure image via an IPC mechanism, as opposed to **Library Mode**, where the 14IPC mechanism is bypassed in favor of direct calls. 15 16Zephyr uses Trusted Firmware (TF-M) Platform Security Architecture (PSA) APIs 17to run this sample in a secure configuration, with Zephyr itself running in a 18non-secure configuration. 19 20The sample prints test info to the console either as a single-thread or 21multi-thread application. 22 23The sample reboots after 5 seconds to demonstrate rebooting with TF-M. 24The sys_reboot call is routed to TF-M, since the nonsecure app is not allowed 25to perform the reboot directly. 26 27Building and Running 28******************** 29 30This project outputs test status and info to the console. It can be built and 31executed on MPS2+ AN521 and ST Nucleo L552ZE Q. 32 33On MPS2+ AN521: 34=============== 35 36#. Build Zephyr with a non-secure configuration (``-DBOARD=mps2/an521/cpu0/ns``). 37 38 .. code-block:: bash 39 40 cd $ZEPHYR_ROOT/samples/tfm_integration/tfm_ipc/ 41 mkdir build 42 cd build 43 cmake -DBOARD=mps2/an521/cpu0/ns .. 44 make 45 46You can also use west as follows: 47 48 .. code-block:: bash 49 50 $ west build -p -b mps2/an521/cpu0/ns zephyr/samples/tfm_integration/tfm_ipc 51 52 53#. Copy application binary files (mcuboot.bin and tfm_sign.bin) to ``<MPS2 device name>/SOFTWARE/``. 54#. Open ``<MPS2 device name>/MB/HBI0263C/AN521/images.txt``. Edit the ``AN521/images.txt`` file as follows: 55 56 .. code-block:: bash 57 58 TITLE: Versatile Express Images Configuration File 59 60 [IMAGES] 61 TOTALIMAGES: 2 ;Number of Images (Max: 32) 62 63 IMAGE0ADDRESS: 0x10000000 64 IMAGE0FILE: \SOFTWARE\mcuboot.bin ; BL2 bootloader 65 66 IMAGE1ADDRESS: 0x10080000 67 IMAGE1FILE: \SOFTWARE\tfm_sign.bin ; TF-M with application binary blob 68 69#. Reset MPS2+ board. 70 71If you get the following error when running cmake: 72 73 .. code-block:: bash 74 75 CMake Error at cmake/Common/FindGNUARM.cmake:121 (message): 76 arm-none-eabi-gcc can not be found. Either put arm-none-eabi-gcc on the 77 PATH or set GNUARM_PATH properly. 78 79You may need to edit the ``CMakeLists.txt`` file in the ``tfm_ipc`` project 80folder to update the ``-DGNUARM_PATH=/opt/toolchain/arm-none-eabi`` path. 81 82On QEMU: 83======== 84 85The MPS2+ AN521 target (``mps2/an521/cpu0/ns``), which is based on a 86dual core ARM Cortex-M33 setup, also allows you to run TF-M tests using QEMU if 87you don't have access to a supported ARMv8-M development board. 88 89As part of the normal build process above, a binary is also produced that can 90be run via ``qemu-system-arm``. The binary can be executed as follows: 91 92 .. code-block:: bash 93 94 qemu-system-arm -M mps2-an521 -device loader,file=build/zephyr/tfm_merged.hex -serial stdio 95 96You can also run the binary as part of the ``west`` build process by appending 97the ``-t run`` flag to the end of your build command, or in the case of 98ninja or make, adding the ``run`` commands: 99 100 .. code-block:: bash 101 102 $ west build -b mps2/an521/cpu0/ns zephyr/samples/tfm_integration/tfm_ipc -t run 103 104Or, post build: 105 106 .. code-block:: bash 107 108 $ ninja run 109 110On ST Nucleo L552ZE Q or STM32L562E-DK Discovery: 111================================================= 112 113This sample was tested on Ubuntu 18.04 with Zephyr SDK 0.11.3. 114 115Build Zephyr with a non-secure configuration: 116 117 Example, for building non-secure configuration for Nucleo L552ZE Q 118 119 .. code-block:: bash 120 121 $ west build -b nucleo_l552ze_q/stm32l552xx/ns samples/tfm_integration/tfm_ipc/ 122 123 Example, for building non-secure configuration for STM32L562E-DK Discovery 124 125 .. code-block:: bash 126 127 $ west build -b stm32l562e_dk/stm32l562xx/ns samples/tfm_integration/tfm_ipc/ 128 129The script to initialize the device is available in the ``build/tfm`` folder: 130 131 - ``regression.sh``: Sets platform option bytes config and erase platform. 132 133Run them in the following order to flash the board: 134 135 .. code-block:: bash 136 137 $ ./build/tfm/api_ns/regression.sh 138 $ west flash 139 140 .. note:: 141 Note that ``arm-none-eabi-gcc`` should be available in the PATH variable and that 142 ``STM32_Programmer_CLI`` is required to run ``regression.sh`` 143 (see https://www.st.com/en/development-tools/stm32cubeprog.html). If you are still having 144 trouble running these scripts, check the Programming and Debugging section of the 145 :zephyr:board:`nucleo_l552ze_q` or :zephyr:board:`stm32l562e_dk` documentation. 146 147On LPCxpresso55S69: 148=================== 149 150Build Zephyr with a non-secure configuration: 151 152 .. code-block:: bash 153 154 $ west build -p -b lpcxpresso55s69_ns samples/tfm_integration/tfm_ipc/ -- 155 156Make sure your board is set up with :ref:`lpclink2-jlink-onboard-debug-probe`, 157since this isn't the debug interface boards ship with from the factory; 158 159Next we need to manually flash the resulting image (``tfm_merged.bin``) with a 160J-Link as follows: 161 162 .. code-block:: console 163 164 JLinkExe -device lpc55s69 -if swd -speed 2000 -autoconnect 1 165 J-Link>r 166 J-Link>erase 167 J-Link>loadfile build/zephyr/tfm_merged.bin 168 169Resetting the board and erasing it will unlock the board, this is useful in case 170it's in an unknown state and can't be flashed. 171 172We need to reset the board manually after flashing the image to run this code. 173 174On nRF5340 and nRF9160: 175======================= 176 177Build Zephyr with a non-secure configuration 178(``-DBOARD=nrf5340dk/nrf5340/cpuapp/ns`` or ``-DBOARD=nrf9160dk/nrf9160/ns``). 179 180 Example, for nRF9160, using ``cmake`` and ``ninja`` 181 182 .. code-block:: bash 183 184 cd <ZEPHYR_ROOT>/samples/tfm_integration/tfm_ipc/ 185 rm -rf build 186 mkdir build && cd build 187 cmake -GNinja -DBOARD=nrf9160dk/nrf9160/ns .. 188 189If building with BL2 (MCUboot bootloader) enabled, manually flash 190the MCUboot bootloader image binary (``bl2.hex``). 191 192 Example, using ``nrfjprog`` on nRF9160: 193 194 .. code-block:: bash 195 196 nrfjprog -f NRF91 --program tfm/bin/bl2.hex --sectorerase 197 198Finally, flash the concatenated TF-M + Zephyr binary. 199 200 Example, for nRF9160, using ``cmake`` and ``ninja`` 201 202 .. code-block:: bash 203 204 ninja flash 205 206On BL5340: 207========== 208 209Build Zephyr with a non-secure configuration 210(``-DBOARD=bl5340_dvk/nrf5340/cpuapp/ns``). 211 212 Example using ``cmake`` and ``ninja`` 213 214 .. code-block:: bash 215 216 cd <ZEPHYR_ROOT>/samples/tfm_integration/tfm_ipc/ 217 rm -rf build 218 mkdir build && cd build 219 cmake -GNinja -DBOARD=bl5340_dvk/nrf5340/cpuapp/ns .. 220 221Flash the concatenated TF-M + Zephyr binary. 222 223 Example using ``west`` 224 225 .. code-block:: bash 226 227 west flash --hex-file zephyr/tfm_merged.hex 228 229Sample Output 230============= 231 232.. code-block:: console 233 234 [INF] Starting bootloader 235 [INF] Beginning BL2 provisioning 236 [WRN] TFM_DUMMY_PROVISIONING is not suitable for production! This device is NOT SECURE 237 [INF] Image index: 1, Swap type: none 238 [INF] Image index: 0, Swap type: none 239 [INF] Bootloader chainload address offset: 0x80000 240 [INF] Jumping to the first image slot 241 [INF] Beginning TF-M provisioning 242 [WRN] TFM_DUMMY_PROVISIONING is not suitable for production! This device is NOT SECURE 243 [WRN] This device was provisioned with dummy keys. This device is NOT SECURE 244 [Sec Thread] Secure image initializing! 245 Booting TF-M v2.0.0 246 Creating an empty ITS flash layout. 247 Creating an empty PS flash layout. 248 [INF][Crypto] Provisioning entropy seed... complete. 249 Timer with period zero, disabling 250 *** Booting Zephyr OS build v3.6.0 *** 251 TF-M IPC on (.*) 252 The version of the PSA Framework API is 257. 253 The PSA Crypto service minor version is 1. 254 Generating 256 bytes of random data: 255 [...] 256 257.. _TF-M build instruction: 258 https://git.trustedfirmware.org/TF-M/trusted-firmware-m.git/+/refs/heads/main/docs/building/tfm_build_instruction.rst 259 260.. _TF-M secure boot: 261 https://git.trustedfirmware.org/TF-M/trusted-firmware-m.git/+/refs/heads/main/docs/design_docs/booting/tfm_secure_boot.rst 262