dbstats.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:13k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*******************************************************************************
  2.  *
  3.  * Module Name: dbstats - Generation and display of ACPI table statistics
  4.  *              $Revision: 47 $
  5.  *
  6.  ******************************************************************************/
  7. /*
  8.  *  Copyright (C) 2000, 2001 R. Byron Moore
  9.  *
  10.  *  This program is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation; either version 2 of the License, or
  13.  *  (at your option) any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program; if not, write to the Free Software
  22.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  23.  */
  24. #include <acpi.h>
  25. #include <acdebug.h>
  26. #include <amlcode.h>
  27. #include <acparser.h>
  28. #include <acnamesp.h>
  29. #ifdef ENABLE_DEBUGGER
  30. #define _COMPONENT          ACPI_DEBUGGER
  31.  MODULE_NAME         ("dbstats")
  32. /*
  33.  * Statistics subcommands
  34.  */
  35. ARGUMENT_INFO               acpi_db_stat_types [] =
  36. { {"ALLOCATIONS"},
  37. {"OBJECTS"},
  38. {"MEMORY"},
  39. {"MISC"},
  40. {"TABLES"},
  41. {"SIZES"},
  42. {"STACK"},
  43. {NULL}           /* Must be null terminated */
  44. };
  45. #define CMD_ALLOCATIONS     0
  46. #define CMD_OBJECTS         1
  47. #define CMD_MEMORY          2
  48. #define CMD_MISC            3
  49. #define CMD_TABLES          4
  50. #define CMD_SIZES           5
  51. #define CMD_STACK           6
  52. /*******************************************************************************
  53.  *
  54.  * FUNCTION:    Acpi_db_enumerate_object
  55.  *
  56.  * PARAMETERS:  Obj_desc            - Object to be counted
  57.  *
  58.  * RETURN:      None
  59.  *
  60.  * DESCRIPTION: Add this object to the global counts, by object type.
  61.  *              Recursively handles subobjects and packages.
  62.  *
  63.  *              [TBD] Restructure - remove recursion.
  64.  *
  65.  ******************************************************************************/
  66. void
  67. acpi_db_enumerate_object (
  68. acpi_operand_object     *obj_desc)
  69. {
  70. u32                     type;
  71. u32                     i;
  72. if (!obj_desc)
  73. {
  74. return;
  75. }
  76. /* Enumerate this object first */
  77. acpi_gbl_num_objects++;
  78. type = obj_desc->common.type;
  79. if (type > INTERNAL_TYPE_NODE_MAX)
  80. {
  81. acpi_gbl_obj_type_count_misc++;
  82. }
  83. else
  84. {
  85. acpi_gbl_obj_type_count [type]++;
  86. }
  87. /* Count the sub-objects */
  88. switch (type)
  89. {
  90. case ACPI_TYPE_PACKAGE:
  91. for (i = 0; i< obj_desc->package.count; i++)
  92. {
  93. acpi_db_enumerate_object (obj_desc->package.elements[i]);
  94. }
  95. break;
  96. case ACPI_TYPE_DEVICE:
  97. acpi_db_enumerate_object (obj_desc->device.sys_handler);
  98. acpi_db_enumerate_object (obj_desc->device.drv_handler);
  99. acpi_db_enumerate_object (obj_desc->device.addr_handler);
  100. break;
  101. case ACPI_TYPE_REGION:
  102. acpi_db_enumerate_object (obj_desc->region.addr_handler);
  103. break;
  104. case ACPI_TYPE_POWER:
  105. acpi_db_enumerate_object (obj_desc->power_resource.sys_handler);
  106. acpi_db_enumerate_object (obj_desc->power_resource.drv_handler);
  107. break;
  108. case ACPI_TYPE_PROCESSOR:
  109. acpi_db_enumerate_object (obj_desc->processor.sys_handler);
  110. acpi_db_enumerate_object (obj_desc->processor.drv_handler);
  111. acpi_db_enumerate_object (obj_desc->processor.addr_handler);
  112. break;
  113. case ACPI_TYPE_THERMAL:
  114. acpi_db_enumerate_object (obj_desc->thermal_zone.sys_handler);
  115. acpi_db_enumerate_object (obj_desc->thermal_zone.drv_handler);
  116. acpi_db_enumerate_object (obj_desc->thermal_zone.addr_handler);
  117. break;
  118. }
  119. }
  120. #ifndef PARSER_ONLY
  121. /*******************************************************************************
  122.  *
  123.  * FUNCTION:    Acpi_db_classify_one_object
  124.  *
  125.  * PARAMETERS:  Callback for Walk_namespace
  126.  *
  127.  * RETURN:      Status
  128.  *
  129.  * DESCRIPTION: Enumerate both the object descriptor (including subobjects) and
  130.  *              the parent namespace node.
  131.  *
  132.  ******************************************************************************/
  133. acpi_status
  134. acpi_db_classify_one_object (
  135. acpi_handle             obj_handle,
  136. u32                     nesting_level,
  137. void                    *context,
  138. void                    **return_value)
  139. {
  140. acpi_namespace_node     *node;
  141. acpi_operand_object     *obj_desc;
  142. u32                     type;
  143. acpi_gbl_num_nodes++;
  144. node = (acpi_namespace_node *) obj_handle;
  145. obj_desc = ((acpi_namespace_node *) obj_handle)->object;
  146. acpi_db_enumerate_object (obj_desc);
  147. type = node->type;
  148. if (type > INTERNAL_TYPE_NODE_MAX)
  149. {
  150. acpi_gbl_node_type_count_misc++;
  151. }
  152. else
  153. {
  154. acpi_gbl_node_type_count [type]++;
  155. }
  156. return AE_OK;
  157. /* TBD: These need to be counted during the initial parsing phase */
  158. /*
  159. if (Acpi_ps_is_named_op (Op->Opcode))
  160. {
  161. Num_nodes++;
  162. }
  163. if (Is_method)
  164. {
  165. Num_method_elements++;
  166. }
  167. Num_grammar_elements++;
  168. Op = Acpi_ps_get_depth_next (Root, Op);
  169. Size_of_parse_tree          = (Num_grammar_elements - Num_method_elements) * (u32) sizeof (acpi_parse_object);
  170. Size_of_method_trees        = Num_method_elements * (u32) sizeof (acpi_parse_object);
  171. Size_of_node_entries        = Num_nodes * (u32) sizeof (acpi_namespace_node);
  172. Size_of_acpi_objects        = Num_nodes * (u32) sizeof (acpi_operand_object);
  173. */
  174. }
  175. /*******************************************************************************
  176.  *
  177.  * FUNCTION:    Acpi_db_count_namespace_objects
  178.  *
  179.  * PARAMETERS:  None
  180.  *
  181.  * RETURN:      Status
  182.  *
  183.  * DESCRIPTION: Count and classify the entire namespace, including all
  184.  *              namespace nodes and attached objects.
  185.  *
  186.  ******************************************************************************/
  187. acpi_status
  188. acpi_db_count_namespace_objects (
  189. void)
  190. {
  191. u32                     i;
  192. acpi_gbl_num_nodes = 0;
  193. acpi_gbl_num_objects = 0;
  194. acpi_gbl_obj_type_count_misc = 0;
  195. for (i = 0; i < (INTERNAL_TYPE_NODE_MAX -1); i++)
  196. {
  197. acpi_gbl_obj_type_count [i] = 0;
  198. acpi_gbl_node_type_count [i] = 0;
  199. }
  200. acpi_ns_walk_namespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
  201.    FALSE, acpi_db_classify_one_object, NULL, NULL);
  202. return (AE_OK);
  203. }
  204. #endif
  205. /*******************************************************************************
  206.  *
  207.  * FUNCTION:    Acpi_db_display_statistics
  208.  *
  209.  * PARAMETERS:  Type_arg        - Subcommand
  210.  *
  211.  * RETURN:      Status
  212.  *
  213.  * DESCRIPTION: Display various statistics
  214.  *
  215.  ******************************************************************************/
  216. acpi_status
  217. acpi_db_display_statistics (
  218. NATIVE_CHAR             *type_arg)
  219. {
  220. u32                     i;
  221. u32                     type;
  222. u32                     outstanding;
  223. u32                     size;
  224. if (!acpi_gbl_DSDT)
  225. {
  226. acpi_os_printf ("*** Warning: There is no DSDT loadedn");
  227. }
  228. if (!type_arg)
  229. {
  230. acpi_os_printf ("The following subcommands are available:n  ALLOCATIONS, OBJECTS, MEMORY, MISC, SIZES, TABLESn");
  231. return (AE_OK);
  232. }
  233. STRUPR (type_arg);
  234. type = acpi_db_match_argument (type_arg, acpi_db_stat_types);
  235. if (type == (u32) -1)
  236. {
  237. acpi_os_printf ("Invalid or unsupported argumentn");
  238. return (AE_OK);
  239. }
  240. switch (type)
  241. {
  242. #ifndef PARSER_ONLY
  243. case CMD_ALLOCATIONS:
  244. #ifdef ACPI_DBG_TRACK_ALLOCATIONS
  245. acpi_ut_dump_allocation_info ();
  246. #endif
  247. break;
  248. #endif
  249. case CMD_TABLES:
  250. acpi_os_printf ("ACPI Table Information:nn");
  251. if (acpi_gbl_DSDT)
  252. {
  253. acpi_os_printf ("DSDT Length:................% 7ld (%X)n", acpi_gbl_DSDT->length, acpi_gbl_DSDT->length);
  254. }
  255. break;
  256. case CMD_OBJECTS:
  257. #ifndef PARSER_ONLY
  258. acpi_db_count_namespace_objects ();
  259. acpi_os_printf ("n_objects defined in the current namespace:nn");
  260. acpi_os_printf ("%16.16s % 10.10s % 10.10sn", "ACPI_TYPE", "NODES", "OBJECTS");
  261. for (i = 0; i < INTERNAL_TYPE_NODE_MAX; i++)
  262. {
  263. acpi_os_printf ("%16.16s % 10ld% 10ldn", acpi_ut_get_type_name (i),
  264. acpi_gbl_node_type_count [i], acpi_gbl_obj_type_count [i]);
  265. }
  266. acpi_os_printf ("%16.16s % 10ld% 10ldn", "Misc/Unknown",
  267. acpi_gbl_node_type_count_misc, acpi_gbl_obj_type_count_misc);
  268. acpi_os_printf ("%16.16s % 10ld% 10ldn", "TOTALS:",
  269. acpi_gbl_num_nodes, acpi_gbl_num_objects);
  270. #endif
  271. break;
  272. case CMD_MEMORY:
  273. #ifdef ACPI_DBG_TRACK_ALLOCATIONS
  274. acpi_os_printf ("n----Object and Cache Statistics---------------------------------------------n");
  275. for (i = 0; i < ACPI_NUM_MEM_LISTS; i++)
  276. {
  277. acpi_os_printf ("n%sn", acpi_gbl_memory_lists[i].list_name);
  278. if (acpi_gbl_memory_lists[i].max_cache_depth > 0)
  279. {
  280. acpi_os_printf ("  Cache: [Depth Max Avail Size]         % 7d % 7d % 7d % 7d Bn",
  281. acpi_gbl_memory_lists[i].cache_depth,
  282. acpi_gbl_memory_lists[i].max_cache_depth,
  283. acpi_gbl_memory_lists[i].max_cache_depth - acpi_gbl_memory_lists[i].cache_depth,
  284. (acpi_gbl_memory_lists[i].cache_depth * acpi_gbl_memory_lists[i].object_size));
  285. acpi_os_printf ("  Cache: [Requests Hits Misses Obj_size] % 7d % 7d % 7d % 7d Bn",
  286. acpi_gbl_memory_lists[i].cache_requests,
  287. acpi_gbl_memory_lists[i].cache_hits,
  288. acpi_gbl_memory_lists[i].cache_requests - acpi_gbl_memory_lists[i].cache_hits,
  289. acpi_gbl_memory_lists[i].object_size);
  290. }
  291. outstanding = acpi_gbl_memory_lists[i].total_allocated -
  292.   acpi_gbl_memory_lists[i].total_freed -
  293.   acpi_gbl_memory_lists[i].cache_depth;
  294. if (acpi_gbl_memory_lists[i].object_size)
  295. {
  296. size = ROUND_UP_TO_1K (outstanding * acpi_gbl_memory_lists[i].object_size);
  297. }
  298. else
  299. {
  300. size = ROUND_UP_TO_1K (acpi_gbl_memory_lists[i].current_total_size);
  301. }
  302. acpi_os_printf ("  Mem:   [Alloc Free Outstanding Size]  % 7d % 7d % 7d % 7d Kbn",
  303. acpi_gbl_memory_lists[i].total_allocated,
  304. acpi_gbl_memory_lists[i].total_freed,
  305. outstanding, size);
  306. }
  307. #endif
  308. break;
  309. case CMD_MISC:
  310. acpi_os_printf ("n_miscellaneous Statistics:nn");
  311. acpi_os_printf ("Calls to Acpi_ps_find:.. ........% 7ldn", acpi_gbl_ps_find_count);
  312. acpi_os_printf ("Calls to Acpi_ns_lookup:..........% 7ldn", acpi_gbl_ns_lookup_count);
  313. acpi_os_printf ("n");
  314. acpi_os_printf ("Mutex usage:nn");
  315. for (i = 0; i < NUM_MTX; i++)
  316. {
  317. acpi_os_printf ("%-28s:     % 7ldn", acpi_ut_get_mutex_name (i), acpi_gbl_acpi_mutex_info[i].use_count);
  318. }
  319. break;
  320. case CMD_SIZES:
  321. acpi_os_printf ("n_internal object sizes:nn");
  322. acpi_os_printf ("Common         %3dn", sizeof (ACPI_OBJECT_COMMON));
  323. acpi_os_printf ("Number         %3dn", sizeof (ACPI_OBJECT_INTEGER));
  324. acpi_os_printf ("String         %3dn", sizeof (ACPI_OBJECT_STRING));
  325. acpi_os_printf ("Buffer         %3dn", sizeof (ACPI_OBJECT_BUFFER));
  326. acpi_os_printf ("Package        %3dn", sizeof (ACPI_OBJECT_PACKAGE));
  327. acpi_os_printf ("Buffer_field   %3dn", sizeof (ACPI_OBJECT_BUFFER_FIELD));
  328. acpi_os_printf ("Device         %3dn", sizeof (ACPI_OBJECT_DEVICE));
  329. acpi_os_printf ("Event          %3dn", sizeof (ACPI_OBJECT_EVENT));
  330. acpi_os_printf ("Method         %3dn", sizeof (ACPI_OBJECT_METHOD));
  331. acpi_os_printf ("Mutex          %3dn", sizeof (ACPI_OBJECT_MUTEX));
  332. acpi_os_printf ("Region         %3dn", sizeof (ACPI_OBJECT_REGION));
  333. acpi_os_printf ("Power_resource %3dn", sizeof (ACPI_OBJECT_POWER_RESOURCE));
  334. acpi_os_printf ("Processor      %3dn", sizeof (ACPI_OBJECT_PROCESSOR));
  335. acpi_os_printf ("Thermal_zone   %3dn", sizeof (ACPI_OBJECT_THERMAL_ZONE));
  336. acpi_os_printf ("Region_field   %3dn", sizeof (ACPI_OBJECT_REGION_FIELD));
  337. acpi_os_printf ("Bank_field     %3dn", sizeof (ACPI_OBJECT_BANK_FIELD));
  338. acpi_os_printf ("Index_field    %3dn", sizeof (ACPI_OBJECT_INDEX_FIELD));
  339. acpi_os_printf ("Reference      %3dn", sizeof (ACPI_OBJECT_REFERENCE));
  340. acpi_os_printf ("Notify_handler %3dn", sizeof (ACPI_OBJECT_NOTIFY_HANDLER));
  341. acpi_os_printf ("Addr_handler   %3dn", sizeof (ACPI_OBJECT_ADDR_HANDLER));
  342. acpi_os_printf ("Extra          %3dn", sizeof (ACPI_OBJECT_EXTRA));
  343. acpi_os_printf ("n");
  344. acpi_os_printf ("Parse_object   %3dn", sizeof (acpi_parse_object));
  345. acpi_os_printf ("Parse2_object  %3dn", sizeof (acpi_parse2_object));
  346. acpi_os_printf ("Operand_object %3dn", sizeof (acpi_operand_object));
  347. acpi_os_printf ("Namespace_node %3dn", sizeof (acpi_namespace_node));
  348. break;
  349. case CMD_STACK:
  350. size = acpi_gbl_entry_stack_pointer - acpi_gbl_lowest_stack_pointer;
  351. acpi_os_printf ("n_subsystem Stack Usage:nn");
  352. acpi_os_printf ("Entry Stack Pointer        %Xn", acpi_gbl_entry_stack_pointer);
  353. acpi_os_printf ("Lowest Stack Pointer       %Xn", acpi_gbl_lowest_stack_pointer);
  354. acpi_os_printf ("Stack Use                  %X (%d)n", size, size);
  355. acpi_os_printf ("Deepest Procedure Nesting  %dn", acpi_gbl_deepest_nesting);
  356. break;
  357. }
  358. acpi_os_printf ("n");
  359. return (AE_OK);
  360. }
  361. #endif /* ENABLE_DEBUGGER  */