1 /* 2 * Copyright (c) 2018-2022, Arm Limited. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 * 6 */ 7 #ifndef __TFM_UTILS_H__ 8 #define __TFM_UTILS_H__ 9 10 #include <stdbool.h> 11 #include <string.h> 12 #include "tfm_spm_log.h" 13 14 /* 15 * CPU spin here. 16 * Note: this function is used to handle PROGRAMMER ERROR. 17 */ 18 void tfm_core_panic(void); 19 20 /* SPM assert */ 21 #ifndef NDEBUG 22 #define SPM_ASSERT(cond) \ 23 do { \ 24 if (!(cond)) { \ 25 SPMLOG_INFMSG("Assert:"); \ 26 SPMLOG_INFMSG(__func__); \ 27 SPMLOG_INFMSGVAL(",", __LINE__); \ 28 while (1) \ 29 ; \ 30 } \ 31 } while (0) 32 #else 33 #define SPM_ASSERT(cond) 34 #endif 35 36 /* Get container structure start address from member */ 37 #define TO_CONTAINER(ptr, type, member) \ 38 (type *)((unsigned long)(ptr) - offsetof(type, member)) 39 40 /* FixMe: Replace ERROR_MSG() in platform code with a suitable API */ 41 #define ERROR_MSG(msg) SPMLOG_ERRMSG(msg "\r\n") 42 43 /* Stringify preprocessors, no leading underscore. ('STRINGIFY') */ 44 #define STRINGIFY_EXPAND(x) #x 45 #define M2S(m) STRINGIFY_EXPAND(m) 46 47 /* Runtime memory operations forwarding */ 48 #ifndef spm_memcpy 49 #define spm_memcpy memcpy 50 #else 51 void *spm_memcpy(void *dest, const void *src, size_t n); 52 #endif /* spm_memcpy */ 53 54 #ifndef spm_memset 55 #define spm_memset memset 56 #else 57 void *spm_memset(void *s, int c, size_t n); 58 #endif /* spm_memset */ 59 60 #endif /* __TFM_UTILS_H__ */ 61