debug.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526
  1. /*
  2. * Linux WiMAX
  3. * Collection of tools to manage debug operations.
  4. *
  5. *
  6. * Copyright (C) 2005-2007 Intel Corporation
  7. * Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>
  8. *
  9. * This program is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU General Public License version
  11. * 2 as published by the Free Software Foundation.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to the Free Software
  20. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  21. * 02110-1301, USA.
  22. *
  23. *
  24. * Don't #include this file directly, read on!
  25. *
  26. *
  27. * EXECUTING DEBUGGING ACTIONS OR NOT
  28. *
  29. * The main thing this framework provides is decission power to take a
  30. * debug action (like printing a message) if the current debug level
  31. * allows it.
  32. *
  33. * The decission power is at two levels: at compile-time (what does
  34. * not make it is compiled out) and at run-time. The run-time
  35. * selection is done per-submodule (as they are declared by the user
  36. * of the framework).
  37. *
  38. * A call to d_test(L) (L being the target debug level) returns true
  39. * if the action should be taken because the current debug levels
  40. * allow it (both compile and run time).
  41. *
  42. * It follows that a call to d_test() that can be determined to be
  43. * always false at compile time will get the code depending on it
  44. * compiled out by optimization.
  45. *
  46. *
  47. * DEBUG LEVELS
  48. *
  49. * It is up to the caller to define how much a debugging level is.
  50. *
  51. * Convention sets 0 as "no debug" (so an action marked as debug level 0
  52. * will always be taken). The increasing debug levels are used for
  53. * increased verbosity.
  54. *
  55. *
  56. * USAGE
  57. *
  58. * Group the code in modules and submodules inside each module [which
  59. * in most cases maps to Linux modules and .c files that compose
  60. * those].
  61. *
  62. *
  63. * For each module, there is:
  64. *
  65. * - a MODULENAME (single word, legal C identifier)
  66. *
  67. * - a debug-levels.h header file that declares the list of
  68. * submodules and that is included by all .c files that use
  69. * the debugging tools. The file name can be anything.
  70. *
  71. * - some (optional) .c code to manipulate the runtime debug levels
  72. * through debugfs.
  73. *
  74. * The debug-levels.h file would look like:
  75. *
  76. * #ifndef __debug_levels__h__
  77. * #define __debug_levels__h__
  78. *
  79. * #define D_MODULENAME modulename
  80. * #define D_MASTER 10
  81. *
  82. * #include <linux/wimax/debug.h>
  83. *
  84. * enum d_module {
  85. * D_SUBMODULE_DECLARE(submodule_1),
  86. * D_SUBMODULE_DECLARE(submodule_2),
  87. * ...
  88. * D_SUBMODULE_DECLARE(submodule_N)
  89. * };
  90. *
  91. * #endif
  92. *
  93. * D_MASTER is the maximum compile-time debug level; any debug actions
  94. * above this will be out. D_MODULENAME is the module name (legal C
  95. * identifier), which has to be unique for each module (to avoid
  96. * namespace collisions during linkage). Note those #defines need to
  97. * be done before #including debug.h
  98. *
  99. * We declare N different submodules whose debug level can be
  100. * independently controlled during runtime.
  101. *
  102. * In a .c file of the module (and only in one of them), define the
  103. * following code:
  104. *
  105. * struct d_level D_LEVEL[] = {
  106. * D_SUBMODULE_DEFINE(submodule_1),
  107. * D_SUBMODULE_DEFINE(submodule_2),
  108. * ...
  109. * D_SUBMODULE_DEFINE(submodule_N),
  110. * };
  111. * size_t D_LEVEL_SIZE = ARRAY_SIZE(D_LEVEL);
  112. *
  113. * Externs for d_level_MODULENAME and d_level_size_MODULENAME are used
  114. * and declared in this file using the D_LEVEL and D_LEVEL_SIZE macros
  115. * #defined also in this file.
  116. *
  117. * To manipulate from user space the levels, create a debugfs dentry
  118. * and then register each submodule with:
  119. *
  120. * result = d_level_register_debugfs("PREFIX_", submodule_X, parent);
  121. * if (result < 0)
  122. * goto error;
  123. *
  124. * Where PREFIX_ is a name of your chosing. This will create debugfs
  125. * file with a single numeric value that can be use to tweak it. To
  126. * remove the entires, just use debugfs_remove_recursive() on 'parent'.
  127. *
  128. * NOTE: remember that even if this will show attached to some
  129. * particular instance of a device, the settings are *global*.
  130. *
  131. *
  132. * On each submodule (for example, .c files), the debug infrastructure
  133. * should be included like this:
  134. *
  135. * #define D_SUBMODULE submodule_x // matches one in debug-levels.h
  136. * #include "debug-levels.h"
  137. *
  138. * after #including all your include files.
  139. *
  140. *
  141. * Now you can use the d_*() macros below [d_test(), d_fnstart(),
  142. * d_fnend(), d_printf(), d_dump()].
  143. *
  144. * If their debug level is greater than D_MASTER, they will be
  145. * compiled out.
  146. *
  147. * If their debug level is lower or equal than D_MASTER but greater
  148. * than the current debug level of their submodule, they'll be
  149. * ignored.
  150. *
  151. * Otherwise, the action will be performed.
  152. */
  153. #ifndef __debug__h__
  154. #define __debug__h__
  155. #include <linux/types.h>
  156. #include <linux/slab.h>
  157. struct device;
  158. /* Backend stuff */
  159. /*
  160. * Debug backend: generate a message header from a 'struct device'
  161. *
  162. * @head: buffer where to place the header
  163. * @head_size: length of @head
  164. * @dev: pointer to device used to generate a header from. If NULL,
  165. * an empty ("") header is generated.
  166. */
  167. static inline
  168. void __d_head(char *head, size_t head_size,
  169. struct device *dev)
  170. {
  171. if (dev == NULL)
  172. head[0] = 0;
  173. else if ((unsigned long)dev < 4096) {
  174. printk(KERN_ERR "E: Corrupt dev %p\n", dev);
  175. WARN_ON(1);
  176. } else
  177. snprintf(head, head_size, "%s %s: ",
  178. dev_driver_string(dev), dev_name(dev));
  179. }
  180. /*
  181. * Debug backend: log some message if debugging is enabled
  182. *
  183. * @l: intended debug level
  184. * @tag: tag to prefix the message with
  185. * @dev: 'struct device' associated to this message
  186. * @f: printf-like format and arguments
  187. *
  188. * Note this is optimized out if it doesn't pass the compile-time
  189. * check; however, it is *always* compiled. This is useful to make
  190. * sure the printf-like formats and variables are always checked and
  191. * they don't get bit rot if you have all the debugging disabled.
  192. */
  193. #define _d_printf(l, tag, dev, f, a...) \
  194. do { \
  195. char head[64]; \
  196. if (!d_test(l)) \
  197. break; \
  198. __d_head(head, sizeof(head), dev); \
  199. printk(KERN_ERR "%s%s%s: " f, head, __func__, tag, ##a); \
  200. } while (0)
  201. /*
  202. * CPP sintatic sugar to generate A_B like symbol names when one of
  203. * the arguments is a a preprocessor #define.
  204. */
  205. #define __D_PASTE__(varname, modulename) varname##_##modulename
  206. #define __D_PASTE(varname, modulename) (__D_PASTE__(varname, modulename))
  207. #define _D_SUBMODULE_INDEX(_name) (D_SUBMODULE_DECLARE(_name))
  208. /*
  209. * Store a submodule's runtime debug level and name
  210. */
  211. struct d_level {
  212. u8 level;
  213. const char *name;
  214. };
  215. /*
  216. * List of available submodules and their debug levels
  217. *
  218. * We call them d_level_MODULENAME and d_level_size_MODULENAME; the
  219. * macros D_LEVEL and D_LEVEL_SIZE contain the name already for
  220. * convenience.
  221. *
  222. * This array and the size are defined on some .c file that is part of
  223. * the current module.
  224. */
  225. #define D_LEVEL __D_PASTE(d_level, D_MODULENAME)
  226. #define D_LEVEL_SIZE __D_PASTE(d_level_size, D_MODULENAME)
  227. extern struct d_level D_LEVEL[];
  228. extern size_t D_LEVEL_SIZE;
  229. /*
  230. * Frontend stuff
  231. *
  232. *
  233. * Stuff you need to declare prior to using the actual "debug" actions
  234. * (defined below).
  235. */
  236. #ifndef D_MODULENAME
  237. #error D_MODULENAME is not defined in your debug-levels.h file
  238. /**
  239. * D_MODULE - Name of the current module
  240. *
  241. * #define in your module's debug-levels.h, making sure it is
  242. * unique. This has to be a legal C identifier.
  243. */
  244. #define D_MODULENAME undefined_modulename
  245. #endif
  246. #ifndef D_MASTER
  247. #warning D_MASTER not defined, but debug.h included! [see docs]
  248. /**
  249. * D_MASTER - Compile time maximum debug level
  250. *
  251. * #define in your debug-levels.h file to the maximum debug level the
  252. * runtime code will be allowed to have. This allows you to provide a
  253. * main knob.
  254. *
  255. * Anything above that level will be optimized out of the compile.
  256. *
  257. * Defaults to zero (no debug code compiled in).
  258. *
  259. * Maximum one definition per module (at the debug-levels.h file).
  260. */
  261. #define D_MASTER 0
  262. #endif
  263. #ifndef D_SUBMODULE
  264. #error D_SUBMODULE not defined, but debug.h included! [see docs]
  265. /**
  266. * D_SUBMODULE - Name of the current submodule
  267. *
  268. * #define in your submodule .c file before #including debug-levels.h
  269. * to the name of the current submodule as previously declared and
  270. * defined with D_SUBMODULE_DECLARE() (in your module's
  271. * debug-levels.h) and D_SUBMODULE_DEFINE().
  272. *
  273. * This is used to provide runtime-control over the debug levels.
  274. *
  275. * Maximum one per .c file! Can be shared among different .c files
  276. * (meaning they belong to the same submodule categorization).
  277. */
  278. #define D_SUBMODULE undefined_module
  279. #endif
  280. /**
  281. * D_SUBMODULE_DECLARE - Declare a submodule for runtime debug level control
  282. *
  283. * @_name: name of the submodule, restricted to the chars that make up a
  284. * valid C identifier ([a-zA-Z0-9_]).
  285. *
  286. * Declare in the module's debug-levels.h header file as:
  287. *
  288. * enum d_module {
  289. * D_SUBMODULE_DECLARE(submodule_1),
  290. * D_SUBMODULE_DECLARE(submodule_2),
  291. * D_SUBMODULE_DECLARE(submodule_3),
  292. * };
  293. *
  294. * Some corresponding .c file needs to have a matching
  295. * D_SUBMODULE_DEFINE().
  296. */
  297. #define D_SUBMODULE_DECLARE(_name) __D_SUBMODULE_##_name
  298. /**
  299. * D_SUBMODULE_DEFINE - Define a submodule for runtime debug level control
  300. *
  301. * @_name: name of the submodule, restricted to the chars that make up a
  302. * valid C identifier ([a-zA-Z0-9_]).
  303. *
  304. * Use once per module (in some .c file) as:
  305. *
  306. * static
  307. * struct d_level d_level_SUBMODULENAME[] = {
  308. * D_SUBMODULE_DEFINE(submodule_1),
  309. * D_SUBMODULE_DEFINE(submodule_2),
  310. * D_SUBMODULE_DEFINE(submodule_3),
  311. * };
  312. * size_t d_level_size_SUBDMODULENAME = ARRAY_SIZE(d_level_SUBDMODULENAME);
  313. *
  314. * Matching D_SUBMODULE_DECLARE()s have to be present in a
  315. * debug-levels.h header file.
  316. */
  317. #define D_SUBMODULE_DEFINE(_name) \
  318. [__D_SUBMODULE_##_name] = { \
  319. .level = 0, \
  320. .name = #_name \
  321. }
  322. /* The actual "debug" operations */
  323. /**
  324. * d_test - Returns true if debugging should be enabled
  325. *
  326. * @l: intended debug level (unsigned)
  327. *
  328. * If the master debug switch is enabled and the current settings are
  329. * higher or equal to the requested level, then debugging
  330. * output/actions should be enabled.
  331. *
  332. * NOTE:
  333. *
  334. * This needs to be coded so that it can be evaluated in compile
  335. * time; this is why the ugly BUG_ON() is placed in there, so the
  336. * D_MASTER evaluation compiles all out if it is compile-time false.
  337. */
  338. #define d_test(l) \
  339. ({ \
  340. unsigned __l = l; /* type enforcer */ \
  341. (D_MASTER) >= __l \
  342. && ({ \
  343. BUG_ON(_D_SUBMODULE_INDEX(D_SUBMODULE) >= D_LEVEL_SIZE);\
  344. D_LEVEL[_D_SUBMODULE_INDEX(D_SUBMODULE)].level >= __l; \
  345. }); \
  346. })
  347. /**
  348. * d_fnstart - log message at function start if debugging enabled
  349. *
  350. * @l: intended debug level
  351. * @_dev: 'struct device' pointer, NULL if none (for context)
  352. * @f: printf-like format and arguments
  353. */
  354. #define d_fnstart(l, _dev, f, a...) _d_printf(l, " FNSTART", _dev, f, ## a)
  355. /**
  356. * d_fnend - log message at function end if debugging enabled
  357. *
  358. * @l: intended debug level
  359. * @_dev: 'struct device' pointer, NULL if none (for context)
  360. * @f: printf-like format and arguments
  361. */
  362. #define d_fnend(l, _dev, f, a...) _d_printf(l, " FNEND", _dev, f, ## a)
  363. /**
  364. * d_printf - log message if debugging enabled
  365. *
  366. * @l: intended debug level
  367. * @_dev: 'struct device' pointer, NULL if none (for context)
  368. * @f: printf-like format and arguments
  369. */
  370. #define d_printf(l, _dev, f, a...) _d_printf(l, "", _dev, f, ## a)
  371. /**
  372. * d_dump - log buffer hex dump if debugging enabled
  373. *
  374. * @l: intended debug level
  375. * @_dev: 'struct device' pointer, NULL if none (for context)
  376. * @f: printf-like format and arguments
  377. */
  378. #define d_dump(l, dev, ptr, size) \
  379. do { \
  380. char head[64]; \
  381. if (!d_test(l)) \
  382. break; \
  383. __d_head(head, sizeof(head), dev); \
  384. print_hex_dump(KERN_ERR, head, 0, 16, 1, \
  385. ((void *) ptr), (size), 0); \
  386. } while (0)
  387. /**
  388. * Export a submodule's debug level over debugfs as PREFIXSUBMODULE
  389. *
  390. * @prefix: string to prefix the name with
  391. * @submodule: name of submodule (not a string, just the name)
  392. * @dentry: debugfs parent dentry
  393. *
  394. * Returns: 0 if ok, < 0 errno on error.
  395. *
  396. * For removing, just use debugfs_remove_recursive() on the parent.
  397. */
  398. #define d_level_register_debugfs(prefix, name, parent) \
  399. ({ \
  400. int rc; \
  401. struct dentry *fd; \
  402. struct dentry *verify_parent_type = parent; \
  403. fd = debugfs_create_u8( \
  404. prefix #name, 0600, verify_parent_type, \
  405. &(D_LEVEL[__D_SUBMODULE_ ## name].level)); \
  406. rc = PTR_ERR(fd); \
  407. if (IS_ERR(fd) && rc != -ENODEV) \
  408. printk(KERN_ERR "%s: Can't create debugfs entry %s: " \
  409. "%d\n", __func__, prefix #name, rc); \
  410. else \
  411. rc = 0; \
  412. rc; \
  413. })
  414. static inline
  415. void d_submodule_set(struct d_level *d_level, size_t d_level_size,
  416. const char *submodule, u8 level, const char *tag)
  417. {
  418. struct d_level *itr, *top;
  419. int index = -1;
  420. for (itr = d_level, top = itr + d_level_size; itr < top; itr++) {
  421. index++;
  422. if (itr->name == NULL) {
  423. printk(KERN_ERR "%s: itr->name NULL?? (%p, #%d)\n",
  424. tag, itr, index);
  425. continue;
  426. }
  427. if (!strcmp(itr->name, submodule)) {
  428. itr->level = level;
  429. return;
  430. }
  431. }
  432. printk(KERN_ERR "%s: unknown submodule %s\n", tag, submodule);
  433. }
  434. /**
  435. * d_parse_params - Parse a string with debug parameters from the
  436. * command line
  437. *
  438. * @d_level: level structure (D_LEVEL)
  439. * @d_level_size: number of items in the level structure
  440. * (D_LEVEL_SIZE).
  441. * @_params: string with the parameters; this is a space (not tab!)
  442. * separated list of NAME:VALUE, where value is the debug level
  443. * and NAME is the name of the submodule.
  444. * @tag: string for error messages (example: MODULE.ARGNAME).
  445. */
  446. static inline
  447. void d_parse_params(struct d_level *d_level, size_t d_level_size,
  448. const char *_params, const char *tag)
  449. {
  450. char submodule[130], *params, *params_orig, *token, *colon;
  451. unsigned level, tokens;
  452. if (_params == NULL)
  453. return;
  454. params_orig = kstrdup(_params, GFP_KERNEL);
  455. params = params_orig;
  456. while (1) {
  457. token = strsep(&params, " ");
  458. if (token == NULL)
  459. break;
  460. if (*token == '\0') /* eat joint spaces */
  461. continue;
  462. /* kernel's sscanf %s eats until whitespace, so we
  463. * replace : by \n so it doesn't get eaten later by
  464. * strsep */
  465. colon = strchr(token, ':');
  466. if (colon != NULL)
  467. *colon = '\n';
  468. tokens = sscanf(token, "%s\n%u", submodule, &level);
  469. if (colon != NULL)
  470. *colon = ':'; /* set back, for error messages */
  471. if (tokens == 2)
  472. d_submodule_set(d_level, d_level_size,
  473. submodule, level, tag);
  474. else
  475. printk(KERN_ERR "%s: can't parse '%s' as a "
  476. "SUBMODULE:LEVEL (%d tokens)\n",
  477. tag, token, tokens);
  478. }
  479. kfree(params_orig);
  480. }
  481. #endif /* #ifndef __debug__h__ */