1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* ---------------------------------------------------------------------------- 3 * File: custom_log.h 4 * 5 * Desc: ChenZhen 偏好的 log 输出的定制实现. 6 * 7 * -------------------------------------------------------------------- 8 * < 习语 和 缩略语 > : 9 * 10 * -------------------------------------------------------------------- 11 * Usage: 12 * 13 * Note: 14 * 15 * Author: ChenZhen 16 * 17 * ---------------------------------------------------------------------------- 18 * Version: 19 * v1.0 20 * ---------------------------------------------------------------------------- 21 * Log: 22 ----Fri Nov 19 15:20:28 2010 v1.0 23 * 24 * ---------------------------------------------------------------------------- 25 */ 26 27 #ifndef __CUSTOM_LOG_H__ 28 #define __CUSTOM_LOG_H__ 29 30 #ifdef __cplusplus 31 extern "C" { 32 #endif 33 34 /* ----------------------------------------------------------------------------- 35 * Include Files 36 * ----------------------------------------------------------------------------- 37 */ 38 #include <linux/kernel.h> 39 #include <linux/printk.h> 40 41 /* ----------------------------------------------------------------------------- 42 * Macros Definition 43 * ----------------------------------------------------------------------------- 44 */ 45 46 /** 若下列 macro 有被定义, 才 使能 log 输出. */ 47 /* #define ENABLE_DEBUG_LOG */ 48 49 /*----------------------------------------------------------------------------*/ 50 51 #ifdef ENABLE_VERBOSE_LOG 52 /** Verbose log. */ 53 #define V(fmt, args...) \ 54 pr_debug("V : [File] : %s; [Line] : %d; [Func] : %s(); " fmt \ 55 "\n", \ 56 __FILE__, \ 57 __LINE__, \ 58 __func__, \ 59 ## args) 60 #else 61 #define V(...) ((void)0) 62 #endif 63 64 #ifdef ENABLE_DEBUG_LOG 65 /** Debug log. */ 66 #define D(fmt, args...) \ 67 pr_info("D : [File] : %s; [Line] : %d; [Func] : %s(); " fmt \ 68 "\n", \ 69 __FILE__, \ 70 __LINE__, \ 71 __func__, \ 72 ## args) 73 #else 74 #define D(...) ((void)0) 75 #endif 76 77 #define I(fmt, args...) \ 78 pr_info("I : [File] : %s; [Line] : %d; [Func] : %s(); " fmt \ 79 "\n", \ 80 __FILE__, \ 81 __LINE__, \ 82 __func__, \ 83 ## args) 84 85 #define W(fmt, args...) \ 86 pr_warn("W : [File] : %s; [Line] : %d; [Func] : %s(); " \ 87 fmt "\n", \ 88 __FILE__, \ 89 __LINE__, \ 90 __func__, \ 91 ## args) 92 93 #define E(fmt, args...) \ 94 pr_err("E : [File] : %s; [Line] : %d; [Func] : %s(); " fmt \ 95 "\n", \ 96 __FILE__, \ 97 __LINE__, \ 98 __func__, \ 99 ## args) 100 101 /*-------------------------------------------------------*/ 102 103 /** 使用 D(), 以十进制的形式打印变量 'var' 的 value. */ 104 #define D_DEC(var) D(#var " = %d.", var) 105 106 #define E_DEC(var) E(#var " = %d.", var) 107 108 /** 使用 D(), 以十六进制的形式打印变量 'var' 的 value. */ 109 #define D_HEX(var) D(#var " = 0x%x.", var) 110 111 #define E_HEX(var) E(#var " = 0x%x.", var) 112 113 /** 114 * 使用 D(), 以十六进制的形式, 115 * 打印指针类型变量 'ptr' 的 value. 116 */ 117 #define D_PTR(ptr) D(#ptr " = %p.", ptr) 118 119 #define E_PTR(ptr) E(#ptr " = %p.", ptr) 120 121 /** 使用 D(), 打印 char 字串. */ 122 #define D_STR(p_str) \ 123 do { \ 124 if (!p_str) { \ 125 D(#p_str " = NULL."); \ 126 else \ 127 D(#p_str " = '%s'.", p_str); \ 128 } while (0) 129 130 #define E_STR(p_str) \ 131 do { \ 132 if (!p_str) \ 133 E(#p_str " = NULL."); \ 134 else \ 135 E(#p_str " = '%s'.", p_str); \ 136 } while (0) 137 138 #ifdef ENABLE_DEBUG_LOG 139 /** 140 * log 从 'p_start' 地址开始的 'len' 个字节的数据. 141 */ 142 #define D_MEM(p_start, len) \ 143 do { \ 144 int i = 0; \ 145 char *p = (char *)(p_start); \ 146 D("dump memory from addr of '" #p_start "', from %p, length %d' : ", \ 147 (p_start), \ 148 (len)); \ 149 pr_debug("\t\t"); \ 150 for (i = 0; i < (len); i++) \ 151 pr_debug("0x%02x, ", p[i]); \ 152 pr_debug("\n"); \ 153 } while (0) 154 #else 155 #define D_MEM(...) ((void)0) 156 #endif 157 158 /*-------------------------------------------------------*/ 159 160 /** 161 * 在特定条件下, 判定 error 发生, 162 * 将变量 'ret_var' 设置 'err_code', 163 * log 输出对应的 Error Caution, 164 * 然后跳转 'label' 指定的代码处执行. 165 * @param msg 166 * 纯字串形式的提示信息. 167 * @param ret_var 168 * 标识函数执行状态或者结果的变量, 169 * 将被设置具体的 Error Code. 170 * 通常是 'ret' or 'result'. 171 * @param err_code 172 * 表征特定 error 的常数标识, 173 * 通常是 宏的形态. 174 * @param label 175 * 程序将要跳转到的错误处理代码的标号, 176 * 通常就是 'EXIT'. 177 * @param args... 178 * 对应 'msg_fmt' 实参中, 179 * '%s', '%d', ... 等转换说明符的具体可变长实参. 180 */ 181 #define SET_ERROR_AND_JUMP(msg_fmt, ret_var, err_code, label, args...) \ 182 do { \ 183 E("To set '" #ret_var "' to %d('" #err_code "'), because : " msg_fmt, \ 184 (err_code), \ 185 ## args); \ 186 (ret_var) = (err_code); \ 187 goto label; \ 188 } while (0) 189 190 /* ----------------------------------------------------------------------------- 191 * Types and Structures Definition 192 * ----------------------------------------------------------------------------- 193 */ 194 195 /* ----------------------------------------------------------------------------- 196 * Global Functions' Prototype 197 * ----------------------------------------------------------------------------- 198 */ 199 200 /* ----------------------------------------------------------------------------- 201 * Inline Functions Implementation 202 * ----------------------------------------------------------------------------- 203 */ 204 205 #ifdef __cplusplus 206 } 207 #endif 208 209 #endif /* __CUSTOM_LOG_H__ */ 210