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 __FBSDID("$FreeBSD$"); 35 36 #include <dev/isci/isci.h> 37 38 #include <dev/isci/scil/scif_user_callback.h> 39 #include <dev/isci/scil/scic_user_callback.h> 40 #include <dev/isci/scil/sci_logger.h> 41 42 #include <machine/stdarg.h> 43 #include <sys/time.h> 44 45 #define ERROR_LEVEL 0 46 #define WARNING_LEVEL 1 47 #define TRACE_LEVEL 2 48 #define INFO_LEVEL 3 49 50 void 51 isci_log_message(uint32_t verbosity, char *log_message_prefix, 52 char *log_message, ...) 53 { 54 va_list argp; 55 char buffer[512]; 56 struct timeval tv; 57 58 if (verbosity > g_isci_debug_level) 59 return; 60 61 va_start (argp, log_message); 62 vsnprintf(buffer, sizeof(buffer)-1, log_message, argp); 63 va_end(argp); 64 microtime(&tv); 65 66 printf("isci: %d:%06d %s %s", (int)tv.tv_sec, (int)tv.tv_usec, 67 log_message_prefix, buffer); 68 } 69 70 71 #ifdef SCI_LOGGING 72 #define SCI_ENABLE_LOGGING_ERROR 1 73 #define SCI_ENABLE_LOGGING_WARNING 1 74 #define SCI_ENABLE_LOGGING_INFO 1 75 #define SCI_ENABLE_LOGGING_TRACE 1 76 #define SCI_ENABLE_LOGGING_STATES 1 77 78 #define ISCI_LOG_MESSAGE( \ 79 logger_object, \ 80 log_object_mask, \ 81 log_message, \ 82 verbosity, \ 83 log_message_prefix \ 84 ) \ 85 { \ 86 va_list argp; \ 87 char buffer[512]; \ 88 \ 89 if (!sci_logger_is_enabled(logger_object, log_object_mask, verbosity)) \ 90 return; \ 91 \ 92 va_start (argp, log_message); \ 93 vsnprintf(buffer, sizeof(buffer)-1, log_message, argp); \ 94 va_end(argp); \ 95 \ 96 /* prepend the "object:verbosity_level:" */ \ 97 isci_log_message(verbosity, log_message_prefix, buffer); \ 98 } 99 #endif /* SCI_LOGGING */ 100 101 102 #ifdef SCI_ENABLE_LOGGING_ERROR 103 /** 104 * @brief In this method the user is expected to log the supplied 105 * error information. The user must be capable of handling variable 106 * length argument lists and should consider prepending the fact 107 * that this is an error from the framework. 108 * 109 * @param[in] logger_object This parameter specifies the logger object 110 * associated with this message. 111 * @param[in] log_object_mask This parameter specifies the log objects 112 * for which this message is being generated. 113 * @param[in] log_message This parameter specifies the message to be logged. 114 * 115 * @return none 116 */ 117 void scif_cb_logger_log_error(SCI_LOGGER_HANDLE_T logger_object, 118 uint32_t log_object_mask, char *log_message, ...) 119 { 120 121 ISCI_LOG_MESSAGE(logger_object, log_object_mask, log_message, 122 SCI_LOG_VERBOSITY_ERROR, "FRAMEWORK: ERROR: "); 123 } 124 #endif 125 126 #ifdef SCI_ENABLE_LOGGING_WARNING 127 /** 128 * @brief In this method the user is expected to log the supplied warning 129 * information. The user must be capable of handling variable 130 * length argument lists and should consider prepending the fact 131 * that this is a warning from the framework. 132 * 133 * @param[in] logger_object This parameter specifies the logger object 134 * associated with this message. 135 * @param[in] log_object_mask This parameter specifies the log objects 136 * for which this message is being generated. 137 * @param[in] log_message This parameter specifies the message to be logged. 138 * 139 * @return none 140 */ 141 void 142 scif_cb_logger_log_warning(SCI_LOGGER_HANDLE_T logger_object, 143 uint32_t log_object_mask, char *log_message, ...) 144 { 145 146 ISCI_LOG_MESSAGE(logger_object, log_object_mask, log_message, 147 SCI_LOG_VERBOSITY_WARNING, "FRAMEWORK: WARNING: "); 148 } 149 #endif 150 151 #ifdef SCI_ENABLE_LOGGING_INFO 152 /** 153 * @brief In this method the user is expected to log the supplied debug 154 * information. The user must be capable of handling variable 155 * length argument lists and should consider prepending the fact 156 * that this is a debug message from the framework. 157 * 158 * @param[in] logger_object This parameter specifies the logger object 159 * associated with this message. 160 * @param[in] log_object_mask This parameter specifies the log objects 161 * for which this message is being generated. 162 * @param[in] log_message This parameter specifies the message to be logged. 163 * 164 * @return none 165 */ 166 void 167 scif_cb_logger_log_info(SCI_LOGGER_HANDLE_T logger_object, 168 uint32_t log_object_mask, char *log_message, ...) 169 { 170 171 ISCI_LOG_MESSAGE(logger_object, log_object_mask, log_message, 172 SCI_LOG_VERBOSITY_INFO, "FRAMEWORK: INFO: "); 173 } 174 #endif 175 176 #ifdef SCI_ENABLE_LOGGING_TRACE 177 /** 178 * @brief In this method the user is expected to log the supplied function 179 * trace information. The user must be capable of handling variable 180 * length argument lists and should consider prepending the fact 181 * that this is a function trace (i.e. entry/exit) message from the 182 * framework. 183 * 184 * @param[in] logger_object This parameter specifies the logger object 185 * associated with this message. 186 * @param[in] log_object_mask This parameter specifies the log objects 187 * for which this message is being generated. 188 * @param[in] log_message This parameter specifies the message to be logged. 189 * 190 * @return none 191 */ 192 void 193 scif_cb_logger_log_trace(SCI_LOGGER_HANDLE_T logger_object, 194 uint32_t log_object_mask, char *log_message, ...) 195 { 196 197 ISCI_LOG_MESSAGE(logger_object, log_object_mask, log_message, 198 SCI_LOG_VERBOSITY_TRACE, "FRAMEWORK: TRACE: "); 199 } 200 #endif 201 202 #ifdef SCI_ENABLE_LOGGING_STATES 203 /** 204 * @brief In this method the user is expected to log the supplied function 205 * state transition information. The user must be capable of handling 206 * variable length argument lists and should consider prepending the 207 * fact that this is a function trace (i.e. entry/exit) message from 208 * the framework. 209 * 210 * @param[in] logger_object This parameter specifies the logger object 211 * associated with this message. 212 * @param[in] log_object_mask This parameter specifies the log objects 213 * for which this message is being generated. 214 * @param[in] log_message This parameter specifies the message to be logged. 215 * 216 * @return none 217 */ 218 void 219 scif_cb_logger_log_states(SCI_LOGGER_HANDLE_T logger_object, 220 uint32_t log_object_mask, char *log_message, ...) 221 { 222 223 ISCI_LOG_MESSAGE(logger_object, log_object_mask, log_message, 224 SCI_LOG_VERBOSITY_STATES, "FRAMEWORK: STATE TRANSITION: "); 225 } 226 #endif 227 228 #ifdef SCI_ENABLE_LOGGING_ERROR 229 /** 230 * @brief In this method the user is expected to log the supplied 231 * error information. The user must be capable of handling variable 232 * length argument lists and should consider prepending the fact 233 * that this is an error from the core. 234 * 235 * @param[in] logger_object This parameter specifies the logger object 236 * associated with this message. 237 * @param[in] log_object_mask This parameter specifies the log objects 238 * for which this message is being generated. 239 * @param[in] log_message This parameter specifies the message to be logged. 240 * 241 * @return none 242 */ 243 void 244 scic_cb_logger_log_error(SCI_LOGGER_HANDLE_T logger_object, 245 uint32_t log_object_mask, char *log_message, ...) 246 { 247 248 ISCI_LOG_MESSAGE(logger_object, log_object_mask, log_message, 249 SCI_LOG_VERBOSITY_ERROR, "CORE: ERROR: "); 250 } 251 #endif 252 253 #ifdef SCI_ENABLE_LOGGING_WARNING 254 /** 255 * @brief In this method the user is expected to log the supplied warning 256 * information. The user must be capable of handling variable 257 * length argument lists and should consider prepending the fact 258 * that this is a warning from the core. 259 * 260 * @param[in] logger_object This parameter specifies the logger object 261 * associated with this message. 262 * @param[in] log_object_mask This parameter specifies the log objects 263 * for which this message is being generated. 264 * @param[in] log_message This parameter specifies the message to be logged. 265 * 266 * @return none 267 */ 268 void 269 scic_cb_logger_log_warning(SCI_LOGGER_HANDLE_T logger_object, 270 uint32_t log_object_mask, char *log_message, ...) 271 { 272 273 ISCI_LOG_MESSAGE(logger_object, log_object_mask, log_message, 274 SCI_LOG_VERBOSITY_WARNING, "CORE: WARNING: "); 275 } 276 #endif 277 278 #ifdef SCI_ENABLE_LOGGING_INFO 279 /** 280 * @brief In this method the user is expected to log the supplied debug 281 * information. The user must be capable of handling variable 282 * length argument lists and should consider prepending the fact 283 * that this is a debug message from the core. 284 * 285 * @param[in] logger_object This parameter specifies the logger object 286 * associated with this message. 287 * @param[in] log_object_mask This parameter specifies the log objects 288 * for which this message is being generated. 289 * @param[in] log_message This parameter specifies the message to be logged. 290 * 291 * @return none 292 */ 293 void 294 scic_cb_logger_log_info(SCI_LOGGER_HANDLE_T logger_object, 295 uint32_t log_object_mask, char *log_message, ...) 296 { 297 298 ISCI_LOG_MESSAGE(logger_object, log_object_mask, log_message, 299 SCI_LOG_VERBOSITY_INFO, "CORE: INFO: "); 300 } 301 #endif 302 303 #ifdef SCI_ENABLE_LOGGING_TRACE 304 /** 305 * @brief In this method the user is expected to log the supplied function 306 * trace information. The user must be capable of handling variable 307 * length argument lists and should consider prepending the fact 308 * that this is a function trace (i.e. entry/exit) message from the 309 * core. 310 * 311 * @param[in] logger_object This parameter specifies the logger object 312 * associated with this message. 313 * @param[in] log_object_mask This parameter specifies the log objects 314 * for which this message is being generated. 315 * @param[in] log_message This parameter specifies the message to be logged. 316 * 317 * @return none 318 */ 319 void 320 scic_cb_logger_log_trace(SCI_LOGGER_HANDLE_T logger_object, 321 uint32_t log_object_mask, char *log_message, ...) 322 { 323 324 ISCI_LOG_MESSAGE(logger_object, log_object_mask, log_message, 325 SCI_LOG_VERBOSITY_TRACE, "CORE: TRACE: "); 326 } 327 #endif 328 329 #ifdef SCI_ENABLE_LOGGING_STATES 330 /** 331 * @brief In this method the user is expected to log the supplied function 332 * state transition information. The user must be capable of handling 333 * variable length argument lists and should consider prepending the 334 * fact that this is a function trace (i.e. entry/exit) message from 335 * the core. 336 * 337 * @param[in] logger_object This parameter specifies the logger object 338 * associated with this message. 339 * @param[in] log_object_mask This parameter specifies the log objects 340 * for which this message is being generated. 341 * @param[in] log_message This parameter specifies the message to be logged. 342 * 343 * @return none 344 */ 345 void 346 scic_cb_logger_log_states(SCI_LOGGER_HANDLE_T logger_object, 347 uint32_t log_object_mask, char *log_message, ...) 348 { 349 350 ISCI_LOG_MESSAGE(logger_object, log_object_mask, log_message, 351 SCI_LOG_VERBOSITY_STATES, "CORE: STATE TRANSITION: "); 352 } 353 #endif 354