1 /*- 2 * SPDX-License-Identifier: BSD-2-Clause 3 * 4 * BSD LICENSE 5 * 6 * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved. 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 13 * * Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * * Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in 17 * the documentation and/or other materials provided with the 18 * distribution. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 #include <sys/cdefs.h> 34 #include <dev/isci/isci.h> 35 36 #include <dev/isci/scil/scif_user_callback.h> 37 #include <dev/isci/scil/scic_user_callback.h> 38 #include <dev/isci/scil/sci_logger.h> 39 40 #include <machine/stdarg.h> 41 #include <sys/time.h> 42 43 #define ERROR_LEVEL 0 44 #define WARNING_LEVEL 1 45 #define TRACE_LEVEL 2 46 #define INFO_LEVEL 3 47 48 void 49 isci_log_message(uint32_t verbosity, char *log_message_prefix, 50 char *log_message, ...) 51 { 52 va_list argp; 53 char buffer[512]; 54 struct timeval tv; 55 56 if (verbosity > g_isci_debug_level) 57 return; 58 59 va_start (argp, log_message); 60 vsnprintf(buffer, sizeof(buffer)-1, log_message, argp); 61 va_end(argp); 62 microtime(&tv); 63 64 printf("isci: %d:%06d %s %s", (int)tv.tv_sec, (int)tv.tv_usec, 65 log_message_prefix, buffer); 66 } 67 68 69 #ifdef SCI_LOGGING 70 #define SCI_ENABLE_LOGGING_ERROR 1 71 #define SCI_ENABLE_LOGGING_WARNING 1 72 #define SCI_ENABLE_LOGGING_INFO 1 73 #define SCI_ENABLE_LOGGING_TRACE 1 74 #define SCI_ENABLE_LOGGING_STATES 1 75 76 #define ISCI_LOG_MESSAGE( \ 77 logger_object, \ 78 log_object_mask, \ 79 log_message, \ 80 verbosity, \ 81 log_message_prefix \ 82 ) \ 83 { \ 84 va_list argp; \ 85 char buffer[512]; \ 86 \ 87 if (!sci_logger_is_enabled(logger_object, log_object_mask, verbosity)) \ 88 return; \ 89 \ 90 va_start (argp, log_message); \ 91 vsnprintf(buffer, sizeof(buffer)-1, log_message, argp); \ 92 va_end(argp); \ 93 \ 94 /* prepend the "object:verbosity_level:" */ \ 95 isci_log_message(verbosity, log_message_prefix, buffer); \ 96 } 97 #endif /* SCI_LOGGING */ 98 99 100 #ifdef SCI_ENABLE_LOGGING_ERROR 101 /** 102 * @brief In this method the user is expected to log the supplied 103 * error information. The user must be capable of handling variable 104 * length argument lists and should consider prepending the fact 105 * that this is an error from the framework. 106 * 107 * @param[in] logger_object This parameter specifies the logger object 108 * associated with this message. 109 * @param[in] log_object_mask This parameter specifies the log objects 110 * for which this message is being generated. 111 * @param[in] log_message This parameter specifies the message to be logged. 112 * 113 * @return none 114 */ 115 void scif_cb_logger_log_error(SCI_LOGGER_HANDLE_T logger_object, 116 uint32_t log_object_mask, char *log_message, ...) 117 { 118 119 ISCI_LOG_MESSAGE(logger_object, log_object_mask, log_message, 120 SCI_LOG_VERBOSITY_ERROR, "FRAMEWORK: ERROR: "); 121 } 122 #endif 123 124 #ifdef SCI_ENABLE_LOGGING_WARNING 125 /** 126 * @brief In this method the user is expected to log the supplied warning 127 * information. The user must be capable of handling variable 128 * length argument lists and should consider prepending the fact 129 * that this is a warning from the framework. 130 * 131 * @param[in] logger_object This parameter specifies the logger object 132 * associated with this message. 133 * @param[in] log_object_mask This parameter specifies the log objects 134 * for which this message is being generated. 135 * @param[in] log_message This parameter specifies the message to be logged. 136 * 137 * @return none 138 */ 139 void 140 scif_cb_logger_log_warning(SCI_LOGGER_HANDLE_T logger_object, 141 uint32_t log_object_mask, char *log_message, ...) 142 { 143 144 ISCI_LOG_MESSAGE(logger_object, log_object_mask, log_message, 145 SCI_LOG_VERBOSITY_WARNING, "FRAMEWORK: WARNING: "); 146 } 147 #endif 148 149 #ifdef SCI_ENABLE_LOGGING_INFO 150 /** 151 * @brief In this method the user is expected to log the supplied debug 152 * information. The user must be capable of handling variable 153 * length argument lists and should consider prepending the fact 154 * that this is a debug message from the framework. 155 * 156 * @param[in] logger_object This parameter specifies the logger object 157 * associated with this message. 158 * @param[in] log_object_mask This parameter specifies the log objects 159 * for which this message is being generated. 160 * @param[in] log_message This parameter specifies the message to be logged. 161 * 162 * @return none 163 */ 164 void 165 scif_cb_logger_log_info(SCI_LOGGER_HANDLE_T logger_object, 166 uint32_t log_object_mask, char *log_message, ...) 167 { 168 169 ISCI_LOG_MESSAGE(logger_object, log_object_mask, log_message, 170 SCI_LOG_VERBOSITY_INFO, "FRAMEWORK: INFO: "); 171 } 172 #endif 173 174 #ifdef SCI_ENABLE_LOGGING_TRACE 175 /** 176 * @brief In this method the user is expected to log the supplied function 177 * trace information. The user must be capable of handling variable 178 * length argument lists and should consider prepending the fact 179 * that this is a function trace (i.e. entry/exit) message from the 180 * framework. 181 * 182 * @param[in] logger_object This parameter specifies the logger object 183 * associated with this message. 184 * @param[in] log_object_mask This parameter specifies the log objects 185 * for which this message is being generated. 186 * @param[in] log_message This parameter specifies the message to be logged. 187 * 188 * @return none 189 */ 190 void 191 scif_cb_logger_log_trace(SCI_LOGGER_HANDLE_T logger_object, 192 uint32_t log_object_mask, char *log_message, ...) 193 { 194 195 ISCI_LOG_MESSAGE(logger_object, log_object_mask, log_message, 196 SCI_LOG_VERBOSITY_TRACE, "FRAMEWORK: TRACE: "); 197 } 198 #endif 199 200 #ifdef SCI_ENABLE_LOGGING_STATES 201 /** 202 * @brief In this method the user is expected to log the supplied function 203 * state transition information. The user must be capable of handling 204 * variable length argument lists and should consider prepending the 205 * fact that this is a function trace (i.e. entry/exit) message from 206 * the framework. 207 * 208 * @param[in] logger_object This parameter specifies the logger object 209 * associated with this message. 210 * @param[in] log_object_mask This parameter specifies the log objects 211 * for which this message is being generated. 212 * @param[in] log_message This parameter specifies the message to be logged. 213 * 214 * @return none 215 */ 216 void 217 scif_cb_logger_log_states(SCI_LOGGER_HANDLE_T logger_object, 218 uint32_t log_object_mask, char *log_message, ...) 219 { 220 221 ISCI_LOG_MESSAGE(logger_object, log_object_mask, log_message, 222 SCI_LOG_VERBOSITY_STATES, "FRAMEWORK: STATE TRANSITION: "); 223 } 224 #endif 225 226 #ifdef SCI_ENABLE_LOGGING_ERROR 227 /** 228 * @brief In this method the user is expected to log the supplied 229 * error information. The user must be capable of handling variable 230 * length argument lists and should consider prepending the fact 231 * that this is an error from the core. 232 * 233 * @param[in] logger_object This parameter specifies the logger object 234 * associated with this message. 235 * @param[in] log_object_mask This parameter specifies the log objects 236 * for which this message is being generated. 237 * @param[in] log_message This parameter specifies the message to be logged. 238 * 239 * @return none 240 */ 241 void 242 scic_cb_logger_log_error(SCI_LOGGER_HANDLE_T logger_object, 243 uint32_t log_object_mask, char *log_message, ...) 244 { 245 246 ISCI_LOG_MESSAGE(logger_object, log_object_mask, log_message, 247 SCI_LOG_VERBOSITY_ERROR, "CORE: ERROR: "); 248 } 249 #endif 250 251 #ifdef SCI_ENABLE_LOGGING_WARNING 252 /** 253 * @brief In this method the user is expected to log the supplied warning 254 * information. The user must be capable of handling variable 255 * length argument lists and should consider prepending the fact 256 * that this is a warning from the core. 257 * 258 * @param[in] logger_object This parameter specifies the logger object 259 * associated with this message. 260 * @param[in] log_object_mask This parameter specifies the log objects 261 * for which this message is being generated. 262 * @param[in] log_message This parameter specifies the message to be logged. 263 * 264 * @return none 265 */ 266 void 267 scic_cb_logger_log_warning(SCI_LOGGER_HANDLE_T logger_object, 268 uint32_t log_object_mask, char *log_message, ...) 269 { 270 271 ISCI_LOG_MESSAGE(logger_object, log_object_mask, log_message, 272 SCI_LOG_VERBOSITY_WARNING, "CORE: WARNING: "); 273 } 274 #endif 275 276 #ifdef SCI_ENABLE_LOGGING_INFO 277 /** 278 * @brief In this method the user is expected to log the supplied debug 279 * information. The user must be capable of handling variable 280 * length argument lists and should consider prepending the fact 281 * that this is a debug message from the core. 282 * 283 * @param[in] logger_object This parameter specifies the logger object 284 * associated with this message. 285 * @param[in] log_object_mask This parameter specifies the log objects 286 * for which this message is being generated. 287 * @param[in] log_message This parameter specifies the message to be logged. 288 * 289 * @return none 290 */ 291 void 292 scic_cb_logger_log_info(SCI_LOGGER_HANDLE_T logger_object, 293 uint32_t log_object_mask, char *log_message, ...) 294 { 295 296 ISCI_LOG_MESSAGE(logger_object, log_object_mask, log_message, 297 SCI_LOG_VERBOSITY_INFO, "CORE: INFO: "); 298 } 299 #endif 300 301 #ifdef SCI_ENABLE_LOGGING_TRACE 302 /** 303 * @brief In this method the user is expected to log the supplied function 304 * trace information. The user must be capable of handling variable 305 * length argument lists and should consider prepending the fact 306 * that this is a function trace (i.e. entry/exit) message from the 307 * core. 308 * 309 * @param[in] logger_object This parameter specifies the logger object 310 * associated with this message. 311 * @param[in] log_object_mask This parameter specifies the log objects 312 * for which this message is being generated. 313 * @param[in] log_message This parameter specifies the message to be logged. 314 * 315 * @return none 316 */ 317 void 318 scic_cb_logger_log_trace(SCI_LOGGER_HANDLE_T logger_object, 319 uint32_t log_object_mask, char *log_message, ...) 320 { 321 322 ISCI_LOG_MESSAGE(logger_object, log_object_mask, log_message, 323 SCI_LOG_VERBOSITY_TRACE, "CORE: TRACE: "); 324 } 325 #endif 326 327 #ifdef SCI_ENABLE_LOGGING_STATES 328 /** 329 * @brief In this method the user is expected to log the supplied function 330 * state transition information. The user must be capable of handling 331 * variable length argument lists and should consider prepending the 332 * fact that this is a function trace (i.e. entry/exit) message from 333 * the core. 334 * 335 * @param[in] logger_object This parameter specifies the logger object 336 * associated with this message. 337 * @param[in] log_object_mask This parameter specifies the log objects 338 * for which this message is being generated. 339 * @param[in] log_message This parameter specifies the message to be logged. 340 * 341 * @return none 342 */ 343 void 344 scic_cb_logger_log_states(SCI_LOGGER_HANDLE_T logger_object, 345 uint32_t log_object_mask, char *log_message, ...) 346 { 347 348 ISCI_LOG_MESSAGE(logger_object, log_object_mask, log_message, 349 SCI_LOG_VERBOSITY_STATES, "CORE: STATE TRANSITION: "); 350 } 351 #endif 352