1#-------------------------------------------------------------------------------
2# Copyright (c) 2020-2022, Arm Limited. All rights reserved.
3# Copyright (c) 2021 STMicroelectronics. All rights reserved.
4#
5# SPDX-License-Identifier: BSD-3-Clause
6#
7#-------------------------------------------------------------------------------
8
9cmake_policy(SET CMP0076 NEW)
10set(CMAKE_CURRENT_SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR})
11
12#========================= Platform region defs ===============================#
13
14target_include_directories(platform_region_defs
15    INTERFACE
16        partition
17        include
18        ${CMAKE_CURRENT_SOURCE_DIR}/boards
19)
20
21target_compile_definitions(platform_region_defs
22    INTERFACE
23        $<$<OR:$<BOOL:${TFM_NS_REG_TEST}>,$<BOOL:${TFM_S_REG_TEST}>>:FLASH_LAYOUT_FOR_TEST>
24)
25
26#========================= Platform common defs ===============================#
27target_add_scatter_file(tfm_s
28    $<$<AND:$<VERSION_LESS:${TFM_ISOLATION_LEVEL},3>,$<C_COMPILER_ID:ARMClang>>:${CMAKE_SOURCE_DIR}/platform/ext/common/armclang/tfm_common_s.sct>
29    $<$<AND:$<VERSION_LESS:${TFM_ISOLATION_LEVEL},3>,$<C_COMPILER_ID:GNU>>:${CMAKE_SOURCE_DIR}/platform/ext/common/gcc/tfm_common_s.ld>
30    $<$<AND:$<VERSION_LESS:${TFM_ISOLATION_LEVEL},3>,$<C_COMPILER_ID:IAR>>:${CMAKE_SOURCE_DIR}/platform/ext/common/iar/tfm_common_s.icf>
31    $<$<AND:$<VERSION_EQUAL:${TFM_ISOLATION_LEVEL},3>,$<C_COMPILER_ID:ARMClang>>:${CMAKE_BINARY_DIR}/generated/platform/ext/common/armclang/tfm_isolation_l3.sct>
32    $<$<AND:$<VERSION_EQUAL:${TFM_ISOLATION_LEVEL},3>,$<C_COMPILER_ID:GNU>>:${CMAKE_BINARY_DIR}/generated/platform/ext/common/gcc/tfm_isolation_l3.ld>
33    $<$<AND:$<VERSION_EQUAL:${TFM_ISOLATION_LEVEL},3>,$<C_COMPILER_ID:IAR>>:${CMAKE_BINARY_DIR}/generated/platform/ext/common/iar/tfm_isolation_l3.icf>
34)
35
36if(BL2)
37    target_add_scatter_file(bl2
38        $<$<C_COMPILER_ID:GNU>:${STM_COMMON_DIR}/hal/template/gcc/bl2.ld>
39        $<$<C_COMPILER_ID:ARMClang>:${STM_COMMON_DIR}/hal/template/armclang/bl2.sct>
40        $<$<C_COMPILER_ID:IAR>:${STM_COMMON_DIR}/hal/template/iar/bl2.icf>
41    )
42endif()
43
44#========================= Platform Secure ====================================#
45
46target_include_directories(platform_s
47    PUBLIC
48        ${CMAKE_CURRENT_SOURCE_DIR}
49        ${STM_COMMON_DIR}/hal/Native_Driver
50        ${STM_COMMON_DIR}/hal/CMSIS_Driver
51        ${CMAKE_CURRENT_SOURCE_DIR}/Device/Include
52        ${CMAKE_CURRENT_SOURCE_DIR}/hal/Inc
53        ${MBEDCRYPTO_PATH}/library
54)
55
56target_sources(platform_s
57    PRIVATE
58        ${CMAKE_CURRENT_SOURCE_DIR}/secure/system_stm32l5xx.c
59        ${STM_COMMON_DIR}/hal/Native_Driver/tick.c
60        ${STM_COMMON_DIR}/hal/Native_Driver/mpu_armv8m_drv.c
61        ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal.c
62        ${CMAKE_CURRENT_SOURCE_DIR}/secure/low_level_device.c
63        ${STM_COMMON_DIR}/hal/CMSIS_Driver/low_level_flash.c
64        ${STM_COMMON_DIR}/hal/CMSIS_Driver/low_level_com.c
65        ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal.c
66        ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_cortex.c
67        ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_flash.c
68        ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_flash_ex.c
69        ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_dma.c
70        ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_pwr.c
71        ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_pwr_ex.c
72        ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_gpio.c
73        ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_uart.c
74        ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_uart_ex.c
75        ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_rcc.c
76        ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_rcc_ex.c
77        ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_gtzc.c
78        $<$<BOOL:${TFM_PARTITION_PLATFORM}>:${CMAKE_CURRENT_SOURCE_DIR}/secure/tfm_platform_system.c>
79        ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_rng.c
80        ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_rng_ex.c
81    PUBLIC
82        ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_hash.c
83        ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_hash_ex.c
84        ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_pka.c
85        ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_cryp.c
86        ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_cryp_ex.c
87        ${STM_COMMON_DIR}/hal/Native_Driver/low_level_rng.c
88)
89
90target_compile_options(platform_s
91    PUBLIC
92        ${COMPILER_CMSE_FLAG}
93)
94
95# GNU ld has some strange behaviour to do with weak functions, and does not deal
96# well with strong functions in static libraries overriding weak functions in
97# object files. For this reason, the file mailbox_ipc_intr is linked directly to
98# the ns binary as an object file. This issue does not affect armclang, but the
99# fix is compatible.
100target_sources(tfm_s
101    PRIVATE
102        ${STM_COMMON_DIR}/hal/Native_Driver/tick.c
103)
104
105#========================= Platform Non-Secure ================================#
106
107# Install linker scripts
108install(FILES
109    ${STM_COMMON_DIR}/hal/template/iar/appli_ns.icf
110    ${STM_COMMON_DIR}/hal/template/gcc/appli_ns.ld
111    ${STM_COMMON_DIR}/hal/template/armclang/appli_ns.sct
112    DESTINATION ${INSTALL_PLATFORM_NS_DIR}/linker_scripts
113)
114
115install(DIRECTORY
116    ${CMAKE_CURRENT_SOURCE_DIR}/Device/Include
117    DESTINATION ${INSTALL_PLATFORM_NS_DIR}/Device
118)
119
120install(FILES
121    ${PLATFORM_DIR}/ext/common/test_interrupt.h
122    ${PLATFORM_DIR}/ext/driver/Driver_USART.h
123    ${PLATFORM_DIR}/ext/driver/Driver_Common.h
124    ${PLATFORM_DIR}/include/tfm_plat_defs.h
125    DESTINATION ${INSTALL_PLATFORM_NS_DIR}/include
126)
127
128install(DIRECTORY
129    ${CMAKE_CURRENT_SOURCE_DIR}/hal/Inc
130    DESTINATION ${INSTALL_PLATFORM_NS_DIR}/hal
131)
132
133install(FILES
134    ${STM_COMMON_DIR}/hal/CMSIS_Driver/low_level_com.c
135    DESTINATION ${INSTALL_PLATFORM_NS_DIR}/CMSIS_Driver
136)
137install(FILES
138    ${CMAKE_CURRENT_SOURCE_DIR}/Device/Source/Templates/system_stm32l5xx.c
139    DESTINATION ${INSTALL_PLATFORM_NS_DIR}/Device/Source/
140)
141
142install(FILES
143    ${CMAKE_CURRENT_SOURCE_DIR}/boards/cmsis.h
144    ${CMAKE_CURRENT_SOURCE_DIR}/boards/target_cfg.h
145    ${CMAKE_CURRENT_SOURCE_DIR}/boards/tfm_peripherals_def.h
146    DESTINATION ${INSTALL_PLATFORM_NS_DIR}/include
147)
148
149
150install(FILES
151        ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal.c
152        ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_dma.c
153        ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_pwr.c
154        ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_pwr_ex.c
155        ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_rcc.c
156        ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_gpio.c
157        ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_uart.c
158        ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_uart_ex.c
159        ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_cortex.c
160        DESTINATION ${INSTALL_PLATFORM_NS_DIR}/hal/Src
161)
162#========================= Platform BL2 =======================================#
163
164if(BL2)
165    target_include_directories(platform_bl2
166        PUBLIC
167            ${CMAKE_CURRENT_SOURCE_DIR}
168            ${STM_COMMON_DIR}/hal/Native_Driver
169            ${STM_COMMON_DIR}/hal/CMSIS_Driver
170            ${CMAKE_CURRENT_SOURCE_DIR}/Device/Include
171            ${CMAKE_CURRENT_SOURCE_DIR}/hal/Inc
172            ${MCUBOOT_PATH}/boot/bootutil/include
173            $<TARGET_PROPERTY:bl2,BINARY_DIR>/ext/mcuboot
174            ${CMAKE_SOURCE_DIR}/bl2/ext/mcuboot/include
175    )
176
177    target_sources(platform_bl2
178        PRIVATE
179            ${CMAKE_CURRENT_SOURCE_DIR}/Device/Source/Templates/system_stm32l5xx.c
180            ${CMAKE_CURRENT_SOURCE_DIR}/bl2/boot_hal_bl2.c
181            ${STM_COMMON_DIR}/hal/Native_Driver/mpu_armv8m_drv.c
182            ${CMAKE_CURRENT_SOURCE_DIR}/bl2/tfm_low_level_security.c
183            ${CMAKE_CURRENT_SOURCE_DIR}/bl2/low_level_device.c
184            ${STM_COMMON_DIR}/hal/CMSIS_Driver/low_level_flash.c
185            ${STM_COMMON_DIR}/hal/CMSIS_Driver/low_level_com.c
186            ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal.c
187            ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_flash.c
188            ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_flash_ex.c
189            ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_pwr_ex.c
190            ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_dma.c
191            ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_pwr.c
192            ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_rcc.c
193            ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_rcc_ex.c
194            ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_cortex.c
195            ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_gpio.c
196            ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_uart.c
197            ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_uart_ex.c
198            ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_gtzc.c
199            ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_hash.c
200            ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_hash_ex.c
201            ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_pka.c
202            ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_cryp.c
203            ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_cryp_ex.c
204            ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_rng.c
205            ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32l5xx_hal_rng_ex.c
206            ${STM_COMMON_DIR}/hal/Native_Driver/low_level_rng.c
207    )
208
209    target_compile_options(platform_bl2
210        PUBLIC
211            ${COMPILER_CMSE_FLAG}
212    )
213
214    # GNU ld has some strange behaviour to do with weak functions, and does not deal
215    # well with strong functions in static libraries overriding weak functions in
216    # object files. For this reason, the file mailbox_ipc_intr is linked directly to
217    # the ns binary as an object file. This issue does not affect armclang, but the
218    # fix is compatible.
219    target_sources(bl2
220        PRIVATE
221            ${STM_COMMON_DIR}/hal/Native_Driver/tick.c
222    )
223endif()
224
225#========================= tfm_spm ============================================#
226
227target_sources(tfm_spm
228    PRIVATE
229        ${CMAKE_CURRENT_SOURCE_DIR}/secure/target_cfg.c
230        ${CMAKE_CURRENT_SOURCE_DIR}/secure/tfm_hal_isolation.c
231        ${CMAKE_CURRENT_SOURCE_DIR}/secure/tfm_hal_platform.c
232)
233
234install(FILES
235        ${STM_COMMON_DIR}/scripts/stm_tool.py
236        ${STM_COMMON_DIR}/scripts/bin2hex.py
237        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../bl2/ext/mcuboot/scripts/macro_parser.py
238        DESTINATION ${CMAKE_INSTALL_PREFIX}/scripts/ )
239
240if (${CMAKE_C_COMPILER_ID} STREQUAL GNU)
241    set(PREPROCESSOR_FILE ${STM_COMMON_DIR}/scripts/gcc/preprocess.sh)
242elseif (${CMAKE_C_COMPILER_ID} STREQUAL ARMClang)
243    set(PREPROCESSOR_FILE ${STM_COMMON_DIR}/scripts/armclang/preprocess.sh)
244else()
245    set(PREPROCESSOR_FILE ${STM_COMMON_DIR}/scripts/iar/preprocess.sh)
246endif()
247
248install(FILES ${STM_COMMON_DIR}/scripts/regression.sh
249         ${PREPROCESSOR_FILE}
250         ${STM_COMMON_DIR}/scripts/TFM_UPDATE.sh
251         ${STM_COMMON_DIR}/scripts/TFM_BIN2HEX.sh
252         ${STM_COMMON_DIR}/scripts/postbuild.sh
253         PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ
254         DESTINATION ${CMAKE_INSTALL_PREFIX}  )
255
256if (TFM_S_REG_TEST OR TFM_NS_REG_TEST)
257    #the define FLASH_LAYOUT_FOR_TEST
258    #increase SECURE and NON SECURE IMAGE and modify the  content of  low_level_device.c from BL2 (low_level_flash.c)
259    set(FLAGS_FOR_BL2_PREPROCESSING
260        "#define FLASH_LAYOUT_FOR_TEST\n"
261        "#define BL2\n"
262         )
263    add_definitions("-DFLASH_LAYOUT_FOR_TEST")
264else()
265    set(FLAGS_FOR_BL2_PREPROCESSING
266        "#define BL2\n"
267       )
268endif()
269
270set(CONTENT_FOR_BL2_PREPROCESSING
271    "#include \"flash_layout.h\"\n\n"
272    "enum bl2_image_attributes {\n"
273    "\tRE_IMAGE_FLASH_ADDRESS_SECURE = (FLASH_BASE_ADDRESS+FLASH_AREA_0_OFFSET),\n"
274    "\tRE_IMAGE_FLASH_ADDRESS_NON_SECURE = (FLASH_BASE_ADDRESS+FLASH_AREA_1_OFFSET),\n"
275    "\tRE_BL2_BIN_ADDRESS = (FLASH_BASE_ADDRESS+FLASH_AREA_BL2_BIN_OFFSET),\n"
276    "#if defined(FLASH_BL2_NVCNT_AREA_OFFSET)\n"
277    "\tRE_BL2_NVMCNT_ADDRESS = (FLASH_BASE_ADDRESS+FLASH_BL2_NVCNT_AREA_OFFSET),\n"
278    "#else\n"
279    "\tRE_BL2_NVMCNT_ADDRESS = 0x0,\n"
280    "#endif\n"
281    "#if defined(FLASH_AREA_OTP_OFFSET)\n"
282    "\tRE_BL2_PROVISION_ADDRESS = (FLASH_BASE_ADDRESS+FLASH_AREA_OTP_OFFSET),\n"
283    "#else\n"
284    "\tRE_BL2_PROVISION_ADDRESS = 0x0,\n"
285    "#endif\n"
286    "\tRE_BL2_BOOT_ADDRESS = (FLASH_BASE_ADDRESS+FLASH_AREA_BL2_OFFSET),\n"
287    "\tRE_BL2_WRP_START = (FLASH_AREA_BL2_OFFSET),\n"
288    "\tRE_BL2_WRP_END = (FLASH_AREA_BL2_NOHDP_OFFSET+FLASH_AREA_BL2_NOHDP_SIZE-0x1),\n"
289    "\tRE_BL2_HDP_END = (FLASH_AREA_BL2_NOHDP_OFFSET-0x1),\n"
290    "#if defined(EXTERNAL_FLASH)\n"
291    "\tRE_IMAGE_FLASH_SECURE_UPDATE = (OSPI_FLASH_BASE_ADDRESS+FLASH_AREA_2_OFFSET),\n"
292    "\tRE_IMAGE_FLASH_NON_SECURE_UPDATE = (OSPI_FLASH_BASE_ADDRESS+FLASH_AREA_3_OFFSET),\n"
293    "\tRE_IMAGE_FLASH_UNUSED = (FLASH_BASE_ADDRESS+FLASH_AREA_1_OFFSET+FLASH_AREA_1_SIZE),\n"
294    "#else\n"
295    "\tRE_IMAGE_FLASH_SECURE_UPDATE = (FLASH_BASE_ADDRESS+FLASH_AREA_2_OFFSET),\n"
296    "\tRE_IMAGE_FLASH_NON_SECURE_UPDATE = (FLASH_BASE_ADDRESS+FLASH_AREA_3_OFFSET),\n"
297    "\tRE_IMAGE_FLASH_UNUSED = (FLASH_BASE_ADDRESS+FLASH_AREA_3_OFFSET+FLASH_AREA_3_SIZE),\n"
298    "#endif\n"
299    "\tRE_IMAGE_FLASH_SCRATCH = (FLASH_BASE_ADDRESS+FLASH_AREA_SCRATCH_OFFSET),\n"
300    "#if defined(FLASH_OTP_NV_COUNTERS_AREA_OFFSET)\n"
301    "\tRE_IMAGE_FLASH_NV_COUNTERS = (FLASH_BASE_ADDRESS+FLASH_OTP_NV_COUNTERS_AREA_OFFSET),\n"
302    "#else\n"
303    "\tRE_IMAGE_FLASH_NV_COUNTERS = (FLASH_BASE_ADDRESS+FLASH_NV_COUNTERS_AREA_OFFSET),\n"
304    "#endif\n"
305    "\tRE_IMAGE_FLASH_NV_PS = (FLASH_BASE_ADDRESS+FLASH_PS_AREA_OFFSET),\n"
306    "\tRE_IMAGE_FLASH_NV_ITS = (FLASH_BASE_ADDRESS+FLASH_ITS_AREA_OFFSET),\n"
307)
308if(MCUBOOT_ENC_IMAGES)
309    set(CONTENT_ENCRYPTED
310    "\tRE_IMAGE_ENCRYPTED = 0x01\n}\;"
311    )
312else()
313    set(CONTENT_ENCRYPTED
314    "\tRE_IMAGE_ENCRYPTED = 0x0\n}\;"
315    )
316endif()
317
318string(CONCAT BL2_PREPROCESSING ${FLAGS_FOR_BL2_PREPROCESSING}
319       ${CONTENT_FOR_BL2_PREPROCESSING}
320       ${CONTENT_ENCRYPTED})
321