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