Skip to content

Commit 2c67f99

Browse files
authored
Merge pull request #675 from mattia-moffa/20260123-wolfboot-cmake-fixes
Support stm32h5 TrustZone build via CMake
2 parents 810be2d + 4b5a3d1 commit 2c67f99

File tree

6 files changed

+236
-13
lines changed

6 files changed

+236
-13
lines changed

CMakeLists.txt

Lines changed: 76 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -660,6 +660,65 @@ if(ARCH STREQUAL "ARM")
660660
set(WOLFBOOT_ORIGIN ${ARCH_FLASH_OFFSET})
661661
endif()
662662

663+
if(${WOLFBOOT_TARGET} STREQUAL "stm32h5")
664+
set(ARCH_FLASH_OFFSET 0x08000000)
665+
if(TZEN)
666+
set(WOLFBOOT_ORIGIN 0x0C000000)
667+
else()
668+
set(WOLFBOOT_ORIGIN ${ARCH_FLASH_OFFSET})
669+
endif()
670+
endif()
671+
672+
if(${WOLFBOOT_TARGET} STREQUAL "stm32l5")
673+
set(ARCH_FLASH_OFFSET 0x08000000)
674+
if(TZEN)
675+
set(WOLFBOOT_ORIGIN 0x0C000000)
676+
else()
677+
set(WOLFBOOT_ORIGIN ${ARCH_FLASH_OFFSET})
678+
endif()
679+
endif()
680+
681+
# TrustZone support for Cortex-M33 targets
682+
if(TZEN)
683+
list(APPEND WOLFBOOT_DEFS TZEN)
684+
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "cortex-m33")
685+
list(APPEND WOLFBOOT_COMPILE_OPTIONS -mcmse)
686+
list(APPEND WOLFBOOT_LINK_OPTIONS -mcmse)
687+
endif()
688+
689+
# wolfCrypt TrustZone secure mode
690+
if(WOLFCRYPT_TZ)
691+
list(APPEND WOLFBOOT_DEFS WOLFCRYPT_SECURE_MODE)
692+
list(APPEND WOLFBOOT_SOURCES src/wc_callable.c)
693+
list(APPEND WOLFBOOT_LINK_OPTIONS
694+
-Wl,--cmse-implib
695+
-Wl,--out-implib=${CMAKE_CURRENT_BINARY_DIR}/wc_secure_calls.o)
696+
697+
# PKCS11 TrustZone interface
698+
if(WOLFCRYPT_TZ_PKCS11)
699+
if(WOLFCRYPT_TZ_PSA)
700+
message(FATAL_ERROR "WOLFCRYPT_TZ_PKCS11 and WOLFCRYPT_TZ_PSA are mutually exclusive")
701+
endif()
702+
703+
list(APPEND WOLFBOOT_DEFS
704+
SECURE_PKCS11
705+
WOLFSSL_PKCS11_RW_TOKENS
706+
WP11_HASH_PIN_COST=3)
707+
list(APPEND WOLFBOOT_DEFS "CK_CALLABLE=__attribute__\\(\\(cmse_nonsecure_entry\\)\\)")
708+
709+
list(APPEND WOLFBOOT_INCLUDE_DIRS ${WOLFBOOT_ROOT}/lib/wolfPKCS11)
710+
711+
list(APPEND WOLFBOOT_SOURCES
712+
src/pkcs11_store.c
713+
src/pkcs11_callable.c
714+
lib/wolfPKCS11/src/crypto.c
715+
lib/wolfPKCS11/src/internal.c
716+
lib/wolfPKCS11/src/slot.c
717+
lib/wolfPKCS11/src/wolfpkcs11.c)
718+
endif()
719+
endif()
720+
endif()
721+
663722
endif()
664723

665724
if(ARCH STREQUAL "AARCH64")
@@ -1055,8 +1114,17 @@ add_library(user_settings INTERFACE)
10551114
target_compile_definitions(user_settings INTERFACE ${USER_SETTINGS} ${SIGN_OPTIONS})
10561115

10571116
add_library(wolfboothal)
1117+
1118+
# TrustZone HAL sources for STM32 targets
1119+
set(WOLFBOOT_TZ_HAL_SOURCES "")
1120+
if(TZEN)
1121+
if(${WOLFBOOT_TARGET} MATCHES "^stm32")
1122+
set(WOLFBOOT_TZ_HAL_SOURCES hal/stm32_tz.c)
1123+
endif()
1124+
endif()
1125+
10581126
target_sources(wolfboothal PRIVATE include/hal.h hal/${WOLFBOOT_TARGET}.c ${WOLFBOOT_FLASH_SOURCES}
1059-
${PARTITION_SOURCE})
1127+
${PARTITION_SOURCE} ${WOLFBOOT_TZ_HAL_SOURCES})
10601128

