xref: /aosp_15_r20/external/tpm2-tss/src/tss2-fapi/ifapi_macros.h (revision 758e9fba6fc9adbf15340f70c73baee7b168b1c9)
1*758e9fbaSOystein Eftevaag /* SPDX-License-Identifier: BSD-2-Clause */
2*758e9fbaSOystein Eftevaag /*******************************************************************************
3*758e9fbaSOystein Eftevaag  * Copyright 2018-2019, Fraunhofer SIT sponsored by Infineon Technologies AG
4*758e9fbaSOystein Eftevaag  * All rights reserved.
5*758e9fbaSOystein Eftevaag  *******************************************************************************/
6*758e9fbaSOystein Eftevaag #ifndef IFAPI_MACROS_H
7*758e9fbaSOystein Eftevaag #define IFAPI_MACROS_H
8*758e9fbaSOystein Eftevaag 
9*758e9fbaSOystein Eftevaag #define strdup_check(dest, str, r, label) \
10*758e9fbaSOystein Eftevaag     if (str) {                             \
11*758e9fbaSOystein Eftevaag        dest = strdup(str); \
12*758e9fbaSOystein Eftevaag        if (!dest) { \
13*758e9fbaSOystein Eftevaag           r = TSS2_FAPI_RC_MEMORY; \
14*758e9fbaSOystein Eftevaag           LOG_ERROR("Out of memory.");          \
15*758e9fbaSOystein Eftevaag           goto label; \
16*758e9fbaSOystein Eftevaag        } \
17*758e9fbaSOystein Eftevaag     } else { \
18*758e9fbaSOystein Eftevaag         dest = NULL; \
19*758e9fbaSOystein Eftevaag     }
20*758e9fbaSOystein Eftevaag 
21*758e9fbaSOystein Eftevaag #define calloc_check(dest, size, r, label) \
22*758e9fbaSOystein Eftevaag     {                             \
23*758e9fbaSOystein Eftevaag        dest = callock(size,1);     \
24*758e9fbaSOystein Eftevaag        if (!dest) { \
25*758e9fbaSOystein Eftevaag           r = TSS2_FAPI_RC_MEMORY; \
26*758e9fbaSOystein Eftevaag           LOG_ERROR("Out of memory.");          \
27*758e9fbaSOystein Eftevaag           goto label; \
28*758e9fbaSOystein Eftevaag        } \
29*758e9fbaSOystein Eftevaag     }
30*758e9fbaSOystein Eftevaag 
31*758e9fbaSOystein Eftevaag #define goto_if_null2(p,msg, r, ec, label, ...) \
32*758e9fbaSOystein Eftevaag     if ((p) == NULL) { \
33*758e9fbaSOystein Eftevaag         LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(ec), ## __VA_ARGS__); \
34*758e9fbaSOystein Eftevaag         r = (ec); \
35*758e9fbaSOystein Eftevaag         goto label;  \
36*758e9fbaSOystein Eftevaag     }
37*758e9fbaSOystein Eftevaag 
38*758e9fbaSOystein Eftevaag #define goto_if_error2(r,msg,label, ...)             \
39*758e9fbaSOystein Eftevaag     if (r != TSS2_RC_SUCCESS) { \
40*758e9fbaSOystein Eftevaag         LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(r), ## __VA_ARGS__); \
41*758e9fbaSOystein Eftevaag         goto label;  \
42*758e9fbaSOystein Eftevaag     }
43*758e9fbaSOystein Eftevaag 
44*758e9fbaSOystein Eftevaag #define return_if_error2(r,msg, ...)                \
45*758e9fbaSOystein Eftevaag     if (r != TSS2_RC_SUCCESS) { \
46*758e9fbaSOystein Eftevaag         LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(r), ## __VA_ARGS__); \
47*758e9fbaSOystein Eftevaag         return r;  \
48*758e9fbaSOystein Eftevaag     }
49*758e9fbaSOystein Eftevaag 
50*758e9fbaSOystein Eftevaag #define try_again_or_error(r,msg, ...)                \
51*758e9fbaSOystein Eftevaag     if ((r & ~TSS2_RC_LAYER_MASK) == TSS2_BASE_RC_TRY_AGAIN) \
52*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_TRY_AGAIN; \
53*758e9fbaSOystein Eftevaag     if (r != TSS2_RC_SUCCESS) { \
54*758e9fbaSOystein Eftevaag         LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(r), ## __VA_ARGS__); \
55*758e9fbaSOystein Eftevaag         return r;  \
56*758e9fbaSOystein Eftevaag     }
57*758e9fbaSOystein Eftevaag 
58*758e9fbaSOystein Eftevaag #define try_again_or_error_goto(r,msg, label, ...)            \
59*758e9fbaSOystein Eftevaag     if ((r & ~TSS2_RC_LAYER_MASK) == TSS2_BASE_RC_TRY_AGAIN) \
60*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_TRY_AGAIN; \
61*758e9fbaSOystein Eftevaag     if (r != TSS2_RC_SUCCESS) { \
62*758e9fbaSOystein Eftevaag         LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(r), ## __VA_ARGS__); \
63*758e9fbaSOystein Eftevaag         goto label;  \
64*758e9fbaSOystein Eftevaag     }
65*758e9fbaSOystein Eftevaag 
66*758e9fbaSOystein Eftevaag #define return_error2(r,msg, ...) {               \
67*758e9fbaSOystein Eftevaag     LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(r), ## __VA_ARGS__); \
68*758e9fbaSOystein Eftevaag     return (r); }
69*758e9fbaSOystein Eftevaag 
70*758e9fbaSOystein Eftevaag 
71*758e9fbaSOystein Eftevaag #define return_if_error_reset_state(r,msg, ...)     \
72*758e9fbaSOystein Eftevaag     if (r != TSS2_RC_SUCCESS) { \
73*758e9fbaSOystein Eftevaag         LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(r), ## __VA_ARGS__); \
74*758e9fbaSOystein Eftevaag         context->state = _FAPI_STATE_INIT; \
75*758e9fbaSOystein Eftevaag         return r;  \
76*758e9fbaSOystein Eftevaag     }
77*758e9fbaSOystein Eftevaag 
78*758e9fbaSOystein Eftevaag #define goto_if_error_reset_state(r,msg,label, ...) \
79*758e9fbaSOystein Eftevaag     if (r != TSS2_RC_SUCCESS) { \
80*758e9fbaSOystein Eftevaag         LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(r), ## __VA_ARGS__); \
81*758e9fbaSOystein Eftevaag         context->state = _FAPI_STATE_INIT; \
82*758e9fbaSOystein Eftevaag         goto label;  \
83*758e9fbaSOystein Eftevaag     }
84*758e9fbaSOystein Eftevaag 
85*758e9fbaSOystein Eftevaag #define goto_error_reset_state(r,v,msg,label) {  \
86*758e9fbaSOystein Eftevaag     r = v; \
87*758e9fbaSOystein Eftevaag     LOG_ERROR("%s " TPM2_ERROR_FORMAT, msg, TPM2_ERROR_TEXT(r));    \
88*758e9fbaSOystein Eftevaag     context->state = _FAPI_STATE_INIT;                              \
89*758e9fbaSOystein Eftevaag     goto label; }
90*758e9fbaSOystein Eftevaag 
91*758e9fbaSOystein Eftevaag #define goto_if_null_reset_state(p,msg,r,ec,label)  \
92*758e9fbaSOystein Eftevaag     if ((p) == NULL) { \
93*758e9fbaSOystein Eftevaag         LOG_ERROR("%s ", (msg)); \
94*758e9fbaSOystein Eftevaag         context->state = _FAPI_STATE_INIT;      \
95*758e9fbaSOystein Eftevaag         (r) = (ec);                             \
96*758e9fbaSOystein Eftevaag         goto label;  \
97*758e9fbaSOystein Eftevaag     }
98*758e9fbaSOystein Eftevaag 
99*758e9fbaSOystein Eftevaag #define return_try_again(r) \
100*758e9fbaSOystein Eftevaag     if ((r & ~TSS2_RC_LAYER_MASK) == TSS2_BASE_RC_TRY_AGAIN) { \
101*758e9fbaSOystein Eftevaag         LOG_TRACE("Received TRY_AGAIN; returning TRY_AGAIN"); \
102*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_TRY_AGAIN; \
103*758e9fbaSOystein Eftevaag     }
104*758e9fbaSOystein Eftevaag 
105*758e9fbaSOystein Eftevaag #define check_not_null(X) \
106*758e9fbaSOystein Eftevaag     if (X == NULL) { \
107*758e9fbaSOystein Eftevaag         LOG_ERROR(str(X) " is NULL: BAD_REFERENCE"); \
108*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_REFERENCE; \
109*758e9fbaSOystein Eftevaag     }
110*758e9fbaSOystein Eftevaag 
111*758e9fbaSOystein Eftevaag #define check_oom(X) \
112*758e9fbaSOystein Eftevaag     if (X == NULL) { \
113*758e9fbaSOystein Eftevaag         LOG_ERROR("Out of memory"); \
114*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_MEMORY; \
115*758e9fbaSOystein Eftevaag     }
116*758e9fbaSOystein Eftevaag 
117*758e9fbaSOystein Eftevaag #if defined __GNUC__ && __GNUC__ < 7
118*758e9fbaSOystein Eftevaag #define fallthrough { }
119*758e9fbaSOystein Eftevaag #else
120*758e9fbaSOystein Eftevaag #define fallthrough __attribute__((fallthrough))
121*758e9fbaSOystein Eftevaag #endif
122*758e9fbaSOystein Eftevaag 
123*758e9fbaSOystein Eftevaag #define statecase(VAR, STATE) \
124*758e9fbaSOystein Eftevaag     case STATE: \
125*758e9fbaSOystein Eftevaag         LOG_TRACE("State " str(VAR) " reached " str(STATE)); \
126*758e9fbaSOystein Eftevaag         VAR=STATE;
127*758e9fbaSOystein Eftevaag 
128*758e9fbaSOystein Eftevaag #define general_failure(VAR) \
129*758e9fbaSOystein Eftevaag     default: \
130*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad state for " str(VAR)); \
131*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_GENERAL_FAILURE;
132*758e9fbaSOystein Eftevaag 
133*758e9fbaSOystein Eftevaag #define statecasedefault(VAR) \
134*758e9fbaSOystein Eftevaag     default: \
135*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad state for " str(VAR)); \
136*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_SEQUENCE;
137*758e9fbaSOystein Eftevaag 
138*758e9fbaSOystein Eftevaag #define statecasedefault_error(VAR, r, label)         \
139*758e9fbaSOystein Eftevaag     default: \
140*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad state for " str(VAR)); \
141*758e9fbaSOystein Eftevaag         r = TSS2_FAPI_RC_BAD_SEQUENCE; \
142*758e9fbaSOystein Eftevaag         goto label;
143*758e9fbaSOystein Eftevaag 
144*758e9fbaSOystein Eftevaag #endif /* IFAPI_MACROS_H */
145