debug.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. /*
  2. * debug.c - ACPI debug interface to userspace.
  3. */
  4. #include <linux/proc_fs.h>
  5. #include <linux/init.h>
  6. #include <linux/module.h>
  7. #include <linux/kernel.h>
  8. #include <linux/moduleparam.h>
  9. #include <asm/uaccess.h>
  10. #include <acpi/acpi_drivers.h>
  11. #include <acpi/acglobal.h>
  12. #define _COMPONENT ACPI_SYSTEM_COMPONENT
  13. ACPI_MODULE_NAME ("debug")
  14. #define ACPI_SYSTEM_FILE_DEBUG_LAYER "debug_layer"
  15. #define ACPI_SYSTEM_FILE_DEBUG_LEVEL "debug_level"
  16. #ifdef MODULE_PARAM_PREFIX
  17. #undef MODULE_PARAM_PREFIX
  18. #endif
  19. #define MODULE_PARAM_PREFIX
  20. module_param(acpi_dbg_layer, uint, 0400);
  21. module_param(acpi_dbg_level, uint, 0400);
  22. struct acpi_dlayer {
  23. const char *name;
  24. unsigned long value;
  25. };
  26. struct acpi_dlevel {
  27. const char *name;
  28. unsigned long value;
  29. };
  30. #define ACPI_DEBUG_INIT(v) { .name = #v, .value = v }
  31. static const struct acpi_dlayer acpi_debug_layers[] =
  32. {
  33. ACPI_DEBUG_INIT(ACPI_UTILITIES),
  34. ACPI_DEBUG_INIT(ACPI_HARDWARE),
  35. ACPI_DEBUG_INIT(ACPI_EVENTS),
  36. ACPI_DEBUG_INIT(ACPI_TABLES),
  37. ACPI_DEBUG_INIT(ACPI_NAMESPACE),
  38. ACPI_DEBUG_INIT(ACPI_PARSER),
  39. ACPI_DEBUG_INIT(ACPI_DISPATCHER),
  40. ACPI_DEBUG_INIT(ACPI_EXECUTER),
  41. ACPI_DEBUG_INIT(ACPI_RESOURCES),
  42. ACPI_DEBUG_INIT(ACPI_CA_DEBUGGER),
  43. ACPI_DEBUG_INIT(ACPI_OS_SERVICES),
  44. ACPI_DEBUG_INIT(ACPI_CA_DISASSEMBLER),
  45. ACPI_DEBUG_INIT(ACPI_COMPILER),
  46. ACPI_DEBUG_INIT(ACPI_TOOLS),
  47. };
  48. static const struct acpi_dlevel acpi_debug_levels[] =
  49. {
  50. ACPI_DEBUG_INIT(ACPI_LV_ERROR),
  51. ACPI_DEBUG_INIT(ACPI_LV_WARN),
  52. ACPI_DEBUG_INIT(ACPI_LV_INIT),
  53. ACPI_DEBUG_INIT(ACPI_LV_DEBUG_OBJECT),
  54. ACPI_DEBUG_INIT(ACPI_LV_INFO),
  55. ACPI_DEBUG_INIT(ACPI_LV_INIT_NAMES),
  56. ACPI_DEBUG_INIT(ACPI_LV_PARSE),
  57. ACPI_DEBUG_INIT(ACPI_LV_LOAD),
  58. ACPI_DEBUG_INIT(ACPI_LV_DISPATCH),
  59. ACPI_DEBUG_INIT(ACPI_LV_EXEC),
  60. ACPI_DEBUG_INIT(ACPI_LV_NAMES),
  61. ACPI_DEBUG_INIT(ACPI_LV_OPREGION),
  62. ACPI_DEBUG_INIT(ACPI_LV_BFIELD),
  63. ACPI_DEBUG_INIT(ACPI_LV_TABLES),
  64. ACPI_DEBUG_INIT(ACPI_LV_VALUES),
  65. ACPI_DEBUG_INIT(ACPI_LV_OBJECTS),
  66. ACPI_DEBUG_INIT(ACPI_LV_RESOURCES),
  67. ACPI_DEBUG_INIT(ACPI_LV_USER_REQUESTS),
  68. ACPI_DEBUG_INIT(ACPI_LV_PACKAGE),
  69. ACPI_DEBUG_INIT(ACPI_LV_ALLOCATIONS),
  70. ACPI_DEBUG_INIT(ACPI_LV_FUNCTIONS),
  71. ACPI_DEBUG_INIT(ACPI_LV_OPTIMIZATIONS),
  72. ACPI_DEBUG_INIT(ACPI_LV_MUTEX),
  73. ACPI_DEBUG_INIT(ACPI_LV_THREADS),
  74. ACPI_DEBUG_INIT(ACPI_LV_IO),
  75. ACPI_DEBUG_INIT(ACPI_LV_INTERRUPTS),
  76. ACPI_DEBUG_INIT(ACPI_LV_AML_DISASSEMBLE),
  77. ACPI_DEBUG_INIT(ACPI_LV_VERBOSE_INFO),
  78. ACPI_DEBUG_INIT(ACPI_LV_FULL_TABLES),
  79. ACPI_DEBUG_INIT(ACPI_LV_EVENTS),
  80. };
  81. static int
  82. acpi_system_read_debug (
  83. char *page,
  84. char **start,
  85. off_t off,
  86. int count,
  87. int *eof,
  88. void *data)
  89. {
  90. char *p = page;
  91. int size = 0;
  92. unsigned int i;
  93. if (off != 0)
  94. goto end;
  95. p += sprintf(p, "%-25s\tHex SET\n", "Description");
  96. switch ((unsigned long) data) {
  97. case 0:
  98. for (i = 0; i < ARRAY_SIZE(acpi_debug_layers); i++) {
  99. p += sprintf(p, "%-25s\t0x%08lX [%c]\n",
  100. acpi_debug_layers[i].name,
  101. acpi_debug_layers[i].value,
  102. (acpi_dbg_layer & acpi_debug_layers[i].value) ?
  103. '*' : ' ');
  104. }
  105. p += sprintf(p, "%-25s\t0x%08X [%c]\n", "ACPI_ALL_DRIVERS",
  106. ACPI_ALL_DRIVERS,
  107. (acpi_dbg_layer & ACPI_ALL_DRIVERS) == ACPI_ALL_DRIVERS?
  108. '*' : (acpi_dbg_layer & ACPI_ALL_DRIVERS) == 0 ?
  109. ' ' : '-');
  110. p += sprintf(p,
  111. "--\ndebug_layer = 0x%08X (* = enabled, - = partial)\n",
  112. acpi_dbg_layer);
  113. break;
  114. case 1:
  115. for (i = 0; i < ARRAY_SIZE(acpi_debug_levels); i++) {
  116. p += sprintf(p, "%-25s\t0x%08lX [%c]\n",
  117. acpi_debug_levels[i].name,
  118. acpi_debug_levels[i].value,
  119. (acpi_dbg_level & acpi_debug_levels[i].value) ?
  120. '*' : ' ');
  121. }
  122. p += sprintf(p, "--\ndebug_level = 0x%08X (* = enabled)\n",
  123. acpi_dbg_level);
  124. break;
  125. default:
  126. p += sprintf(p, "Invalid debug option\n");
  127. break;
  128. }
  129. end:
  130. size = (p - page);
  131. if (size <= off+count) *eof = 1;
  132. *start = page + off;
  133. size -= off;
  134. if (size>count) size = count;
  135. if (size<0) size = 0;
  136. return size;
  137. }
  138. static int
  139. acpi_system_write_debug (
  140. struct file *file,
  141. const char __user *buffer,
  142. unsigned long count,
  143. void *data)
  144. {
  145. char debug_string[12] = {'\0'};
  146. ACPI_FUNCTION_TRACE("acpi_system_write_debug");
  147. if (count > sizeof(debug_string) - 1)
  148. return_VALUE(-EINVAL);
  149. if (copy_from_user(debug_string, buffer, count))
  150. return_VALUE(-EFAULT);
  151. debug_string[count] = '\0';
  152. switch ((unsigned long) data) {
  153. case 0:
  154. acpi_dbg_layer = simple_strtoul(debug_string, NULL, 0);
  155. break;
  156. case 1:
  157. acpi_dbg_level = simple_strtoul(debug_string, NULL, 0);
  158. break;
  159. default:
  160. return_VALUE(-EINVAL);
  161. }
  162. return_VALUE(count);
  163. }
  164. static int __init acpi_debug_init(void)
  165. {
  166. struct proc_dir_entry *entry;
  167. int error = 0;
  168. char * name;
  169. ACPI_FUNCTION_TRACE("acpi_debug_init");
  170. if (acpi_disabled)
  171. return_VALUE(0);
  172. /* 'debug_layer' [R/W] */
  173. name = ACPI_SYSTEM_FILE_DEBUG_LAYER;
  174. entry = create_proc_read_entry(name, S_IFREG|S_IRUGO|S_IWUSR, acpi_root_dir,
  175. acpi_system_read_debug,(void *)0);
  176. if (entry)
  177. entry->write_proc = acpi_system_write_debug;
  178. else
  179. goto Error;
  180. /* 'debug_level' [R/W] */
  181. name = ACPI_SYSTEM_FILE_DEBUG_LEVEL;
  182. entry = create_proc_read_entry(name, S_IFREG|S_IRUGO|S_IWUSR, acpi_root_dir,
  183. acpi_system_read_debug, (void *)1);
  184. if (entry)
  185. entry->write_proc = acpi_system_write_debug;
  186. else
  187. goto Error;
  188. Done:
  189. return_VALUE(error);
  190. Error:
  191. ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
  192. "Unable to create '%s' proc fs entry\n", name));
  193. remove_proc_entry(ACPI_SYSTEM_FILE_DEBUG_LEVEL, acpi_root_dir);
  194. remove_proc_entry(ACPI_SYSTEM_FILE_DEBUG_LAYER, acpi_root_dir);
  195. error = -EFAULT;
  196. goto Done;
  197. }
  198. subsys_initcall(acpi_debug_init);