10611129

10621130
#---------------------------------------------------------------------------------------------
@@ -1302,6 +1370,9 @@ if(TARGET ${WOLFSSL_TGT})
13021370
)
13031371
endif() # TARGET ${WOLFSSL_TGT}
13041372

1373+
set(WOLFBOOT_DEFS_PUBLIC ${WOLFBOOT_DEFS})
1374+
list(REMOVE_ITEM WOLFBOOT_DEFS_PUBLIC __WOLFBOOT)
1375+
13051376
if(BUILD_TEST_APPS OR BUILD_IMAGE)
13061377
message(STATUS "Building wolfBoot image")
13071378
add_subdirectory(test-app)
@@ -1357,7 +1428,7 @@ set(WOLFBOOT_VERSION
13571428
configure_file(include/target.h.in ${CMAKE_CURRENT_BINARY_DIR}/target.h @ONLY)
13581429

13591430
add_library(target INTERFACE)
1360-
target_compile_definitions(target INTERFACE ${WOLFBOOT_DEFS})
1431+
target_compile_definitions(target INTERFACE ${WOLFBOOT_DEFS_PUBLIC})
13611432
target_include_directories(target BEFORE INTERFACE
13621433
${CMAKE_CURRENT_BINARY_DIR}
13631434
${CMAKE_CURRENT_SOURCE_DIR}/lib/wolfssl)
@@ -1402,8 +1473,9 @@ endif()
14021473
# generate libwolfboot
14031474
add_library(wolfboot)
14041475
target_sources(wolfboot PRIVATE src/libwolfboot.c ${WOLFBOOT_FLASH_SOURCES})
1405-
target_compile_definitions(wolfboot PUBLIC ${WOLFBOOT_DEFS})
1406-
target_compile_options(wolfboot PUBLIC ${EXTRA_COMPILE_OPTIONS})
1476+
target_compile_definitions(wolfboot PUBLIC ${WOLFBOOT_DEFS_PUBLIC})
1477+
target_compile_definitions(wolfboot PRIVATE __WOLFBOOT)
1478+
target_compile_options(wolfboot PUBLIC ${WOLFBOOT_COMPILE_OPTIONS} ${EXTRA_COMPILE_OPTIONS})
14071479
target_include_directories(wolfboot PUBLIC ${WOLFBOOT_INCLUDE_DIRS})
14081480
target_link_libraries(wolfboot wolfboothal target ${WOLFSSL_TGT})
14091481

CMakePresets.json

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,6 @@
292292
"generator": "Ninja",
293293
"binaryDir": "${sourceDir}/build-stm32h5",
294294
"cacheVariables": {
295-
"BUILD_TEST_APPS": "OFF",
296295
"ARCH": "ARM",
297296
"TZEN": "ON",
298297
"WOLFBOOT_TARGET": "stm32h5",
@@ -309,7 +308,7 @@
309308
"WOLFBOOT_VERSION": "ON",
310309
"V": "OFF",
311310
"SPMATH": "ON",
312-
"RAM_CODE": "OFF",
311+
"RAM_CODE": "ON",
313312
"DUALBANK_SWAP": "OFF",
314313
"WOLFBOOT_PARTITION_SIZE": "0xA0000",
315314
"WOLFBOOT_SECTOR_SIZE": "0x2000",
@@ -318,12 +317,14 @@
318317
"WOLFBOOT_NSC_ADDRESS": "0x0C05C000",
319318
"WOLFBOOT_NSC_SIZE": "0x4000",
320319
"WOLFBOOT_PARTITION_BOOT_ADDRESS": "0x08060000",
321-
"WOLFBOOT_PARTITION_UPDATE_ADDRESS": "0x08100000",
322-
"WOLFBOOT_PARTITION_SWAP_ADDRESS": "0x081A0000",
320+
"WOLFBOOT_PARTITION_UPDATE_ADDRESS": "0x0C100000",
321+
"WOLFBOOT_PARTITION_SWAP_ADDRESS": "0x0C1A0000",
323322
"FLAGS_HOME": "OFF",
324323
"DISABLE_BACKUP": "OFF",
325324
"IMAGE_HEADER_SIZE": "1024",
326-
"ARMORED": "ON"
325+
"ARMORED": "ON",
326+
"WOLFCRYPT_TZ": "ON",
327+
"WOLFCRYPT_TZ_PKCS11": "ON"
327328
}
328329
},
329330
{

cmake/toolchain_arm-none-eabi.cmake

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ endif()
4747
if(WOLFBOOT_TARGET STREQUAL "stm32l0")
4848
set(CMAKE_SYSTEM_PROCESSOR cortex-m0)
4949
set(MCPU_FLAGS "-mcpu=cortex-m0 -mthumb -mlittle-endian -mthumb-interwork ")
50-
elseif(WOLFBOOT_TARGET STREQUAL "stm32u5")
50+
elseif(WOLFBOOT_TARGET STREQUAL "stm32u5" OR WOLFBOOT_TARGET STREQUAL "stm32h5" OR
51+
WOLFBOOT_TARGET STREQUAL "stm32l5")
5152
set(CMAKE_SYSTEM_PROCESSOR cortex-m33)
5253
set(MCPU_FLAGS "-mcpu=cortex-m33 -mthumb -mlittle-endian -mthumb-interwork -Ihal -DCORTEX_M33")
5354
elseif(WOLFBOOT_TARGET STREQUAL "stm32h7")

cmake/wolfboot.cmake

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,15 @@ function(gen_wolfboot_platform_target PLATFORM_NAME LINKER_SCRIPT_TARGET)
5151
target_link_libraries(wolfboot_${PLATFORM_NAME} wolfcrypt target wolfboot
5252
${LINKER_SCRIPT_TARGET})
5353

54+
# TrustZone import library (generated by the linker via --out-implib)
55+
if(TZEN AND WOLFCRYPT_TZ)
56+
set(_wcs_implib "${CMAKE_BINARY_DIR}/wc_secure_calls.o")
57+
add_custom_command(TARGET wolfboot_${PLATFORM_NAME} POST_BUILD
58+
BYPRODUCTS "${_wcs_implib}"
59+
COMMAND ${CMAKE_COMMAND} -E true
60+
)
61+
endif()
62+
5463
# link with public key if signing is enabled
5564
if(NOT SIGN STREQUAL "NONE")
5665
target_link_libraries(wolfboot_${PLATFORM_NAME} public_key)
@@ -87,7 +96,8 @@ function(gen_wolfboot_signed_image TARGET)
8796
add_custom_command(
8897
OUTPUT ${TARGET}_v${VERSION}_signed.bin
8998
DEPENDS ${INPUT_IMAGE} ${WOLFBOOT_SIGNING_PRIVATE_KEY} ${SIGN_TOOL}
90-
COMMAND ${SIGN_TOOL} ${KEYTOOL_OPTIONS} ${INPUT_IMAGE} ${WOLFBOOT_SIGNING_PRIVATE_KEY} ${VERSION}
99+
COMMAND ${CMAKE_COMMAND} -E env IMAGE_HEADER_SIZE=${IMAGE_HEADER_SIZE}
100+
${SIGN_TOOL} ${KEYTOOL_OPTIONS} ${INPUT_IMAGE} ${WOLFBOOT_SIGNING_PRIVATE_KEY} ${VERSION}
91101
COMMENT "Signing ${TARGET}"
92102
)
93103

lib/CMakeLists.txt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,36 @@ if(NOT WOLFBOOT_SMALL_STACK AND WOLFBOOT_TARGET STREQUAL "unit_test")
174174
list(REMOVE_DUPLICATES WOLFCRYPT_SOURCES)
175175
endif()
176176

177+
if(WOLFCRYPT_TZ_PKCS11)
178+
list(APPEND WOLFCRYPT_SOURCES
179+
wolfssl/wolfcrypt/src/asn.c
180+
wolfssl/wolfcrypt/src/memory.c
181+
wolfssl/wolfcrypt/src/random.c
182+
wolfssl/wolfcrypt/src/pwdbased.c
183+
wolfssl/wolfcrypt/src/hmac.c
184+
wolfssl/wolfcrypt/src/dh.c)
185+
186+
if(NOT ENCRYPT_WITH_AES128 AND NOT ENCRYPT_WITH_AES256)
187+
list(APPEND WOLFCRYPT_SOURCES wolfssl/wolfcrypt/src/aes.c)
188+
endif()
189+
190+
set(_sign "${SIGN}")
191+
set(_sign2 "${SIGN_SECONDARY}")
192+
193+
if(NOT _sign MATCHES "RSA" AND NOT _sign2 MATCHES "RSA")
194+
list(APPEND WOLFCRYPT_SOURCES ${RSA_EXTRA_SOURCES} wolfssl/wolfcrypt/src/rsa.c)
195+
endif()
196+
197+
if(NOT _sign MATCHES "ECC" AND NOT _sign2 MATCHES "ECC")
198+
list(APPEND WOLFCRYPT_SOURCES wolfssl/wolfcrypt/src/ecc.c)
199+
endif()
200+
201+
if(NOT _sign MATCHES "ECC" AND NOT _sign2 MATCHES "ECC" AND
202+
NOT _sign MATCHES "RSA" AND NOT _sign2 MATCHES "RSA")
203+
list(APPEND WOLFCRYPT_SOURCES ${MATH_SOURCES})
204+
endif()
205+
endif()
206+
177207
# Include SHA256 module because it's implicitly needed by RSA
178208
list(APPEND WOLFCRYPT_SOURCES wolfssl/wolfcrypt/src/sha256.c)
179209

test-app/CMakeLists.txt

Lines changed: 111 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,18 @@ if("${WOLFBOOT_TARGET}" STREQUAL "stm32h7")
5353
set(APP_LSCRIPT_TEMPLATE ${CMAKE_CURRENT_SOURCE_DIR}/ARM-stm32h7.ld)
5454
elseif("${WOLFBOOT_TARGET}" STREQUAL "stm32u5")
5555
set(APP_LSCRIPT_TEMPLATE ${CMAKE_CURRENT_SOURCE_DIR}/ARM-stm32u5.ld)
56+
elseif("${WOLFBOOT_TARGET}" STREQUAL "stm32h5")
57+
if(TZEN)
58+
set(APP_LSCRIPT_TEMPLATE ${CMAKE_CURRENT_SOURCE_DIR}/ARM-stm32h5-ns.ld)
59+
else()
60+
set(APP_LSCRIPT_TEMPLATE ${CMAKE_CURRENT_SOURCE_DIR}/ARM-stm32h5.ld)
61+
endif()
62+
elseif("${WOLFBOOT_TARGET}" STREQUAL "stm32l5")
63+
if(TZEN)
64+
set(APP_LSCRIPT_TEMPLATE ${CMAKE_CURRENT_SOURCE_DIR}/ARM-stm32l5-ns.ld)
65+
else()
66+
set(APP_LSCRIPT_TEMPLATE ${CMAKE_CURRENT_SOURCE_DIR}/ARM-stm32l5.ld)
67+
endif()
5668
else()
5769
set(APP_LSCRIPT_TEMPLATE ${CMAKE_CURRENT_SOURCE_DIR}/${ARCH}.ld)
5870
endif()
@@ -110,15 +122,112 @@ if(BUILD_TEST_APPS)
110122

111123
target_sources(image PRIVATE ${APP_SOURCES})
112124

125+
# stm32h5-specific sources
126+
if("${WOLFBOOT_TARGET}" STREQUAL "stm32h5")
127+
target_sources(image PRIVATE
128+
../hal/uart/uart_drv_stm32h5.c
129+
)
130+
target_compile_definitions(image PRIVATE
131+
APP_HAS_SYSTICK
132+
RAMFUNCTION=__attribute__\(\(used,section\(".ramcode"\),long_call\)\)
133+
)
134+
target_compile_options(image PRIVATE
135+
-ffunction-sections -fdata-sections -fno-common -mlong-calls
136+
)
137+
if(TZEN)
138+
target_sources(image PRIVATE
139+
wcs/wolfcrypt_secure.c
140+
)
141+
if(WOLFCRYPT_TZ)
142+
target_sources(image PRIVATE
143+
../lib/wolfssl/wolfcrypt/src/logging.c
144+
../lib/wolfssl/wolfcrypt/test/test.c
145+
../lib/wolfssl/wolfcrypt/benchmark/benchmark.c
146+
)
147+
endif()
148+
endif()
149+
endif()
150+
151+
# stm32l5-specific sources
152+
if("${WOLFBOOT_TARGET}" STREQUAL "stm32l5")
153+
target_sources(image PRIVATE
154+
../hal/uart/uart_drv_stm32l5.c
155+
)
156+
target_compile_options(image PRIVATE
157+
-ffunction-sections -fdata-sections -fno-common
158+
)
159+
endif()
160+
113161
target_include_directories(image PRIVATE
114162
../
115163
../include
116164
${CMAKE_CURRENT_BINARY_DIR})
117165

118-
target_link_libraries(image wolfboot target)
166+
if(TZEN)
167+
target_include_directories(image PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/wcs)
168+
endif()
169+
170+
if(WOLFCRYPT_TZ_PKCS11)
171+
target_include_directories(image PRIVATE ../lib/wolfPKCS11)
172+
endif()
173+
174+
# For TrustZone builds, avoid linking the bootloader lib (it defines NSC stubs).
175+
if(TZEN AND WOLFCRYPT_TZ)
176+
target_sources(image PRIVATE ../src/libwolfboot.c)
177+
if(NOT SIGN STREQUAL "NONE")
178+
set_source_files_properties(${CMAKE_BINARY_DIR}/keystore.c PROPERTIES GENERATED TRUE)
179+
target_sources(image PRIVATE ${CMAKE_BINARY_DIR}/keystore.c)
180+
add_dependencies(image keystore)
181+
endif()
182+
target_link_libraries(image PRIVATE wolfboothal target)
183+
else()
184+
target_link_libraries(image PRIVATE wolfboot wolfboothal public_key target)
185+
endif()
186+
187+
# For TrustZone builds, the test app is a non-secure application
188+
if(TZEN AND WOLFCRYPT_TZ)
189+
list(APPEND TEST_APP_COMPILE_DEFINITIONS NONSECURE_APP WOLFBOOT_SECURE_CALLS)
190+
add_dependencies(image wolfboot_${PLATFORM_NAME})
191+
target_link_libraries(image PRIVATE ${CMAKE_BINARY_DIR}/wc_secure_calls.o)
192+
endif()
193+
194+
if(WOLFCRYPT_TZ_PKCS11)
195+
list(APPEND TEST_APP_COMPILE_DEFINITIONS WOLFBOOT_PKCS11_APP SECURE_PKCS11)
196+
target_sources(image PRIVATE
197+
wcs/pkcs11_stub.c
198+
wcs/pkcs11_test_ecc.c
199+
../lib/wolfssl/wolfcrypt/src/ecc.c
200+
../lib/wolfssl/wolfcrypt/src/rsa.c
201+
../lib/wolfssl/wolfcrypt/src/asn.c
202+
../lib/wolfssl/wolfcrypt/src/aes.c
203+
../lib/wolfssl/wolfcrypt/src/hmac.c
204+
../lib/wolfssl/wolfcrypt/src/pwdbased.c
205+
../lib/wolfssl/wolfcrypt/src/hash.c
206+
../lib/wolfssl/wolfcrypt/src/sha256.c
207+
../lib/wolfssl/wolfcrypt/src/sha512.c
208+
../lib/wolfssl/wolfcrypt/src/sha3.c
209+
../lib/wolfssl/wolfcrypt/src/integer.c
210+
../lib/wolfssl/wolfcrypt/src/tfm.c
211+
../lib/wolfssl/wolfcrypt/src/sp_c32.c
212+
../lib/wolfssl/wolfcrypt/src/sp_int.c
213+
../lib/wolfssl/wolfcrypt/src/cryptocb.c
214+
../lib/wolfssl/wolfcrypt/src/wc_pkcs11.c
215+
../lib/wolfssl/wolfcrypt/src/memory.c
216+
../lib/wolfssl/wolfcrypt/src/wolfmath.c
217+
../lib/wolfssl/wolfcrypt/src/dh.c
218+
../lib/wolfssl/wolfcrypt/src/random.c
219+
../lib/wolfssl/wolfcrypt/src/coding.c
220+
../lib/wolfssl/wolfcrypt/src/wc_encrypt.c
221+
../lib/wolfssl/wolfcrypt/src/wc_port.c
222+
)
223+
if(SPMATH AND NOT NO_ASM)
224+
list(APPEND TEST_APP_COMPILE_DEFINITIONS WOLFSSL_HAVE_SP_RSA WOLFSSL_HAVE_SP_ECC WOLFSSL_SP_ARM_CORTEX_M_ASM)
225+
target_sources(image PRIVATE ../lib/wolfssl/wolfcrypt/src/sp_cortexm.c)
226+
endif()
227+
endif()
119228

120229
target_compile_definitions(image PRIVATE TARGET_${WOLFBOOT_TARGET}
121-
${TEST_APP_COMPILE_DEFINITIONS} ${WOLFBOOT_DEFS})
230+
${TEST_APP_COMPILE_DEFINITIONS} ${WOLFBOOT_DEFS_PUBLIC})
122231

123232
target_compile_options(image PRIVATE -Wall -Wstack-usage=1024 -ffreestanding -Wno-unused -fomit-frame-pointer
124233
-nostartfiles)

0 commit comments

Comments
 (0)