1##################################
2Run TF-M examples on Arm platforms
3##################################
4Instructions for how to run TF-M and example test application on Arm platforms.
5
6Follow :doc:`build instruction <tfm_build_instruction>` to build the binaries.
7Follow :doc:`secure boot </technical_references/design_docs/tfm_secure_boot>` to build the
8binaries with or without BL2 bootloader.
9
10****************************************************************
11Execute TF-M example and regression tests on MPS2 boards and FVP
12****************************************************************
13The BL2 bootloader and TF-M example application and tests have been verified
14using the reference model for MPS2 (AN521), in  `Keil MDK`_ ,
15`Fixed Virtual Platforms`_ and `Arm Development Studio`_ .
16
17.. Note::
18    The name of the reference model's executable can vary depending on toolchain.
19
20    - SMM-SSE-200 for `Keil MDK`_
21
22    - FVP_MPS2_AEMv8M for `Fixed Virtual Platforms`_ and `Arm Development Studio`_
23
24    For more information please refer to the appropriate toolchain's
25    documentation:  `Keil MDK Documentation`_ ,
26    `Fixed Virtual Platforms Documentation`_ ,
27    `Arm Development Studio Documentation`_
28
29To run the example code on an SSE-200 Fast-Model
30================================================
31Using FVP_MPS2_AEMv8M provided by `Arm Development Studio`_ 2019.1.
32
33Example application and regression tests without BL2 bootloader
34---------------------------------------------------------------
35Add ``tfm_s.axf`` and ``tfm_ns.axf`` to symbol files in Debug Configuration
36menu.
37
38.. code-block:: bash
39
40    <DS_PATH>/sw/models/bin/FVP_MPS2_AEMv8M  \
41    --parameter fvp_mps2.platform_type=2 \
42    --parameter cpu0.baseline=0 \
43    --parameter cpu0.INITVTOR_S=0x10000000 \
44    --parameter cpu0.semihosting-enable=0 \
45    --parameter fvp_mps2.DISABLE_GATING=0 \
46    --parameter fvp_mps2.telnetterminal0.start_telnet=1 \
47    --parameter fvp_mps2.telnetterminal1.start_telnet=0 \
48    --parameter fvp_mps2.telnetterminal2.start_telnet=0 \
49    --parameter fvp_mps2.telnetterminal0.quiet=0 \
50    --parameter fvp_mps2.telnetterminal1.quiet=1 \
51    --parameter fvp_mps2.telnetterminal2.quiet=1 \
52    --application cpu0=<build_dir>/bin/tfm_s.axf \
53    --data cpu0=<build_dir>/bin/tfm_ns.bin@0x00100000
54
55Example application and regression tests with BL2 bootloader
56------------------------------------------------------------
57To test TF-M with bootloader, one must apply the following changes:
58
59- Add ``bl2.axf`` to symbol files in DS-5 in Debug Configuration
60  menu.
61- Replace the last two lines of the previous command with this:
62
63.. code-block:: bash
64
65    --application cpu0=<build_dir>/bin/bl2.axf \
66    --data cpu0=<build_dir>/bin/tfm_s_ns_signed.bin@0x10080000
67
68Test software upgrade with BL2 bootloader
69^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
70BL2 bootloader is mandatory to test software update. Furthermore two TF-M blob
71must be built. Outputs of example application and regression test can be used to
72test it. Load output of example application to the primary slot (0x10080000) and
73output of regression test to the secondary slot (0x10180000). Add the following
74line to the end of the previous chapter:
75
76.. code-block:: bash
77
78    --data cpu0=<build_dir>/bin/tfm_s_ns_signed.bin@0x10180000
79
80To run the example code on SSE 200 FPGA on MPS2 board
81=====================================================
82FPGA image is available to download
83`here <https://developer.arm.com/products/system-design/development-boards/cortex-m-prototyping-systems/mps2>`__
84
85To run BL2 bootloader and TF-M example application and tests in the MPS2 board,
86it is required to have SMM-SSE-200 for MPS2 (AN521) image in the MPS2 board SD
87card. The image should be located in
88``<MPS2 device name>/MB/HBI0263<board revision letter>/AN521``
89
90The MPS2 board tested is HBI0263C referred also as MPS2+.
91
92.. Warning::
93
94    If you change the exe names, MPS2 expects file names in 8.3 format.
95
96Example application
97-------------------
98#. Copy ``bl2.bin`` and ``tfm_s_ns_signed.bin`` files from
99   ``<build_dir>/bin`` to
100   ``<MPS2 device name>/SOFTWARE/``
101#. Open ``<MPS2 device name>/MB/HBI0263C/AN521/images.txt``
102#. Update the ``AN521/images.txt`` file as follows::
103
104       TITLE: Versatile Express Images Configuration File
105       [IMAGES]
106       TOTALIMAGES: 2                     ;Number of Images (Max: 32)
107       IMAGE0ADDRESS: 0x10000000
108       IMAGE0FILE: \Software\bl2.bin  ; BL2 bootloader
109       IMAGE1ADDRESS: 0x10080000
110       IMAGE1FILE: \Software\tfm_s_ns_signed.bin ; TF-M example application binary blob
111
112#. Close ``<MPS2 device name>/MB/HBI0263C/AN521/images.txt``
113#. Unmount/eject the ``<MPS2 device name>`` unit
114#. Reset the board to execute the TF-M example application
115#. After completing the procedure you should be able to visualize on the serial
116   port (baud 115200 8n1) the following messages::
117
118    [INF] Starting bootloader
119    [INF] Image 0: magic=good, copy_done=0xff, image_ok=0xff
120    [INF] Scratch: magic=bad, copy_done=0x5, image_ok=0xcf
121    [INF] Boot source: primary slot
122    [INF] Swap type: none
123    [INF] Bootloader chainload address offset: 0x80000
124    [INF] Jumping to the first image slot
125    [Sec Thread] Secure image initializing!
126
127Regression tests
128----------------
129After completing the procedure you should be able to visualize on the serial
130port (baud 115200 8n1) the following messages::
131
132    [INF] Starting bootloader
133    [INF] Image 0: magic=good, copy_done=0xff, image_ok=0xff
134    [INF] Scratch: magic=bad, copy_done=0x5, image_ok=0xcf
135    [INF] Boot source: primary slot
136    [INF] Swap type: none
137    [INF] Bootloader chainload address offset: 0x80000
138    [INF] Jumping to the first image slot
139    [Sec Thread] Secure image initializing!
140
141    #### Execute test suites for the protected storage service ####
142    Running Test Suite PS secure interface tests (TFM_PS_TEST_2XXX)...
143
144    > Executing 'TFM_PS_TEST_2001'
145      Description: 'Create interface'
146      TEST PASSED!
147    > Executing 'TFM_PS_TEST_2002'
148      Description: 'Get handle interface (DEPRECATED)'
149    This test is DEPRECATED and the test execution was SKIPPED
150      TEST PASSED!
151    > Executing 'TFM_PS_TEST_2003'
152      Description: 'Get handle with null handle pointer (DEPRECATED)'
153    This test is DEPRECATED and the test execution was SKIPPED
154      TEST PASSED!
155    > Executing 'TFM_PS_TEST_2004'
156      Description: 'Write interface'
157      TEST PASSED!
158    > Executing 'TFM_PS_TEST_2005'
159      Description: 'Read interface'
160    ....
161
162.. Note::
163
164    PS reliability tests take a few minutes to run on the MPS2.
165
166Example application without BL2 bootloader
167------------------------------------------
168#. Copy ``tfm_s.bin`` and ``tfm_ns.bin`` files from
169   ``<build_dir>/bin`` to
170   ``<MPS2 device name>/SOFTWARE/``
171#. Open ``<MPS2 device name>/MB/HBI0263C/AN521/images.txt``
172#. Update the ``AN521/images.txt`` file as follows::
173
174       TITLE: Versatile Express Images Configuration File
175       [IMAGES]
176       TOTALIMAGES: 2                   ;Number of Images (Max: 32)
177       IMAGE0ADDRESS: 0x10000000
178       IMAGE0FILE: \Software\tfm_s.bin  ; Secure code
179       IMAGE1ADDRESS: 0x00100000
180       IMAGE1FILE: \Software\tfm_ns.bin ; Non-secure code
181
182#. Close ``<MPS2 device name>/MB/HBI0263C/AN521/images.txt``
183#. Unmount/eject the ``<MPS2 device name>`` unit
184#. Reset the board to execute the TF-M example application
185#. After completing the procedure you should be able to visualize on the serial
186   port (baud 115200 8n1) the following messages::
187
188    [Sec Thread] Secure image initializing!
189
190Regression tests without BL2 bootloader
191---------------------------------------
192After completing the procedure you should be able to visualize on the serial
193port (baud 115200 8n1) the following messages::
194
195    [Sec Thread] Secure image initializing!
196
197    #### Execute test suites for the protected storage service ####
198    Running Test Suite PS secure interface tests (TFM_PS_TEST_2XXX)...
199
200    > Executing 'TFM_PS_TEST_2001'
201      Description: 'Create interface'
202      TEST PASSED!
203    > Executing 'TFM_PS_TEST_2002'
204      Description: 'Get handle interface (DEPRECATED)'
205    This test is DEPRECATED and the test execution was SKIPPED
206      TEST PASSED!
207    > Executing 'TFM_PS_TEST_2003'
208      Description: 'Get handle with null handle pointer (DEPRECATED)'
209    This test is DEPRECATED and the test execution was SKIPPED
210      TEST PASSED!
211    > Executing 'TFM_PS_TEST_2004'
212      Description: 'Write interface'
213      TEST PASSED!
214    > Executing 'TFM_PS_TEST_2005'
215      Description: 'Read interface'
216    ....
217
218*******************************************************************
219Execute TF-M example and regression tests on Musca test chip boards
220*******************************************************************
221.. Note::
222
223    Before executing any images on Musca-B1 board, please check the
224    :doc:`target platform readme </platform/arm/musca_b1/readme>`
225    to have the correct setup.
226
227    Install SRecord for Musca test chip boards.
228
229    - Windows: `SRecord v1.63 <https://sourceforge.net/projects/srecord/>`__
230    - Linux: sudo apt-get install -y srecord
231
232Example application with BL2 bootloader
233=======================================
234
235#. Create a unified hex file comprising of both ``bl2.bin`` and
236   ``tfm_s_ns_signed.bin``.
237
238    - For Musca-B1
239
240        - Windows::
241
242            srec_cat.exe bin\bl2.bin -Binary -offset 0xA000000 bin\tfm_s_ns_signed.bin -Binary -offset 0xA020000 -o tfm.hex -Intel
243
244        - Linux::
245
246            srec_cat bin/bl2.bin -Binary -offset 0xA000000 bin/tfm_s_ns_signed.bin -Binary -offset 0xA020000 -o tfm.hex -Intel
247
248    - For Musca-S1
249
250        - Windows::
251
252            srec_cat.exe bin\bl2.bin -Binary -offset 0xA000000 bin\tfm_s_ns_signed.bin -Binary -offset 0xA020000 -o tfm.hex -Intel
253
254        - Linux::
255
256            srec_cat bin/bl2.bin -Binary -offset 0xA000000 bin/tfm_s_ns_signed.bin -Binary -offset 0xA020000 -o tfm.hex -Intel
257
258#. Power up the Musca board by connecting it to a computer with a USB lead.
259   Press the ``PBON`` button if the green ``ON`` LED does not immediately turn
260   on. The board should appear as a USB drive.
261#. Copy ``tfm.hex`` to the USB drive. The orange ``PWR`` LED should start
262   blinking.
263#. Once the ``PWR`` LED stops blinking, power cycle or reset the board to boot
264   from the new image.
265#. After completing the procedure you should see the following messages on the
266   DAPLink UART (baud 115200 8n1)::
267
268    [INF] Starting bootloader
269    [INF] Image 0: magic=good, copy_done=0xff, image_ok=0xff
270    [INF] Scratch: magic=bad, copy_done=0x5, image_ok=0xd9
271    [INF] Boot source: primary slot
272    [INF] Swap type: none
273    [INF] Bootloader chainload address offset: 0x20000
274    [INF] Jumping to the first image slot
275    [Sec Thread] Secure image initializing!
276
277Regression tests with BL2 bootloader
278====================================
279.. note::
280
281    As the Internal Trusted Storage and Protected Storage tests use persistent
282    storage, it is recommended to erase the storage area before running the
283    tests. Existing data may prevent the tests from running to completion if,
284    for example, there is not enough free space for the test data or the UIDs
285    used by the tests have already been created with the write-once flag set.
286    Repeated test runs can be done without erasing between runs.
287
288    To erase the storage when flashing an image, ``-fill 0xFF <start_addr>
289    <end_addr>`` can be added to the ``srec_cat`` command used to create the
290    combined hex file. The ``<start_addr>`` and ``<end_addr>`` are the start and
291    end addresses of the storage area, found in the board's ``flash_layout.h``
292    file. The board's flash can also be erased via a debugger; see your IDE's
293    documentation for instructions.
294
295After completing the procedure you should see the following messages on the
296DAPLink UART (baud 115200 8n1)::
297
298    [INF] Starting bootloader
299    [INF] Image 0: magic=good, copy_done=0xff, image_ok=0xff
300    [INF] Scratch: magic=bad, copy_done=0x5, image_ok=0x9
301    [INF] Boot source: primary slot
302    [INF] Swap type: none
303    [INF] Bootloader chainload address offset: 0x20000
304    [INF] Jumping to the first image slot
305    [Sec Thread] Secure image initializing!
306
307    #### Execute test suites for the protected storage service ####
308    Running Test Suite PS secure interface tests (TFM_PS_TEST_2XXX)...
309    > Executing 'TFM_PS_TEST_2001'
310      Description: 'Create interface'
311      TEST PASSED!
312    > Executing 'TFM_PS_TEST_2002'
313      Description: 'Get handle interface (DEPRECATED)'
314    This test is DEPRECATED and the test execution was SKIPPED
315      TEST PASSED!
316    > Executing 'TFM_PS_TEST_2003'
317      Description: 'Get handle with null handle pointer (DEPRECATED)'
318    This test is DEPRECATED and the test execution was SKIPPED
319      TEST PASSED!
320    > Executing 'TFM_PS_TEST_2004'
321      Description: 'Get attributes interface'
322      TEST PASSED!
323    > Executing 'TFM_PS_TEST_2005'
324      Description: 'Get attributes with null attributes struct pointer'
325    ....
326
327PSA API tests
328=============
329Follow the build instructions for the PSA API tests and then follow the above
330procedures for flashing the image to the board. The PSA API tests are linked
331into the TF-M binaries and will automatically run. A log similar to the
332following should be visible on the UART; it is normal for some tests to be
333skipped but there should be no failed tests::
334
335    [Sec Thread] Secure image initializing!
336    Booting TFM v1.1
337    Non-Secure system starting...
338
339    ***** PSA Architecture Test Suite - Version 1.0 *****
340
341    Running.. Storage Suite
342    ******************************************
343
344    TEST: 401 | DESCRIPTION: UID not found check
345    [Info] Executing tests from non-secure
346
347    [Info] Executing ITS tests
348    [Check 1] Call get API for UID 6 which is not set
349    [Check 2] Call get_info API for UID 6 which is not set
350    [Check 3] Call remove API for UID 6 which is not set
351    [Check 4] Call get API for UID 6 which is removed
352    [Check 5] Call get_info API for UID 6 which is removed
353    [Check 6] Call remove API for UID 6 which is removed
354    [Check 7] Call get API for different UID 5
355    [Check 8] Call get_info API for different UID 5
356    [Check 9] Call remove API for different UID 5
357
358    [Info] Executing PS tests
359    [Check 1] Call get API for UID 6 which is not set
360    [Check 2] Call get_info API for UID 6 which is not set
361    [Check 3] Call remove API for UID 6 which is not set
362    [Check 4] Call get API for UID 6 which is removed
363    [Check 5] Call get_info API for UID 6 which is removed
364    [Check 6] Call remove API for UID 6 which is removed
365    [Check 7] Call get API for different UID 5
366    [Check 8] Call get_info API for different UID 5
367    [Check 9] Call remove API for different UID 5
368
369    TEST RESULT: PASSED
370
371    ******************************************
372
373    <further tests removed from log for brevity>
374
375    ************ Storage Suite Report **********
376    TOTAL TESTS     : 17
377    TOTAL PASSED    : 11
378    TOTAL SIM ERROR : 0
379    TOTAL FAILED    : 0
380    TOTAL SKIPPED   : 6
381    ******************************************
382
383.. note::
384    The Internal Trusted Storage and Protected Storage flash areas must be wiped
385    before running the Storage test suites.
386
387    Many IDEs for embedded development (such as Keil µVision) offer a function
388    to erase a device's flash. Refer to your IDE's documentation for
389    instructions.
390
391    Another way this can be achieved is by using ``srec_cat`` with the ``-fill``
392    parameter to fill the corresponding area in the binary with the erase value
393    of the flash (``0xFF``).
394
395    Refer to the platform flash layout for appropriate addresses to erase on
396    other platforms.
397
398    This step is not required on targets that emulate flash storage in RAM, as
399    it will be erased each time the device is reset. Note, however, that a warm
400    reset may not clear SRAM contents, so it may be necessary to power the
401    device off and on again between test runs.
402
403Example application or regression tests on Musca-B1 without BL2 bootloader
404==========================================================================
405
406Follow the above procedures, but create a unified hex file out of ``tfm_s.bin``
407and ``tfm_ns.bin``:
408
409- Windows::
410
411    srec_cat.exe bin\tfm_s.bin -Binary -offset 0xA000000 bin\tfm_ns.bin -Binary -offset 0xA080000 -o tfm.hex -Intel
412
413- Linux::
414
415    srec_cat bin/tfm_s.bin -Binary -offset 0xA000000 bin/tfm_ns.bin -Binary -offset 0xA080000 -o tfm.hex -Intel
416
417********************************************************
418Execute TF-M example and regression tests on MPS3 boards
419********************************************************
420
421To run the example code on CoreLink SSE-200 Subsystem for MPS3 (AN524)
422======================================================================
423FPGA image is available to download `here <https://www.arm.com/products/development-tools/development-boards/mps3>`__
424
425To run BL2 bootloader and TF-M example application and tests in the MPS3 board,
426it is required to have SMM-SSE-200 for MPS3 (AN524) image in the MPS3 board
427SD card. The image should be located in
428``<MPS3 device name>/MB/HBI<BoardNumberBoardrevision>/AN524``
429
430And the current boot memory for AN524 is QSPI flash, so you need to set the
431correct REMAP option in
432``<MPS3 device name>/MB/HBI<BoardNumberBoardrevision>/AN524/an524_v1.txt``
433
434::
435
436    REMAP: QSPI                 ;REMAP boot device BRAM/QSPI.  Must match REMAPVAL below.
437    REMAPVAL: 1                 ;REMAP register value e.g. 0-BRAM. 1-QSPI
438
439The MPS3 board tested is HBI0309B.
440
441.. Note::
442    If you change the exe names, MPS3 expects file names in 8.3 format.
443
444Example application
445-------------------
446#. Copy ``bl2.bin`` and ``tfm_s_ns_signed.bin`` files from
447   build dir to ``<MPS3 device name>/SOFTWARE/``
448#. Open ``<MPS3 device name>/MB/HBI0309B/AN524/images.txt``
449#. Update the ``images.txt`` file as follows::
450
451    TITLE: Arm MPS3 FPGA prototyping board Images Configuration File
452
453    [IMAGES]
454    TOTALIMAGES: 2                     ;Number of Images (Max: 32)
455
456    IMAGE0UPDATE: AUTO                 ;Image Update:NONE/AUTO/FORCE
457    IMAGE0ADDRESS: 0x00000000          ;Please select the required executable program
458    IMAGE0FILE: \SOFTWARE\bl2.bin
459    IMAGE1UPDATE: AUTO
460    IMAGE1ADDRESS: 0x00040000
461    IMAGE1FILE: \SOFTWARE\tfm_s_ns_signed.bin
462
463#. Close ``<MPS3 device name>/MB/HBI0309B/AN524/images.txt``
464#. Unmount/eject the ``<MPS3 device name>`` unit
465#. Reset the board to execute the TF-M example application
466#. After completing the procedure you should be able to visualize on the serial
467   port (baud 115200 8n1) the following messages::
468
469    [INF] Starting bootloader
470    [INF] Image 0: magic= good, copy_done=0xff, image_ok=0xff
471    [INF] Scratch: magic=unset, copy_done=0x43, image_ok=0xff
472    [INF] Boot source: slot 0
473    [INF] Swap type: none
474    [INF] Bootloader chainload address offset: 0x40000
475    [INF] Jumping to the first image slot
476    [Sec Thread] Secure image initializing!
477
478Regression tests
479----------------
480After completing the procedure you should be able to visualize on the serial
481port (baud 115200 8n1) the following messages::
482
483    [INF] Starting bootloader
484    [INF] Image 0: magic= good, copy_done=0xff, image_ok=0xff
485    [INF] Scratch: magic=unset, copy_done=0x9, image_ok=0xff
486    [INF] Boot source: slot 0
487    [INF] Swap type: none
488    [INF] Bootloader chainload address offset: 0x40000
489    [INF] Jumping to the first image slot
490    [Sec Thread] Secure image initializing!
491
492    #### Execute test suites for the Secure area ####
493    Running Test Suite PSA protected storage S interface tests (TFM_PS_TEST_2XXX)...
494    > Executing 'TFM_PS_TEST_2001'
495      Description: 'Set interface'
496      TEST PASSED!
497    > Executing 'TFM_PS_TEST_2002'
498      Description: 'Set interface with create flags'
499      TEST PASSED!
500    > Executing 'TFM_PS_TEST_2003'
501      Description: 'Set interface with NULL data pointer'
502      TEST PASSED!
503    > Executing 'TFM_PS_TEST_2004'
504      Description: 'Set interface with invalid data length'
505      TEST PASSED!
506    ....
507
508.. Note::
509    Some of the attestation tests take a few minutes to run on the MPS3.
510
511Example application without BL2 bootloader
512------------------------------------------
513#. Copy ``tfm_s.bin`` and ``tfm_ns.bin`` files from
514   build dir to ``<MPS3 device name>/SOFTWARE/``
515#. Open ``<MPS3 device name>/MB/HBI0309B/AN524/images.txt``
516#. Update the ``images.txt`` file as follows::
517
518    TITLE: Arm MPS3 FPGA prototyping board Images Configuration File
519
520    [IMAGES]
521    TOTALIMAGES: 2                     ;Number of Images (Max: 32)
522
523    IMAGE0UPDATE: AUTO                 ;Image Update:NONE/AUTO/FORCE
524    IMAGE0ADDRESS: 0x00000000          ;Please select the required executable program
525    IMAGE0FILE: \SOFTWARE\tfm_s.bin
526    IMAGE1UPDATE: AUTO
527    IMAGE1ADDRESS: 0x000C0000
528    IMAGE1FILE: \SOFTWARE\tfm_ns.bin
529
530#. Close ``<MPS3 device name>/MB/HBI0309B/AN521/images.txt``
531#. Unmount/eject the ``<MPS3 device name>`` unit
532#. Reset the board to execute the TF-M example application
533#. After completing the procedure you should be able to visualize on the serial
534   port (baud 115200 8n1) the following messages::
535
536    [Sec Thread] Secure image initializing!
537
538Regression tests without BL2 bootloader
539---------------------------------------
540After completing the procedure you should be able to visualize on the serial
541port (baud 115200 8n1) the following messages::
542
543    [Sec Thread] Secure image initializing!
544
545    #### Execute test suites for the Secure area ####
546    Running Test Suite PSA protected storage S interface tests (TFM_PS_TEST_2XXX)...
547    > Executing 'TFM_PS_TEST_2001'
548      Description: 'Set interface'
549      TEST PASSED!
550    > Executing 'TFM_PS_TEST_2002'
551      Description: 'Set interface with create flags'
552      TEST PASSED!
553    > Executing 'TFM_PS_TEST_2003'
554      Description: 'Set interface with NULL data pointer'
555      TEST PASSED!
556    > Executing 'TFM_PS_TEST_2004'
557      Description: 'Set interface with invalid data length'
558      TEST PASSED!
559    ....
560
561Firmware upgrade and image validation with BL2 bootloader
562=========================================================
563High level operation of BL2 bootloader and instructions for testing firmware
564upgrade is described in :doc:`secure boot </technical_references/design_docs/tfm_secure_boot>`.
565
566--------------
567
568.. _Arm Development Studio: https://developer.arm.com/tools-and-software/embedded/arm-development-studio
569.. _Arm Development Studio Documentation: https://developer.arm.com/tools-and-software/embedded/arm-development-studio/learn/docs
570.. _Fixed Virtual Platforms: https://developer.arm.com/tools-and-software/simulation-models/fixed-virtual-platforms
571.. _Fixed Virtual Platforms Documentation: https://developer.arm.com/documentation/100966/latest
572.. _Keil MDK: http://www2.keil.com/mdk5
573.. _Keil MDK Documentation: https://www2.keil.com/mdk5/docs
574
575*Copyright (c) 2017-2022, Arm Limited. All rights reserved.*
576