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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*******************************************************************************
  2.  *
  3.  * Module Name: dbdisply - debug display commands
  4.  *              $Revision: 57 $
  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 "acdispat.h"
  28. #include "acnamesp.h"
  29. #include "acparser.h"
  30. #include "acevents.h"
  31. #include "acinterp.h"
  32. #include "acdebug.h"
  33. #ifdef ENABLE_DEBUGGER
  34. #define _COMPONENT          ACPI_DEBUGGER
  35.  MODULE_NAME         ("dbdisply")
  36. /******************************************************************************
  37.  *
  38.  * FUNCTION:    Acpi_db_get_pointer
  39.  *
  40.  * PARAMETERS:  Target          - Pointer to string to be converted
  41.  *
  42.  * RETURN:      Converted pointer
  43.  *
  44.  * DESCRIPTION: Convert an ascii pointer value to a real value
  45.  *
  46.  *****************************************************************************/
  47. void *
  48. acpi_db_get_pointer (
  49. void                    *target)
  50. {
  51. void                    *obj_ptr;
  52. #ifdef _IA16
  53. #include <stdio.h>
  54. /* Have to handle 16-bit pointers of the form segment:offset */
  55. if (!sscanf (target, "%p", &obj_ptr)) {
  56. acpi_os_printf ("Invalid pointer: %sn", target);
  57. return (NULL);
  58. }
  59. #else
  60. /* Simple flat pointer */
  61. obj_ptr = (void *) STRTOUL (target, NULL, 16);
  62. #endif
  63. return (obj_ptr);
  64. }
  65. /*******************************************************************************
  66.  *
  67.  * FUNCTION:    Acpi_db_dump_parser_descriptor
  68.  *
  69.  * PARAMETERS:  Op              - A parser Op descriptor
  70.  *
  71.  * RETURN:      None
  72.  *
  73.  * DESCRIPTION: Display a formatted parser object
  74.  *
  75.  ******************************************************************************/
  76. void
  77. acpi_db_dump_parser_descriptor (
  78. acpi_parse_object       *op)
  79. {
  80. const acpi_opcode_info  *info;
  81. info = acpi_ps_get_opcode_info (op->opcode);
  82. acpi_os_printf ("Parser Op Descriptor:n");
  83. acpi_os_printf ("%20.20s : %4.4Xn", "Opcode", op->opcode);
  84. DEBUG_ONLY_MEMBERS (acpi_os_printf ("%20.20s : %sn", "Opcode Name", info->name));
  85. acpi_os_printf ("%20.20s : %pn", "Value/Arg_list", op->value);
  86. acpi_os_printf ("%20.20s : %pn", "Parent", op->parent);
  87. acpi_os_printf ("%20.20s : %pn", "Next_op", op->next);
  88. }
  89. /*******************************************************************************
  90.  *
  91.  * FUNCTION:    Acpi_db_decode_and_display_object
  92.  *
  93.  * PARAMETERS:  Target          - String with object to be displayed.  Names
  94.  *                                and hex pointers are supported.
  95.  *              Output_type     - Byte, Word, Dword, or Qword (B|W|D|Q)
  96.  *
  97.  * RETURN:      None
  98.  *
  99.  * DESCRIPTION: Display a formatted ACPI object
  100.  *
  101.  ******************************************************************************/
  102. void
  103. acpi_db_decode_and_display_object (
  104. NATIVE_CHAR             *target,
  105. NATIVE_CHAR             *output_type)
  106. {
  107. void                    *obj_ptr;
  108. acpi_namespace_node     *node;
  109. u32                     display = DB_BYTE_DISPLAY;
  110. NATIVE_CHAR             buffer[80];
  111. acpi_buffer             ret_buf;
  112. acpi_status             status;
  113. u32                     size;
  114. if (!target) {
  115. return;
  116. }
  117. /* Decode the output type */
  118. if (output_type) {
  119. STRUPR (output_type);
  120. if (output_type[0] == 'W') {
  121. display = DB_WORD_DISPLAY;
  122. }
  123. else if (output_type[0] == 'D') {
  124. display = DB_DWORD_DISPLAY;
  125. }
  126. else if (output_type[0] == 'Q') {
  127. display = DB_QWORD_DISPLAY;
  128. }
  129. }
  130. ret_buf.length = sizeof (buffer);
  131. ret_buf.pointer = buffer;
  132. /* Differentiate between a number and a name */
  133. if ((target[0] >= 0x30) && (target[0] <= 0x39)) {
  134. obj_ptr = acpi_db_get_pointer (target);
  135. if (!acpi_os_readable (obj_ptr, 16)) {
  136. acpi_os_printf ("Address %p is invalid in this address spacen", obj_ptr);
  137. return;
  138. }
  139. /* Decode the object type */
  140. if (VALID_DESCRIPTOR_TYPE ((obj_ptr), ACPI_DESC_TYPE_NAMED)) {
  141. /* This is a Node */
  142. if (!acpi_os_readable (obj_ptr, sizeof (acpi_namespace_node))) {
  143. acpi_os_printf ("Cannot read entire Named object at address %pn", obj_ptr);
  144. return;
  145. }
  146. node = obj_ptr;
  147. goto dump_nte;
  148. }
  149. else if (VALID_DESCRIPTOR_TYPE ((obj_ptr), ACPI_DESC_TYPE_INTERNAL)) {
  150. /* This is an ACPI OBJECT */
  151. if (!acpi_os_readable (obj_ptr, sizeof (acpi_operand_object))) {
  152. acpi_os_printf ("Cannot read entire ACPI object at address %pn", obj_ptr);
  153. return;
  154. }
  155. acpi_ut_dump_buffer (obj_ptr, sizeof (acpi_operand_object), display, ACPI_UINT32_MAX);
  156. acpi_ex_dump_object_descriptor (obj_ptr, 1);
  157. }
  158. else if (VALID_DESCRIPTOR_TYPE ((obj_ptr), ACPI_DESC_TYPE_PARSER)) {
  159. /* This is an Parser Op object */
  160. if (!acpi_os_readable (obj_ptr, sizeof (acpi_parse_object))) {
  161. acpi_os_printf ("Cannot read entire Parser object at address %pn", obj_ptr);
  162. return;
  163. }
  164. acpi_ut_dump_buffer (obj_ptr, sizeof (acpi_parse_object), display, ACPI_UINT32_MAX);
  165. acpi_db_dump_parser_descriptor ((acpi_parse_object *) obj_ptr);
  166. }
  167. else {
  168. size = 16;
  169. if (acpi_os_readable (obj_ptr, 64)) {
  170. size = 64;
  171. }
  172. /* Just dump some memory */
  173. acpi_ut_dump_buffer (obj_ptr, size, display, ACPI_UINT32_MAX);
  174. }
  175. return;
  176. }
  177. /* The parameter is a name string that must be resolved to a Named obj */
  178. node = acpi_db_local_ns_lookup (target);
  179. if (!node) {
  180. return;
  181. }
  182. dump_nte:
  183. /* Now dump the Named obj */
  184. status = acpi_get_name (node, ACPI_FULL_PATHNAME, &ret_buf);
  185. if (ACPI_FAILURE (status)) {
  186. acpi_os_printf ("Could not convert name to pathnamen");
  187. }
  188. else {
  189. acpi_os_printf ("Object (%p) Pathname: %sn", node, ret_buf.pointer);
  190. }
  191. if (!acpi_os_readable (node, sizeof (acpi_namespace_node))) {
  192. acpi_os_printf ("Invalid Named object at address %pn", node);
  193. return;
  194. }
  195. acpi_ut_dump_buffer ((void *) node, sizeof (acpi_namespace_node), display, ACPI_UINT32_MAX);
  196. acpi_ex_dump_node (node, 1);
  197. if (node->object) {
  198. acpi_os_printf ("n_attached Object (%p):n", node->object);
  199. if (!acpi_os_readable (node->object, sizeof (acpi_operand_object))) {
  200. acpi_os_printf ("Invalid internal ACPI Object at address %pn", node->object);
  201. return;
  202. }
  203. acpi_ut_dump_buffer ((void *) node->object, sizeof (acpi_operand_object), display, ACPI_UINT32_MAX);
  204. acpi_ex_dump_object_descriptor (node->object, 1);
  205. }
  206. }
  207. /*******************************************************************************
  208.  *
  209.  * FUNCTION:    Acpi_db_decode_internal_object
  210.  *
  211.  * PARAMETERS:  Obj_desc        - Object to be displayed
  212.  *
  213.  * RETURN:      None
  214.  *
  215.  * DESCRIPTION: Short display of an internal object.  Numbers and Strings.
  216.  *
  217.  ******************************************************************************/
  218. void
  219. acpi_db_decode_internal_object (
  220. acpi_operand_object     *obj_desc)
  221. {
  222. u32                     i;
  223. if (!obj_desc) {
  224. return;
  225. }
  226. acpi_os_printf (" %s", acpi_ut_get_type_name (obj_desc->common.type));
  227. switch (obj_desc->common.type) {
  228. case ACPI_TYPE_INTEGER:
  229. acpi_os_printf (" %.8X%.8X", HIDWORD (obj_desc->integer.value),
  230.  LODWORD (obj_desc->integer.value));
  231. break;
  232. case ACPI_TYPE_STRING:
  233. acpi_os_printf ("(%d) "%.24s",
  234. obj_desc->string.length, obj_desc->string.pointer);
  235. if (obj_desc->string.length > 24)
  236. {
  237. acpi_os_printf ("...");
  238. }
  239. else
  240. {
  241. acpi_os_printf (""");
  242. }
  243. break;
  244. case ACPI_TYPE_BUFFER:
  245. acpi_os_printf ("(%d)", obj_desc->buffer.length);
  246. for (i = 0; (i < 8) && (i < obj_desc->buffer.length); i++) {
  247. acpi_os_printf (" %2.2X", obj_desc->buffer.pointer[i]);
  248. }
  249. break;
  250. }
  251. }
  252. /*******************************************************************************
  253.  *
  254.  * FUNCTION:    Acpi_db_display_internal_object
  255.  *
  256.  * PARAMETERS:  Obj_desc        - Object to be displayed
  257.  *              Walk_state      - Current walk state
  258.  *
  259.  * RETURN:      None
  260.  *
  261.  * DESCRIPTION: Short display of an internal object
  262.  *
  263.  ******************************************************************************/
  264. void
  265. acpi_db_display_internal_object (
  266. acpi_operand_object     *obj_desc,
  267. acpi_walk_state         *walk_state)
  268. {
  269. u8                      type;
  270. acpi_os_printf ("%p ", obj_desc);
  271. if (!obj_desc) {
  272. acpi_os_printf ("<Null_obj>n");
  273. return;
  274. }
  275. /* Decode the object type */
  276. else if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_PARSER)) {
  277. acpi_os_printf ("<Parser> ");
  278. }
  279. else if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_NAMED)) {
  280. acpi_os_printf ("<Node>          Name %4.4s Type-%s",
  281.   &((acpi_namespace_node *)obj_desc)->name,
  282.   acpi_ut_get_type_name (((acpi_namespace_node *) obj_desc)->type));
  283. if (((acpi_namespace_node *) obj_desc)->flags & ANOBJ_METHOD_ARG) {
  284. acpi_os_printf (" [Method Arg]");
  285. }
  286. if (((acpi_namespace_node *) obj_desc)->flags & ANOBJ_METHOD_LOCAL) {
  287. acpi_os_printf (" [Method Local]");
  288. }
  289. }
  290. else if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_INTERNAL)) {
  291. type = obj_desc->common.type;
  292. if (type > INTERNAL_TYPE_MAX) {
  293. acpi_os_printf (" Type %x [Invalid Type]", type);
  294. return;
  295. }
  296. /* Decode the ACPI object type */
  297. switch (obj_desc->common.type) {
  298. case INTERNAL_TYPE_REFERENCE:
  299. switch (obj_desc->reference.opcode) {
  300. case AML_ZERO_OP:
  301. acpi_os_printf ("[Const]         Zero (0) [Null Target]", 0);
  302. break;
  303. case AML_ONES_OP:
  304. acpi_os_printf ("[Const]         Ones (0xFFFFFFFFFFFFFFFF) [No Limit]");
  305. break;
  306. case AML_ONE_OP:
  307. acpi_os_printf ("[Const]         One (1)");
  308. break;
  309. case AML_REVISION_OP:
  310. acpi_os_printf ("[Const]         Revision (%X)", ACPI_CA_SUPPORT_LEVEL);
  311. break;
  312. case AML_LOCAL_OP:
  313. acpi_os_printf ("[Local%d]", obj_desc->reference.offset);
  314. if (walk_state) {
  315. obj_desc = walk_state->local_variables[obj_desc->reference.offset].object;
  316. acpi_os_printf (" %p", obj_desc);
  317. acpi_db_decode_internal_object (obj_desc);
  318. }
  319. break;
  320. case AML_ARG_OP:
  321. acpi_os_printf ("[Arg%d] ", obj_desc->reference.offset);
  322. if (walk_state) {
  323. obj_desc = walk_state->arguments[obj_desc->reference.offset].object;
  324. acpi_os_printf (" %p", obj_desc);
  325. acpi_db_decode_internal_object (obj_desc);
  326. }
  327. break;
  328. case AML_DEBUG_OP:
  329. acpi_os_printf ("[Debug] ");
  330. break;
  331. case AML_INDEX_OP:
  332. acpi_os_printf ("[Index]   ");
  333. acpi_db_decode_internal_object (obj_desc->reference.object);
  334. break;
  335. default:
  336. break;
  337. }
  338. break;
  339. default:
  340. acpi_os_printf ("<Obj> ");
  341. acpi_os_printf ("         ");
  342. acpi_db_decode_internal_object (obj_desc);
  343. break;
  344. }
  345. }
  346. else {
  347. acpi_os_printf ("<Not a valid ACPI Object Descriptor> ");
  348. }
  349. acpi_os_printf ("n");
  350. }
  351. /*******************************************************************************
  352.  *
  353.  * FUNCTION:    Acpi_db_display_method_info
  354.  *
  355.  * PARAMETERS:  Start_op        - Root of the control method parse tree
  356.  *
  357.  * RETURN:      None
  358.  *
  359.  * DESCRIPTION: Display information about the current method
  360.  *
  361.  ******************************************************************************/
  362. void
  363. acpi_db_display_method_info (
  364. acpi_parse_object       *start_op)
  365. {
  366. acpi_walk_state         *walk_state;
  367. acpi_operand_object     *obj_desc;
  368. acpi_namespace_node     *node;
  369. acpi_parse_object       *root_op;
  370. acpi_parse_object       *op;
  371. const acpi_opcode_info  *op_info;
  372. u32                     num_ops = 0;
  373. u32                     num_operands = 0;
  374. u32                     num_operators = 0;
  375. u32                     num_remaining_ops = 0;
  376. u32                     num_remaining_operands = 0;
  377. u32                     num_remaining_operators = 0;
  378. u32                     num_args;
  379. u32                     concurrency;
  380. u8                      count_remaining = FALSE;
  381. walk_state = acpi_ds_get_current_walk_state (acpi_gbl_current_walk_list);
  382. if (!walk_state) {
  383. acpi_os_printf ("There is no method currently executingn");
  384. return;
  385. }
  386. obj_desc = walk_state->method_desc;
  387. node = walk_state->method_node;
  388. num_args = obj_desc->method.param_count;
  389. concurrency = obj_desc->method.concurrency;
  390. acpi_os_printf ("Currently executing control method is [%4.4s]n", &node->name);
  391. acpi_os_printf ("%X arguments, max concurrency = %Xn", num_args, concurrency);
  392. root_op = start_op;
  393. while (root_op->parent) {
  394. root_op = root_op->parent;
  395. }
  396. op = root_op;
  397. while (op) {
  398. if (op == start_op) {
  399. count_remaining = TRUE;
  400. }
  401. num_ops++;
  402. if (count_remaining) {
  403. num_remaining_ops++;
  404. }
  405. /* Decode the opcode */
  406. op_info = acpi_ps_get_opcode_info (op->opcode);
  407. switch (op_info->class) {
  408. case AML_CLASS_ARGUMENT:
  409. if (count_remaining) {
  410. num_remaining_operands++;
  411. }
  412. num_operands++;
  413. break;
  414. case AML_CLASS_UNKNOWN:
  415. /* Bad opcode or ASCII character */
  416. continue;
  417. default:
  418. if (count_remaining) {
  419. num_remaining_operators++;
  420. }
  421. num_operators++;
  422. break;
  423. }
  424. op = acpi_ps_get_depth_next (start_op, op);
  425. }
  426. acpi_os_printf ("Method contains:     %X AML Opcodes - %X Operators, %X Operandsn",
  427.  num_ops, num_operators, num_operands);
  428. acpi_os_printf ("Remaining to execute: %X AML Opcodes - %X Operators, %X Operandsn",
  429.  num_remaining_ops, num_remaining_operators, num_remaining_operands);
  430. }
  431. /*******************************************************************************
  432.  *
  433.  * FUNCTION:    Acpi_db_display_locals
  434.  *
  435.  * PARAMETERS:  None
  436.  *
  437.  * RETURN:      None
  438.  *
  439.  * DESCRIPTION: Display all locals for the currently running control method
  440.  *
  441.  ******************************************************************************/
  442. void
  443. acpi_db_display_locals (void)
  444. {
  445. u32                     i;
  446. acpi_walk_state         *walk_state;
  447. acpi_operand_object     *obj_desc;
  448. acpi_namespace_node     *node;
  449. walk_state = acpi_ds_get_current_walk_state (acpi_gbl_current_walk_list);
  450. if (!walk_state) {
  451. acpi_os_printf ("There is no method currently executingn");
  452. return;
  453. }
  454. obj_desc = walk_state->method_desc;
  455. node = walk_state->method_node;
  456. acpi_os_printf ("Local Variables for method [%4.4s]:n", &node->name);
  457. for (i = 0; i < MTH_NUM_LOCALS; i++) {
  458. obj_desc = walk_state->local_variables[i].object;
  459. acpi_os_printf ("Local%d: ", i);
  460. acpi_db_display_internal_object (obj_desc, walk_state);
  461. }
  462. }
  463. /*******************************************************************************
  464.  *
  465.  * FUNCTION:    Acpi_db_display_arguments
  466.  *
  467.  * PARAMETERS:  None
  468.  *
  469.  * RETURN:      None
  470.  *
  471.  * DESCRIPTION: Display all arguments for the currently running control method
  472.  *
  473.  ******************************************************************************/
  474. void
  475. acpi_db_display_arguments (void)
  476. {
  477. u32                     i;
  478. acpi_walk_state         *walk_state;
  479. acpi_operand_object     *obj_desc;
  480. u32                     num_args;
  481. u32                     concurrency;
  482. acpi_namespace_node     *node;
  483. walk_state = acpi_ds_get_current_walk_state (acpi_gbl_current_walk_list);
  484. if (!walk_state) {
  485. acpi_os_printf ("There is no method currently executingn");
  486. return;
  487. }
  488. obj_desc = walk_state->method_desc;
  489. node = walk_state->method_node;
  490. num_args = obj_desc->method.param_count;
  491. concurrency = obj_desc->method.concurrency;
  492. acpi_os_printf ("Method [%4.4s] has %X arguments, max concurrency = %Xn", &node->name, num_args, concurrency);
  493. for (i = 0; i < num_args; i++) {
  494. obj_desc = walk_state->arguments[i].object;
  495. acpi_os_printf ("Arg%d: ", i);
  496. acpi_db_display_internal_object (obj_desc, walk_state);
  497. }
  498. }
  499. /*******************************************************************************
  500.  *
  501.  * FUNCTION:    Acpi_db_display_results
  502.  *
  503.  * PARAMETERS:  None
  504.  *
  505.  * RETURN:      None
  506.  *
  507.  * DESCRIPTION: Display current contents of a method result stack
  508.  *
  509.  ******************************************************************************/
  510. void
  511. acpi_db_display_results (void)
  512. {
  513. u32                     i;
  514. acpi_walk_state         *walk_state;
  515. acpi_operand_object     *obj_desc;
  516. u32                     num_results = 0;
  517. acpi_namespace_node     *node;
  518. walk_state = acpi_ds_get_current_walk_state (acpi_gbl_current_walk_list);
  519. if (!walk_state) {
  520. acpi_os_printf ("There is no method currently executingn");
  521. return;
  522. }
  523. obj_desc = walk_state->method_desc;
  524. node = walk_state->method_node;
  525. if (walk_state->results) {
  526. num_results = walk_state->results->results.num_results;
  527. }
  528. acpi_os_printf ("Method [%4.4s] has %X stacked result objectsn", &node->name, num_results);
  529. for (i = 0; i < num_results; i++) {
  530. obj_desc = walk_state->results->results.obj_desc[i];
  531. acpi_os_printf ("Result%d: ", i);
  532. acpi_db_display_internal_object (obj_desc, walk_state);
  533. }
  534. }
  535. /*******************************************************************************
  536.  *
  537.  * FUNCTION:    Acpi_db_display_calling_tree
  538.  *
  539.  * PARAMETERS:  None
  540.  *
  541.  * RETURN:      None
  542.  *
  543.  * DESCRIPTION: Display current calling tree of nested control methods
  544.  *
  545.  ******************************************************************************/
  546. void
  547. acpi_db_display_calling_tree (void)
  548. {
  549. u32                     i;
  550. acpi_walk_state         *walk_state;
  551. acpi_namespace_node     *node;
  552. walk_state = acpi_ds_get_current_walk_state (acpi_gbl_current_walk_list);
  553. if (!walk_state) {
  554. acpi_os_printf ("There is no method currently executingn");
  555. return;
  556. }
  557. node = walk_state->method_node;
  558. acpi_os_printf ("Current Control Method Call Treen");
  559. for (i = 0; walk_state; i++) {
  560. node = walk_state->method_node;
  561. acpi_os_printf ("  [%4.4s]n", &node->name);
  562. walk_state = walk_state->next;
  563. }
  564. }
  565. /*******************************************************************************
  566.  *
  567.  * FUNCTION:    Acpi_db_display_result_object
  568.  *
  569.  * PARAMETERS:  Obj_desc        - Object to be displayed
  570.  *              Walk_state      - Current walk state
  571.  *
  572.  * RETURN:      None
  573.  *
  574.  * DESCRIPTION: Display the result of an AML opcode
  575.  *
  576.  ******************************************************************************/
  577. void
  578. acpi_db_display_result_object (
  579. acpi_operand_object     *obj_desc,
  580. acpi_walk_state         *walk_state)
  581. {
  582. /* TBD: [Future] We don't always want to display the result.
  583.  * For now, only display if single stepping
  584.  * however, this output is very useful in other contexts also
  585.  */
  586. if (!acpi_gbl_cm_single_step) {
  587. return;
  588. }
  589. acpi_os_printf ("Result_obj: ");
  590. acpi_db_display_internal_object (obj_desc, walk_state);
  591. acpi_os_printf ("n");
  592. }
  593. /*******************************************************************************
  594.  *
  595.  * FUNCTION:    Acpi_db_display_argument_object
  596.  *
  597.  * PARAMETERS:  Obj_desc        - Object to be displayed
  598.  *              Walk_state      - Current walk state
  599.  *
  600.  * RETURN:      None
  601.  *
  602.  * DESCRIPTION: Display the result of an AML opcode
  603.  *
  604.  ******************************************************************************/
  605. void
  606. acpi_db_display_argument_object (
  607. acpi_operand_object     *obj_desc,
  608. acpi_walk_state         *walk_state)
  609. {
  610. if (!acpi_gbl_cm_single_step) {
  611. return;
  612. }
  613. acpi_os_printf ("Arg_obj: ");
  614. acpi_db_display_internal_object (obj_desc, walk_state);
  615. }
  616. #endif /* ENABLE_DEBUGGER */