Mayank Gupta / Mbed OS pelion-example-frdm

Dependencies:   FXAS21002 FXOS8700Q

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers arm_uc_error.h Source File

arm_uc_error.h

00001 // ----------------------------------------------------------------------------
00002 // Copyright 2016-2017 ARM Ltd.
00003 //
00004 // SPDX-License-Identifier: Apache-2.0
00005 //
00006 // Licensed under the Apache License, Version 2.0 (the "License");
00007 // you may not use this file except in compliance with the License.
00008 // You may obtain a copy of the License at
00009 //
00010 //     http://www.apache.org/licenses/LICENSE-2.0
00011 //
00012 // Unless required by applicable law or agreed to in writing, software
00013 // distributed under the License is distributed on an "AS IS" BASIS,
00014 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00015 // See the License for the specific language governing permissions and
00016 // limitations under the License.
00017 // ----------------------------------------------------------------------------
00018 
00019 #ifndef ARM_UPDATE_ERROR_H
00020 #define ARM_UPDATE_ERROR_H
00021 
00022 #include <stdint.h>
00023 
00024 // Use two characters to form the 16bit module code
00025 #define TWO_CC(A,B) (((A) & 0xFF) | (((B) & 0xFF) << 8))
00026 #define CC_ASCII(X) ((((X) < ' ') || ((X) > '~' )) ? '.' : (X))
00027 
00028 #define MANIFEST_MANAGER_PREFIX    TWO_CC('M','M')
00029 #define CERTIFICATE_MANAGER_PREFIX TWO_CC('C','M')
00030 #define SOURCE_MANAGER_PREFIX      TWO_CC('S','M')
00031 #define SOURCE_PREFIX              TWO_CC('S','E')
00032 #define FIRMWARE_MANAGER_PREFIX    TWO_CC('F','M')
00033 #define DER_PARSER_PREFIX          TWO_CC('D','P')
00034 #define MBED_TLS_ERROR_PREFIX      TWO_CC('M','T')
00035 #define UPDATE_CRYPTO_PREFIX       TWO_CC('C','U')
00036 #define DEVICE_IDENTITY_PREFIX     TWO_CC('D','I')
00037 #define HUB_PREFIX                 TWO_CC('H','B')
00038 #define EVENT_QUEUE_PREFIX         TWO_CC('E','Q')
00039 #define PAAL_PREFIX                TWO_CC('P','L')
00040 
00041 #define ARM_UC_COMMON_ERR_LIST\
00042     ENUM_FIXED(ERR_NONE,0)\
00043     ENUM_AUTO(ERR_UNSPECIFIED)\
00044     ENUM_AUTO(ERR_INVALID_PARAMETER)\
00045     ENUM_AUTO(ERR_NULL_PTR)\
00046     ENUM_AUTO(ERR_NOT_READY)\
00047     ENUM_AUTO(ERR_INVALID_STATE)\
00048     ENUM_AUTO(ERR_OUT_OF_MEMORY)\
00049 
00050 // Manifest manager
00051 #define ARM_UC_MM_ERR_LIST\
00052     ENUM_FIXED(MFST_ERR_FIRST, MANIFEST_MANAGER_PREFIX << 16)\
00053     ENUM_AUTO(MFST_ERR_NULL_PTR)\
00054     ENUM_AUTO(MFST_ERR_NOT_READY)\
00055     ENUM_AUTO(MFST_ERR_PENDING)\
00056     ENUM_AUTO(MFST_ERR_SIZE)\
00057     ENUM_AUTO(MFST_ERR_DER_FORMAT)\
00058     ENUM_AUTO(MFST_ERR_FORMAT)\
00059     ENUM_AUTO(MFST_ERR_VERSION)\
00060     ENUM_AUTO(MFST_ERR_ROLLBACK)\
00061     ENUM_AUTO(MFST_ERR_CRYPTO_MODE)\
00062     ENUM_AUTO(MFST_ERR_HASH)\
00063     ENUM_AUTO(MFST_ERR_GUID_VENDOR)\
00064     ENUM_AUTO(MFST_ERR_GUID_DEVCLASS)\
00065     ENUM_AUTO(MFST_ERR_GUID_DEVICE)\
00066     ENUM_AUTO(MFST_ERR_CFG_CREATE_FAILED)\
00067     ENUM_AUTO(MFST_ERR_KEY_SIZE)\
00068     ENUM_AUTO(MFST_ERR_CERT_INVALID)\
00069     ENUM_AUTO(MFST_ERR_CERT_NOT_FOUND)\
00070     ENUM_AUTO(MFST_ERR_CERT_READ)\
00071     ENUM_AUTO(MFST_ERR_INVALID_SIGNATURE)\
00072     ENUM_AUTO(MFST_ERR_INVALID_STATE)\
00073     ENUM_AUTO(MFST_ERR_BAD_EVENT)\
00074     ENUM_AUTO(MFST_ERR_EMPTY_FIELD)\
00075     ENUM_AUTO(MFST_ERR_NO_MANIFEST)\
00076     ENUM_AUTO(MFST_ERR_SIGNATURE_ALGORITHM)\
00077     ENUM_AUTO(MFST_ERR_UNSUPPORTED_CONDITION)\
00078     ENUM_AUTO(MFST_ERR_CTR_IV_SIZE)\
00079     ENUM_AUTO(MFST_ERR_MISSING_KEYTABLE)\
00080     ENUM_AUTO(MFST_ERR_BAD_KEYTABLE)\
00081     ENUM_AUTO(MFST_ERR_LAST)\
00082 
00083 // Certificate Manager
00084 #define ARM_UC_CM_ERR_LIST\
00085     ENUM_FIXED(ARM_UC_CM_ERR_FIRST, CERTIFICATE_MANAGER_PREFIX << 16)\
00086     ENUM_AUTO(ARM_UC_CM_ERR_INVALID_PARAMETER)\
00087     ENUM_AUTO(ARM_UC_CM_ERR_NOT_FOUND)\
00088     ENUM_AUTO(ARM_UC_CM_ERR_INVALID_CERT)\
00089     ENUM_AUTO(ARM_UC_CM_ERR_BLACKLISTED)\
00090     ENUM_AUTO(ARM_UC_CM_ERR_LAST)\
00091 
00092 // DER Parser
00093 #define ARM_UC_DP_ERR_LIST\
00094     ENUM_FIXED(ARM_UC_DP_ERR_FIRST, DER_PARSER_PREFIX << 16)\
00095     ENUM_AUTO(ARM_UC_DP_ERR_UNKNOWN)\
00096     ENUM_AUTO(ARM_UC_DP_ERR_NOT_FOUND)\
00097     ENUM_AUTO(ARM_UC_DP_ERR_NO_MORE_ELEMENTS)\
00098     ENUM_AUTO(ARM_UC_DP_ERR_LAST)\
00099 
00100 // Source Manager
00101 #define ARM_UC_SM_ERR_LIST\
00102     ENUM_FIXED(SOMA_ERR_FIRST, SOURCE_MANAGER_PREFIX << 16)\
00103     ENUM_AUTO(SOMA_ERR_UNSPECIFIED)\
00104     ENUM_AUTO(SOMA_ERR_NETWORK_TIMEOUT)\
00105     ENUM_AUTO(SOMA_ERR_CONNECTION_FAILURE)\
00106     ENUM_AUTO(SOMA_ERR_DNS_LOOKUP_FAILURE)\
00107     ENUM_AUTO(SOMA_ERR_CONNECTION_LOSS)\
00108     ENUM_AUTO(SOMA_ERR_NO_ROUTE_TO_SOURCE)\
00109     ENUM_AUTO(SOMA_ERR_SOURCE_REGISTRY_FULL)\
00110     ENUM_AUTO(SOMA_ERR_SOURCE_NOT_FOUND)\
00111     ENUM_AUTO(SOMA_ERR_INVALID_URI)\
00112     ENUM_AUTO(SOMA_ERR_INVALID_REQUEST)\
00113     ENUM_AUTO(SOMA_ERR_INVALID_PARAMETER)\
00114     ENUM_AUTO(SOMA_ERR_INVALID_MANIFEST_STATE)\
00115     ENUM_AUTO(SOMA_ERR_INVALID_FW_STATE)\
00116     ENUM_AUTO(SOMA_ERR_INVALID_EVENT)\
00117     ENUM_AUTO(SOMA_ERR_LAST)\
00118 
00119 // Source
00120 #define ARM_UC_SRC_ERR_LIST\
00121     ENUM_FIXED(SRCE_ERR_FIRST, SOURCE_PREFIX << 16)\
00122     ENUM_AUTO(SRCE_ERR_UNINITIALIZED)\
00123     ENUM_AUTO(SRCE_ERR_INVALID_PARAMETER)\
00124     ENUM_AUTO(SRCE_ERR_FAILED)\
00125     ENUM_AUTO(SRCE_ERR_ABORT)\
00126     ENUM_AUTO(SRCE_ERR_BUSY)\
00127     ENUM_AUTO(SRCE_ERR_LAST)\
00128 
00129 // Firmware Manager
00130 #define ARM_UC_FM_ERR_LIST\
00131     ENUM_FIXED(FIRM_ERR_FIRST, FIRMWARE_MANAGER_PREFIX << 16)\
00132     ENUM_AUTO(FIRM_ERR_WRITE)\
00133     ENUM_AUTO(FIRM_ERR_INVALID_PARAMETER)\
00134     ENUM_AUTO(FIRM_ERR_INVALID_STATE)\
00135     ENUM_AUTO(FIRM_ERR_ACTIVATE)\
00136     ENUM_AUTO(FIRM_ERR_UNINITIALIZED)\
00137     ENUM_AUTO(FIRM_ERR_INVALID_HASH)\
00138     ENUM_AUTO(FIRM_ERR_FIRMWARE_TOO_LARGE)\
00139     ENUM_AUTO(FIRM_ERR_LAST)\
00140 
00141 #define ARM_UC_CU_ERR_LIST\
00142     ENUM_FIXED(ARM_UC_CU_ERR_FIRST, UPDATE_CRYPTO_PREFIX << 16)\
00143     ENUM_AUTO(ARM_UC_CU_ERR_INVALID_PARAMETER)\
00144     ENUM_AUTO(ARM_UC_CU_ERR_LAST)\
00145 
00146 #define ARM_UC_DI_ERR_LIST\
00147     ENUM_FIXED(ARM_UC_DI_ERR_FIRST, DEVICE_IDENTITY_PREFIX << 16)\
00148     ENUM_AUTO(ARM_UC_DI_ERR_INVALID_PARAMETER)\
00149     ENUM_AUTO(ARM_UC_DI_ERR_NOT_READY)\
00150     ENUM_AUTO(ARM_UC_DI_ERR_NOT_FOUND)\
00151     ENUM_AUTO(ARM_UC_DI_ERR_SIZE)\
00152     ENUM_AUTO(ARM_UC_DI_ERR_LAST)\
00153 
00154 #define ARM_UC_HB_ERR_LIST\
00155     ENUM_FIXED(HUB_ERR_FIRST, HUB_PREFIX << 16)\
00156     ENUM_AUTO(HUB_ERR_INTERNAL_ERROR)\
00157     ENUM_AUTO(HUB_ERR_ROLLBACK_PROTECTION)\
00158     ENUM_AUTO(ARM_UC_HUB_ERR_NOT_AVAILABLE)\
00159     ENUM_AUTO(HUB_ERR_CONNECTION)\
00160     ENUM_AUTO(HUB_ERR_LAST)\
00161 
00162 #define ARM_UC_EQ_ERR_LIST\
00163     ENUM_FIXED(ARM_UC_EQ_ERR_FIRST, EVENT_QUEUE_PREFIX << 16)\
00164     ENUM_AUTO(ARM_UC_EQ_ERR_POOL_EXHAUSTED)\
00165     ENUM_AUTO(ARM_UC_EQ_ERR_FAILED_TAKE)\
00166     ENUM_AUTO(ARM_UC_EQ_ERR_LAST)\
00167 
00168 // PAAL
00169 #define ARM_UC_PAAL_ERR_LIST\
00170     ENUM_FIXED(PAAL_ERR_FIRST, PAAL_PREFIX << 16)\
00171     ENUM_AUTO(PAAL_ERR_FIRMWARE_TOO_LARGE)\
00172     ENUM_AUTO(PAAL_ERR_LAST)\
00173 
00174 #define ARM_UC_ERR_LIST\
00175     ARM_UC_COMMON_ERR_LIST\
00176     ARM_UC_MM_ERR_LIST\
00177     ARM_UC_CM_ERR_LIST\
00178     ARM_UC_DP_ERR_LIST\
00179     ARM_UC_SM_ERR_LIST\
00180     ARM_UC_SRC_ERR_LIST\
00181     ARM_UC_FM_ERR_LIST\
00182     ARM_UC_CU_ERR_LIST\
00183     ARM_UC_DI_ERR_LIST\
00184     ARM_UC_HB_ERR_LIST\
00185     ARM_UC_EQ_ERR_LIST\
00186     ARM_UC_PAAL_ERR_LIST\
00187 
00188 enum arm_uc_error {
00189 #define ENUM_AUTO(name) name,
00190 #define ENUM_FIXED(name, val) name = val,
00191     ARM_UC_ERR_LIST
00192 #undef ENUM_AUTO
00193 #undef ENUM_FIXED
00194 };
00195 union arm_uc_error_code {
00196     int32_t code;
00197     struct {
00198         int16_t error;
00199         union {
00200             uint16_t module;
00201             uint8_t  modulecc[2];
00202         };
00203     };
00204 };
00205 
00206 typedef union arm_uc_error_code arm_uc_error_t;
00207 
00208 #define ARM_UC_ERROR(CODE)              ((arm_uc_error_t){ CODE })
00209 #define ARM_UC_IS_ERROR(VAR)            ((VAR).code != ERR_NONE)
00210 #define ARM_UC_IS_NOT_ERROR(VAR)        (!ARM_UC_IS_ERROR(VAR))
00211 #define ARM_UC_ERROR_MATCHES(VAR,CODE)  ((VAR).code == CODE)
00212 
00213 #define ARM_UC_CLEAR_ERROR(ERR)         ((ERR).code = (ERR_NONE))
00214 #define ARM_UC_INIT_ERROR(VAR, CODE)    arm_uc_error_t (VAR) = arm_uc_code_to_error( CODE )
00215 #define ARM_UC_GET_ERROR(VAR)           ((VAR).code)
00216 
00217 #if ARM_UC_ERROR_TRACE_ENABLE
00218 #define ARM_UC_SET_ERROR(VAR, CODE)\
00219     do { (VAR).code = (CODE);\
00220     if ( ARM_UC_IS_ERROR(VAR) ) \
00221         UC_ERROR_TRACE("set error %" PRIx32, (long unsigned int)CODE);\
00222     } while (0)
00223 #else
00224 #define ARM_UC_SET_ERROR(VAR, CODE)                 (VAR).code = (CODE)
00225 #endif
00226 // have a way to set errors without trace for values that are not strictly errors.
00227 #define ARM_UC_SET_ERROR_NEVER_TRACE(VAR, CODE)     (VAR).code = (CODE)
00228 
00229 #ifdef __cplusplus
00230 extern "C" {
00231 #endif
00232 
00233 const char *ARM_UC_err2Str(arm_uc_error_t err);
00234 static inline arm_uc_error_t arm_uc_code_to_error(int32_t code)
00235 {
00236     arm_uc_error_t err;
00237     err.code = code;
00238     return err;
00239 }
00240 
00241 #ifdef __cplusplus
00242 }
00243 #endif
00244 #endif // ARM_UPDATE_ERROR_H