dbutils.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:9k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*******************************************************************************
  2.  *
  3.  * Module Name: dbutils - AML debugger utilities
  4.  *              $Revision: 45 $
  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 "acparser.h"
  26. #include "amlcode.h"
  27. #include "acnamesp.h"
  28. #include "acparser.h"
  29. #include "acevents.h"
  30. #include "acinterp.h"
  31. #include "acdebug.h"
  32. #include "acdispat.h"
  33. #ifdef ENABLE_DEBUGGER
  34. #define _COMPONENT          ACPI_DEBUGGER
  35.  MODULE_NAME         ("dbutils")
  36. /*******************************************************************************
  37.  *
  38.  * FUNCTION:    Acpi_db_set_output_destination
  39.  *
  40.  * PARAMETERS:  Output_flags        - Current flags word
  41.  *
  42.  * RETURN:      None
  43.  *
  44.  * DESCRIPTION: Set the current destination for debugger output.  Alos sets
  45.  *              the debug output level accordingly.
  46.  *
  47.  ******************************************************************************/
  48. void
  49. acpi_db_set_output_destination (
  50. u32                     output_flags)
  51. {
  52. acpi_gbl_db_output_flags = (u8) output_flags;
  53. if (output_flags & DB_REDIRECTABLE_OUTPUT) {
  54. if (acpi_gbl_db_output_to_file) {
  55. acpi_dbg_level = acpi_gbl_db_debug_level;
  56. }
  57. }
  58. else {
  59. acpi_dbg_level = acpi_gbl_db_console_debug_level;
  60. }
  61. }
  62. /*******************************************************************************
  63.  *
  64.  * FUNCTION:    Acpi_db_dump_buffer
  65.  *
  66.  * PARAMETERS:  Address             - Pointer to the buffer
  67.  *
  68.  * RETURN:      None
  69.  *
  70.  * DESCRIPTION: Print a portion of a buffer
  71.  *
  72.  ******************************************************************************/
  73. void
  74. acpi_db_dump_buffer (
  75. u32                     address)
  76. {
  77. acpi_os_printf ("n_location %X:n", address);
  78. acpi_dbg_level |= ACPI_LV_TABLES;
  79. acpi_ut_dump_buffer ((u8 *) address, 64, DB_BYTE_DISPLAY, ACPI_UINT32_MAX);
  80. }
  81. /*******************************************************************************
  82.  *
  83.  * FUNCTION:    Acpi_db_dump_object
  84.  *
  85.  * PARAMETERS:  Obj_desc        - External ACPI object to dump
  86.  *              Level           - Nesting level.
  87.  *
  88.  * RETURN:      None
  89.  *
  90.  * DESCRIPTION: Dump the contents of an ACPI external object
  91.  *
  92.  ******************************************************************************/
  93. void
  94. acpi_db_dump_object (
  95. acpi_object             *obj_desc,
  96. u32                     level)
  97. {
  98. u32                     i;
  99. if (!obj_desc) {
  100. acpi_os_printf ("[Null Object]n");
  101. return;
  102. }
  103. for (i = 0; i < level; i++) {
  104. acpi_os_printf (" ");
  105. }
  106. switch (obj_desc->type) {
  107. case ACPI_TYPE_ANY:
  108. acpi_os_printf ("[Object Reference] = %pn", obj_desc->reference.handle);
  109. break;
  110. case ACPI_TYPE_INTEGER:
  111. acpi_os_printf ("[Integer] = %8.8X%8.8Xn", HIDWORD (obj_desc->integer.value),
  112.  LODWORD (obj_desc->integer.value));
  113. break;
  114. case ACPI_TYPE_STRING:
  115. acpi_os_printf ("[String] Value: ");
  116. for (i = 0; i < obj_desc->string.length; i++) {
  117. acpi_os_printf ("%c", obj_desc->string.pointer[i]);
  118. }
  119. acpi_os_printf ("n");
  120. break;
  121. case ACPI_TYPE_BUFFER:
  122. acpi_os_printf ("[Buffer] = ");
  123. acpi_ut_dump_buffer ((u8 *) obj_desc->buffer.pointer, obj_desc->buffer.length, DB_DWORD_DISPLAY, _COMPONENT);
  124. break;
  125. case ACPI_TYPE_PACKAGE:
  126. acpi_os_printf ("[Package] Contains %d Elements: n", obj_desc->package.count);
  127. for (i = 0; i < obj_desc->package.count; i++) {
  128. acpi_db_dump_object (&obj_desc->package.elements[i], level+1);
  129. }
  130. break;
  131. case INTERNAL_TYPE_REFERENCE:
  132. acpi_os_printf ("[Object Reference] = %pn", obj_desc->reference.handle);
  133. break;
  134. case ACPI_TYPE_PROCESSOR:
  135. acpi_os_printf ("[Processor]n");
  136. break;
  137. case ACPI_TYPE_POWER:
  138. acpi_os_printf ("[Power Resource]n");
  139. break;
  140. default:
  141. acpi_os_printf ("[Unknown Type] %X n", obj_desc->type);
  142. break;
  143. }
  144. }
  145. /*******************************************************************************
  146.  *
  147.  * FUNCTION:    Acpi_db_prep_namestring
  148.  *
  149.  * PARAMETERS:  Name            - String to prepare
  150.  *
  151.  * RETURN:      None
  152.  *
  153.  * DESCRIPTION: Translate all forward slashes and dots to backslashes.
  154.  *
  155.  ******************************************************************************/
  156. void
  157. acpi_db_prep_namestring (
  158. NATIVE_CHAR             *name)
  159. {
  160. if (!name) {
  161. return;
  162. }
  163. STRUPR (name);
  164. /* Convert a leading forward slash to a backslash */
  165. if (*name == '/') {
  166. *name = '\';
  167. }
  168. /* Ignore a leading backslash, this is the root prefix */
  169. if (*name == '\') {
  170. name++;
  171. }
  172. /* Convert all slash path separators to dots */
  173. while (*name) {
  174. if ((*name == '/') ||
  175. (*name == '\')) {
  176. *name = '.';
  177. }
  178. name++;
  179. }
  180. }
  181. /*******************************************************************************
  182.  *
  183.  * FUNCTION:    Acpi_db_second_pass_parse
  184.  *
  185.  * PARAMETERS:  Root            - Root of the parse tree
  186.  *
  187.  * RETURN:      Status
  188.  *
  189.  * DESCRIPTION: Second pass parse of the ACPI tables.  We need to wait until
  190.  *              second pass to parse the control methods
  191.  *
  192.  ******************************************************************************/
  193. acpi_status
  194. acpi_db_second_pass_parse (
  195. acpi_parse_object       *root)
  196. {
  197. acpi_parse_object       *op = root;
  198. acpi_parse2_object      *method;
  199. acpi_parse_object       *search_op;
  200. acpi_parse_object       *start_op;
  201. acpi_status             status = AE_OK;
  202. u32                     base_aml_offset;
  203. acpi_walk_state         *walk_state;
  204. FUNCTION_ENTRY ();
  205. acpi_os_printf ("Pass two parse ....n");
  206. while (op) {
  207. if (op->opcode == AML_METHOD_OP) {
  208. method = (acpi_parse2_object *) op;
  209. walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT,
  210.    NULL, NULL, NULL);
  211. if (!walk_state) {
  212. return (AE_NO_MEMORY);
  213. }
  214. walk_state->parser_state.aml        =
  215. walk_state->parser_state.aml_start  = method->data;
  216. walk_state->parser_state.aml_end    =
  217. walk_state->parser_state.pkg_end    = method->data + method->length;
  218. walk_state->parser_state.start_scope = op;
  219. walk_state->descending_callback     = acpi_ds_load1_begin_op;
  220. walk_state->ascending_callback      = acpi_ds_load1_end_op;
  221. status = acpi_ps_parse_aml (walk_state);
  222. base_aml_offset = (method->value.arg)->aml_offset + 1;
  223. start_op = (method->value.arg)->next;
  224. search_op = start_op;
  225. while (search_op) {
  226. search_op->aml_offset += base_aml_offset;
  227. search_op = acpi_ps_get_depth_next (start_op, search_op);
  228. }
  229. }
  230. if (op->opcode == AML_REGION_OP) {
  231. /* TBD: [Investigate] this isn't quite the right thing to do! */
  232. /*
  233.  *
  234.  * Method = (ACPI_DEFERRED_OP *) Op;
  235.  * Status = Acpi_ps_parse_aml (Op, Method->Body, Method->Body_length);
  236.  */
  237. }
  238. if (ACPI_FAILURE (status)) {
  239. break;
  240. }
  241. op = acpi_ps_get_depth_next (root, op);
  242. }
  243. return (status);
  244. }
  245. /*******************************************************************************
  246.  *
  247.  * FUNCTION:    Acpi_db_local_ns_lookup
  248.  *
  249.  * PARAMETERS:  Name            - Name to lookup
  250.  *
  251.  * RETURN:      Pointer to a namespace node
  252.  *
  253.  * DESCRIPTION: Lookup a name in the ACPI namespace
  254.  *
  255.  ******************************************************************************/
  256. acpi_namespace_node *
  257. acpi_db_local_ns_lookup (
  258. NATIVE_CHAR             *name)
  259. {
  260. NATIVE_CHAR             *internal_path;
  261. acpi_status             status;
  262. acpi_namespace_node     *node = NULL;
  263. acpi_db_prep_namestring (name);
  264. /* Build an internal namestring */
  265. status = acpi_ns_internalize_name (name, &internal_path);
  266. if (ACPI_FAILURE (status)) {
  267. acpi_os_printf ("Invalid namestring: %sn", name);
  268. return (NULL);
  269. }
  270. /* Lookup the name */
  271. /* TBD: [Investigate] what scope do we use? */
  272. /* Use the root scope for the start of the search */
  273. status = acpi_ns_lookup (NULL, internal_path, ACPI_TYPE_ANY, IMODE_EXECUTE,
  274.    NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE, NULL, &node);
  275. if (ACPI_FAILURE (status)) {
  276. acpi_os_printf ("Could not locate name: %s %sn", name, acpi_format_exception (status));
  277. }
  278. ACPI_MEM_FREE (internal_path);
  279. return (node);
  280. }
  281. #endif /* ENABLE_DEBUGGER */