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 50void 51isci_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 */ 117void 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 */ 141void 142scif_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 */ 166void 167scif_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 */ 192void 193scif_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 */ 218void 219scif_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 */ 243void 244scic_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 */ 268void 269scic_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 */ 293void 294scic_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 */ 319void 320scic_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 */ 345void 346scic_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