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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*******************************************************************************
  2.  *
  3.  * Module Name: dbcmds - debug commands and output routines
  4.  *              $Revision: 66 $
  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 "acdispat.h"
  27. #include "amlcode.h"
  28. #include "acnamesp.h"
  29. #include "acparser.h"
  30. #include "acevents.h"
  31. #include "acinterp.h"
  32. #include "acdebug.h"
  33. #include "actables.h"
  34. #include "acresrc.h"
  35. #ifdef ENABLE_DEBUGGER
  36. #define _COMPONENT          ACPI_DEBUGGER
  37.  MODULE_NAME         ("dbcmds")
  38. /*
  39.  * Arguments for the Objects command
  40.  * These object types map directly to the ACPI_TYPES
  41.  */
  42. ARGUMENT_INFO         acpi_db_object_types [] =
  43. { {"ANY"},
  44. {"NUMBERS"},
  45. {"STRINGS"},
  46. {"BUFFERS"},
  47. {"PACKAGES"},
  48. {"FIELDS"},
  49. {"DEVICES"},
  50. {"EVENTS"},
  51. {"METHODS"},
  52. {"MUTEXES"},
  53. {"REGIONS"},
  54. {"POWERRESOURCES"},
  55. {"PROCESSORS"},
  56. {"THERMALZONES"},
  57. {"BUFFERFIELDS"},
  58. {"DDBHANDLES"},
  59. {NULL}           /* Must be null terminated */
  60. };
  61. /*******************************************************************************
  62.  *
  63.  * FUNCTION:    Acpi_db_walk_for_references
  64.  *
  65.  * PARAMETERS:  Callback from Walk_namespace
  66.  *
  67.  * RETURN:      Status
  68.  *
  69.  * DESCRIPTION: Check if this namespace object refers to the target object
  70.  *              that is passed in as the context value.
  71.  *
  72.  ******************************************************************************/
  73. acpi_status
  74. acpi_db_walk_for_references (
  75. acpi_handle             obj_handle,
  76. u32                     nesting_level,
  77. void                    *context,
  78. void                    **return_value)
  79. {
  80. acpi_operand_object     *obj_desc = (acpi_operand_object *) context;
  81. acpi_namespace_node     *node = (acpi_namespace_node *) obj_handle;
  82. /* Check for match against the namespace node itself */
  83. if (node == (void *) obj_desc) {
  84. acpi_os_printf ("Object is a Node [%4.4s]n", &node->name);
  85. }
  86. /* Check for match against the object attached to the node */
  87. if (node->object == obj_desc) {
  88. acpi_os_printf ("Reference at Node->Object %p [%4.4s]n", node, &node->name);
  89. }
  90. /* Check first child for a match */
  91. /* TBD: [Investigate] probably now obsolete with new datastructure */
  92. if (node->child == (void *) obj_desc) {
  93. acpi_os_printf ("Reference at Node->Child %p [%4.4s]n", node, &node->name);
  94. }
  95. return (AE_OK);
  96. }
  97. /*******************************************************************************
  98.  *
  99.  * FUNCTION:    Acpi_db_find_references
  100.  *
  101.  * PARAMETERS:  Object_arg      - String with hex value of the object
  102.  *
  103.  * RETURN:      None
  104.  *
  105.  * DESCRIPTION: Search namespace for all references to the input object
  106.  *
  107.  ******************************************************************************/
  108. void
  109. acpi_db_find_references (
  110. NATIVE_CHAR             *object_arg)
  111. {
  112. acpi_operand_object     *obj_desc;
  113. /* Convert string to object pointer */
  114. obj_desc = (acpi_operand_object *) STRTOUL (object_arg, NULL, 16);
  115. /* Search all nodes in namespace */
  116. acpi_walk_namespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
  117.   acpi_db_walk_for_references, (void *) obj_desc, NULL);
  118. }
  119. /*******************************************************************************
  120.  *
  121.  * FUNCTION:    Acpi_db_display_locks
  122.  *
  123.  * PARAMETERS:  None
  124.  *
  125.  * RETURN:      None
  126.  *
  127.  * DESCRIPTION: Display information about internal mutexes.
  128.  *
  129.  ******************************************************************************/
  130. void
  131. acpi_db_display_locks (void)
  132. {
  133. u32                     i;
  134. for (i = 0; i < MAX_MTX; i++) {
  135. acpi_os_printf ("%26s : %sn", acpi_ut_get_mutex_name (i),
  136.  acpi_gbl_acpi_mutex_info[i].owner_id == ACPI_MUTEX_NOT_ACQUIRED
  137. ? "Locked" : "Unlocked");
  138. }
  139. }
  140. /*******************************************************************************
  141.  *
  142.  * FUNCTION:    Acpi_db_display_table_info
  143.  *
  144.  * PARAMETERS:  Table_arg       - String with name of table to be displayed
  145.  *
  146.  * RETURN:      None
  147.  *
  148.  * DESCRIPTION: Display information about loaded tables.  Current
  149.  *              implementation displays all loaded tables.
  150.  *
  151.  ******************************************************************************/
  152. void
  153. acpi_db_display_table_info (
  154. NATIVE_CHAR             *table_arg)
  155. {
  156. u32                     i;
  157. for (i = 0; i < NUM_ACPI_TABLES; i++) {
  158. if (acpi_gbl_acpi_tables[i].pointer) {
  159. acpi_os_printf ("%s at %p length %Xn", acpi_gbl_acpi_table_data[i].name,
  160.  acpi_gbl_acpi_tables[i].pointer, acpi_gbl_acpi_tables[i].length);
  161. }
  162. }
  163. }
  164. /*******************************************************************************
  165.  *
  166.  * FUNCTION:    Acpi_db_unload_acpi_table
  167.  *
  168.  * PARAMETERS:  Table_arg       - Name of the table to be unloaded
  169.  *              Instance_arg    - Which instance of the table to unload (if
  170.  *                                there are multiple tables of the same type)
  171.  *
  172.  * RETURN:      Nonde
  173.  *
  174.  * DESCRIPTION: Unload an ACPI table.
  175.  *              Instance is not implemented
  176.  *
  177.  ******************************************************************************/
  178. void
  179. acpi_db_unload_acpi_table (
  180. NATIVE_CHAR             *table_arg,
  181. NATIVE_CHAR             *instance_arg)
  182. {
  183. u32                     i;
  184. acpi_status             status;
  185. /* Search all tables for the target type */
  186. for (i = 0; i < NUM_ACPI_TABLES; i++) {
  187. if (!STRNCMP (table_arg, acpi_gbl_acpi_table_data[i].signature,
  188. acpi_gbl_acpi_table_data[i].sig_length)) {
  189. /* Found the table, unload it */
  190. status = acpi_unload_table (i);
  191. if (ACPI_SUCCESS (status)) {
  192. acpi_os_printf ("[%s] unloaded and uninstalledn", table_arg);
  193. }
  194. else {
  195. acpi_os_printf ("%s, while unloading [%s]n",
  196. acpi_format_exception (status), table_arg);
  197. }
  198. return;
  199. }
  200. }
  201. acpi_os_printf ("Unknown table type [%s]n", table_arg);
  202. }
  203. /*******************************************************************************
  204.  *
  205.  * FUNCTION:    Acpi_db_set_method_breakpoint
  206.  *
  207.  * PARAMETERS:  Location            - AML offset of breakpoint
  208.  *              Walk_state          - Current walk info
  209.  *              Op                  - Current Op (from parse walk)
  210.  *
  211.  * RETURN:      None
  212.  *
  213.  * DESCRIPTION: Set a breakpoint in a control method at the specified
  214.  *              AML offset
  215.  *
  216.  ******************************************************************************/
  217. void
  218. acpi_db_set_method_breakpoint (
  219. NATIVE_CHAR             *location,
  220. acpi_walk_state         *walk_state,
  221. acpi_parse_object       *op)
  222. {
  223. u32                     address;
  224. if (!op) {
  225. acpi_os_printf ("There is no method currently executingn");
  226. return;
  227. }
  228. /* Get and verify the breakpoint address */
  229. address = STRTOUL (location, NULL, 16);
  230. if (address <= op->aml_offset) {
  231. acpi_os_printf ("Breakpoint %X is beyond current address %Xn", address, op->aml_offset);
  232. }
  233. /* Save breakpoint in current walk */
  234. walk_state->method_breakpoint = address;
  235. acpi_os_printf ("Breakpoint set at AML offset %Xn", address);
  236. }
  237. /*******************************************************************************
  238.  *
  239.  * FUNCTION:    Acpi_db_set_method_call_breakpoint
  240.  *
  241.  * PARAMETERS:  Op                  - Current Op (from parse walk)
  242.  *
  243.  * RETURN:      None
  244.  *
  245.  * DESCRIPTION: Set a breakpoint in a control method at the specified
  246.  *              AML offset
  247.  *
  248.  ******************************************************************************/
  249. void
  250. acpi_db_set_method_call_breakpoint (
  251. acpi_parse_object       *op)
  252. {
  253. if (!op) {
  254. acpi_os_printf ("There is no method currently executingn");
  255. return;
  256. }
  257. acpi_gbl_step_to_next_call = TRUE;
  258. }
  259. /*******************************************************************************
  260.  *
  261.  * FUNCTION:    Acpi_db_disassemble_aml
  262.  *
  263.  * PARAMETERS:  Statements          - Number of statements to disassemble
  264.  *              Op                  - Current Op (from parse walk)
  265.  *
  266.  * RETURN:      None
  267.  *
  268.  * DESCRIPTION: Display disassembled AML (ASL) starting from Op for the number
  269.  *              of statements specified.
  270.  *
  271.  ******************************************************************************/
  272. void
  273. acpi_db_disassemble_aml (
  274. NATIVE_CHAR             *statements,
  275. acpi_parse_object       *op)
  276. {
  277. u32                     num_statements = 8;
  278. if (!op) {
  279. acpi_os_printf ("There is no method currently executingn");
  280. return;
  281. }
  282. if (statements) {
  283. num_statements = STRTOUL (statements, NULL, 0);
  284. }
  285. acpi_db_display_op (NULL, op, num_statements);
  286. }
  287. /*******************************************************************************
  288.  *
  289.  * FUNCTION:    Acpi_db_dump_namespace
  290.  *
  291.  * PARAMETERS:  Start_arg       - Node to begin namespace dump
  292.  *              Depth_arg       - Maximum tree depth to be dumped
  293.  *
  294.  * RETURN:      None
  295.  *
  296.  * DESCRIPTION: Dump entire namespace or a subtree.  Each node is displayed
  297.  *              with type and other information.
  298.  *
  299.  ******************************************************************************/
  300. void
  301. acpi_db_dump_namespace (
  302. NATIVE_CHAR             *start_arg,
  303. NATIVE_CHAR             *depth_arg)
  304. {
  305. acpi_handle             subtree_entry = acpi_gbl_root_node;
  306. u32                     max_depth = ACPI_UINT32_MAX;
  307. /* No argument given, just start at the root and dump entire namespace */
  308. if (start_arg) {
  309. /* Check if numeric argument, must be a Node */
  310. if ((start_arg[0] >= 0x30) && (start_arg[0] <= 0x39)) {
  311. subtree_entry = (acpi_handle) STRTOUL (start_arg, NULL, 16);
  312. if (!acpi_os_readable (subtree_entry, sizeof (acpi_namespace_node))) {
  313. acpi_os_printf ("Address %p is invalid in this address spacen", subtree_entry);
  314. return;
  315. }
  316. if (!VALID_DESCRIPTOR_TYPE ((subtree_entry), ACPI_DESC_TYPE_NAMED)) {
  317. acpi_os_printf ("Address %p is not a valid Named objectn", subtree_entry);
  318. return;
  319. }
  320. }
  321. /* Alpha argument */
  322. else {
  323. /* The parameter is a name string that must be resolved to a Named obj*/
  324. subtree_entry = acpi_db_local_ns_lookup (start_arg);
  325. if (!subtree_entry) {
  326. subtree_entry = acpi_gbl_root_node;
  327. }
  328. }
  329. /* Now we can check for the depth argument */
  330. if (depth_arg) {
  331. max_depth = STRTOUL (depth_arg, NULL, 0);
  332. }
  333. }
  334. acpi_db_set_output_destination (DB_DUPLICATE_OUTPUT);
  335. acpi_os_printf ("ACPI Namespace (from %p subtree):n", subtree_entry);
  336. /* Display the subtree */
  337. acpi_db_set_output_destination (DB_REDIRECTABLE_OUTPUT);
  338. acpi_ns_dump_objects (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, max_depth, ACPI_UINT32_MAX, subtree_entry);
  339. acpi_db_set_output_destination (DB_CONSOLE_OUTPUT);
  340. }
  341. /*******************************************************************************
  342.  *
  343.  * FUNCTION:    Acpi_db_dump_namespace_by_owner
  344.  *
  345.  * PARAMETERS:  Owner_arg       - Owner ID whose nodes will be displayed
  346.  *              Depth_arg       - Maximum tree depth to be dumped
  347.  *
  348.  * RETURN:      None
  349.  *
  350.  * DESCRIPTION: Dump elements of the namespace that are owned by the Owner_id.
  351.  *
  352.  ******************************************************************************/
  353. void
  354. acpi_db_dump_namespace_by_owner (
  355. NATIVE_CHAR             *owner_arg,
  356. NATIVE_CHAR             *depth_arg)
  357. {
  358. acpi_handle             subtree_entry = acpi_gbl_root_node;
  359. u32                     max_depth = ACPI_UINT32_MAX;
  360. u16                     owner_id;
  361. owner_id = (u16) STRTOUL (owner_arg, NULL, 0);
  362. /* Now we can check for the depth argument */
  363. if (depth_arg) {
  364. max_depth = STRTOUL (depth_arg, NULL, 0);
  365. }
  366. acpi_db_set_output_destination (DB_DUPLICATE_OUTPUT);
  367. acpi_os_printf ("ACPI Namespace by owner %X:n", owner_id);
  368. /* Display the subtree */
  369. acpi_db_set_output_destination (DB_REDIRECTABLE_OUTPUT);
  370. acpi_ns_dump_objects (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, max_depth, owner_id, subtree_entry);
  371. acpi_db_set_output_destination (DB_CONSOLE_OUTPUT);
  372. }
  373. /*******************************************************************************
  374.  *
  375.  * FUNCTION:    Acpi_db_send_notify
  376.  *
  377.  * PARAMETERS:  Name            - Name of ACPI object to send the notify to
  378.  *              Value           - Value of the notify to send.
  379.  *
  380.  * RETURN:      None
  381.  *
  382.  * DESCRIPTION: Send an ACPI notification.  The value specified is sent to the
  383.  *              named object as an ACPI notify.
  384.  *
  385.  ******************************************************************************/
  386. void
  387. acpi_db_send_notify (
  388. NATIVE_CHAR             *name,
  389. u32                     value)
  390. {
  391. acpi_namespace_node     *node;
  392. /* Translate name to an Named object */
  393. node = acpi_db_local_ns_lookup (name);
  394. if (!node) {
  395. return;
  396. }
  397. /* Decode Named object type */
  398. switch (node->type) {
  399. case ACPI_TYPE_DEVICE:
  400. case ACPI_TYPE_THERMAL:
  401.  /* Send the notify */
  402. acpi_ev_queue_notify_request (node, value);
  403. break;
  404. default:
  405. acpi_os_printf ("Named object is not a device or a thermal objectn");
  406. break;
  407. }
  408. }
  409. /*******************************************************************************
  410.  *
  411.  * FUNCTION:    Acpi_db_set_method_data
  412.  *
  413.  * PARAMETERS:  Type_arg        - L for local, A for argument
  414.  *              Index_arg       - which one
  415.  *              Value_arg       - Value to set.
  416.  *
  417.  * RETURN:      None
  418.  *
  419.  * DESCRIPTION: Set a local or argument for the running control method.
  420.  *              NOTE: only object supported is Number.
  421.  *
  422.  ******************************************************************************/
  423. void
  424. acpi_db_set_method_data (
  425. NATIVE_CHAR             *type_arg,
  426. NATIVE_CHAR             *index_arg,
  427. NATIVE_CHAR             *value_arg)
  428. {
  429. NATIVE_CHAR             type;
  430. u32                     index;
  431. u32                     value;
  432. acpi_walk_state         *walk_state;
  433. acpi_operand_object     *obj_desc;
  434. /* Validate Type_arg */
  435. STRUPR (type_arg);
  436. type = type_arg[0];
  437. if ((type != 'L') &&
  438. (type != 'A')) {
  439. acpi_os_printf ("Invalid SET operand: %sn", type_arg);
  440. return;
  441. }
  442. /* Get the index and value */
  443. index = STRTOUL (index_arg, NULL, 16);
  444. value = STRTOUL (value_arg, NULL, 16);
  445. walk_state = acpi_ds_get_current_walk_state (acpi_gbl_current_walk_list);
  446. if (!walk_state) {
  447. acpi_os_printf ("There is no method currently executingn");
  448. return;
  449. }
  450. /* Create and initialize the new object */
  451. obj_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER);
  452. if (!obj_desc) {
  453. acpi_os_printf ("Could not create an internal objectn");
  454. return;
  455. }
  456. obj_desc->integer.value = value;
  457. /* Store the new object into the target */
  458. switch (type) {
  459. case 'A':
  460. /* Set a method argument */
  461. if (index > MTH_NUM_ARGS) {
  462. acpi_os_printf ("Arg%d - Invalid argument namen", index);
  463. return;
  464. }
  465. acpi_ds_store_object_to_local (AML_ARG_OP, index, obj_desc, walk_state);
  466. obj_desc = walk_state->arguments[index].object;
  467. acpi_os_printf ("Arg%d: ", index);
  468. acpi_db_display_internal_object (obj_desc, walk_state);
  469. break;
  470. case 'L':
  471. /* Set a method local */
  472. if (index > MTH_NUM_LOCALS) {
  473. acpi_os_printf ("Local%d - Invalid local variable namen", index);
  474. return;
  475. }
  476. acpi_ds_store_object_to_local (AML_LOCAL_OP, index, obj_desc, walk_state);
  477. obj_desc = walk_state->local_variables[index].object;
  478. acpi_os_printf ("Local%d: ", index);
  479. acpi_db_display_internal_object (obj_desc, walk_state);
  480. break;
  481. default:
  482. break;
  483. }
  484. }
  485. /*******************************************************************************
  486.  *
  487.  * FUNCTION:    Acpi_db_walk_for_specific_objects
  488.  *
  489.  * PARAMETERS:  Callback from Walk_namespace
  490.  *
  491.  * RETURN:      Status
  492.  *
  493.  * DESCRIPTION: Display short info about objects in the namespace
  494.  *
  495.  ******************************************************************************/
  496. acpi_status
  497. acpi_db_walk_for_specific_objects (
  498. acpi_handle             obj_handle,
  499. u32                     nesting_level,
  500. void                    *context,
  501. void                    **return_value)
  502. {
  503. acpi_operand_object     *obj_desc;
  504. acpi_status             status;
  505. u32                     buf_size;
  506. NATIVE_CHAR             buffer[64];
  507. obj_desc = ((acpi_namespace_node *)obj_handle)->object;
  508. buf_size = sizeof (buffer) / sizeof (*buffer);
  509. /* Get and display the full pathname to this object */
  510. status = acpi_ns_handle_to_pathname (obj_handle, &buf_size, buffer);
  511. if (ACPI_FAILURE (status)) {
  512. acpi_os_printf ("Could Not get pathname for object %pn", obj_handle);
  513. return (AE_OK);
  514. }
  515. acpi_os_printf ("%32s", buffer);
  516. /* Display short information about the object */
  517. if (obj_desc) {
  518. switch (obj_desc->common.type) {
  519. case ACPI_TYPE_METHOD:
  520. acpi_os_printf (" #Args %d Concurrency %X", obj_desc->method.param_count, obj_desc->method.concurrency);
  521. break;
  522. case ACPI_TYPE_INTEGER:
  523. acpi_os_printf (" Value %X", obj_desc->integer.value);
  524. break;
  525. case ACPI_TYPE_STRING:
  526. acpi_os_printf (" "%s"", obj_desc->string.pointer);
  527. break;
  528. case ACPI_TYPE_REGION:
  529. acpi_os_printf (" Space_id %X Address %X Length %X", obj_desc->region.space_id, obj_desc->region.address, obj_desc->region.length);
  530. break;
  531. case ACPI_TYPE_PACKAGE:
  532. acpi_os_printf (" #Elements %X", obj_desc->package.count);
  533. break;
  534. case ACPI_TYPE_BUFFER:
  535. acpi_os_printf (" Length %X", obj_desc->buffer.length);
  536. break;
  537. }
  538. }
  539. acpi_os_printf ("n");
  540. return (AE_OK);
  541. }
  542. /*******************************************************************************
  543.  *
  544.  * FUNCTION:    Acpi_db_display_objects
  545.  *
  546.  * PARAMETERS:  Obj_type_arg        - Type of object to display
  547.  *              Display_count_arg   - Max depth to display
  548.  *
  549.  * RETURN:      None
  550.  *
  551.  * DESCRIPTION: Display objects in the namespace of the requested type
  552.  *
  553.  ******************************************************************************/
  554. acpi_status
  555. acpi_db_display_objects (
  556. NATIVE_CHAR             *obj_type_arg,
  557. NATIVE_CHAR             *display_count_arg)
  558. {
  559. acpi_object_type8       type;
  560. /* Get the object type */
  561. type = acpi_db_match_argument (obj_type_arg, acpi_db_object_types);
  562. if (type == ACPI_TYPE_NOT_FOUND) {
  563. acpi_os_printf ("Invalid or unsupported argumentn");
  564. return (AE_OK);
  565. }
  566. acpi_db_set_output_destination (DB_DUPLICATE_OUTPUT);
  567. acpi_os_printf ("Objects of type [%s] defined in the current ACPI Namespace: n", acpi_ut_get_type_name (type));
  568. acpi_db_set_output_destination (DB_REDIRECTABLE_OUTPUT);
  569. /* Walk the namespace from the root */
  570. acpi_walk_namespace (type, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
  571.    acpi_db_walk_for_specific_objects, (void *) &type, NULL);
  572. acpi_db_set_output_destination (DB_CONSOLE_OUTPUT);
  573. return (AE_OK);
  574. }
  575. /*******************************************************************************
  576.  *
  577.  * FUNCTION:    Acpi_db_walk_and_match_name
  578.  *
  579.  * PARAMETERS:  Callback from Walk_namespace
  580.  *
  581.  * RETURN:      Status
  582.  *
  583.  * DESCRIPTION: Find a particular name/names within the namespace.  Wildcards
  584.  *              are supported -- '?' matches any character.
  585.  *
  586.  ******************************************************************************/
  587. acpi_status
  588. acpi_db_walk_and_match_name (
  589. acpi_handle             obj_handle,
  590. u32                     nesting_level,
  591. void                    *context,
  592. void                    **return_value)
  593. {
  594. acpi_status             status;
  595. NATIVE_CHAR             *requested_name = (NATIVE_CHAR *) context;
  596. u32                     i;
  597. u32                     buf_size;
  598. NATIVE_CHAR             buffer[96];
  599. /* Check for a name match */
  600. for (i = 0; i < 4; i++) {
  601. /* Wildcard support */
  602. if ((requested_name[i] != '?') &&
  603. (requested_name[i] != ((NATIVE_CHAR *) (&((acpi_namespace_node *) obj_handle)->name))[i])) {
  604. /* No match, just exit */
  605. return (AE_OK);
  606. }
  607. }
  608. /* Get the full pathname to this object */
  609. buf_size = sizeof (buffer) / sizeof (*buffer);
  610. status = acpi_ns_handle_to_pathname (obj_handle, &buf_size, buffer);
  611. if (ACPI_FAILURE (status)) {
  612. acpi_os_printf ("Could Not get pathname for object %pn", obj_handle);
  613. }
  614. else {
  615. acpi_os_printf ("%32s (%p) - %sn", buffer, obj_handle,
  616. acpi_ut_get_type_name (((acpi_namespace_node *) obj_handle)->type));
  617. }
  618. return (AE_OK);
  619. }
  620. /*******************************************************************************
  621.  *
  622.  * FUNCTION:    Acpi_db_find_name_in_namespace
  623.  *
  624.  * PARAMETERS:  Name_arg        - The 4-character ACPI name to find.
  625.  *                                wildcards are supported.
  626.  *
  627.  * RETURN:      None
  628.  *
  629.  * DESCRIPTION: Search the namespace for a given name (with wildcards)
  630.  *
  631.  ******************************************************************************/
  632. acpi_status
  633. acpi_db_find_name_in_namespace (
  634. NATIVE_CHAR             *name_arg)
  635. {
  636. if (STRLEN (name_arg) > 4) {
  637. acpi_os_printf ("Name must be no longer than 4 charactersn");
  638. return (AE_OK);
  639. }
  640. /* Walk the namespace from the root */
  641. acpi_walk_namespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
  642.    acpi_db_walk_and_match_name, name_arg, NULL);
  643. acpi_db_set_output_destination (DB_CONSOLE_OUTPUT);
  644. return (AE_OK);
  645. }
  646. /*******************************************************************************
  647.  *
  648.  * FUNCTION:    Acpi_db_set_scope
  649.  *
  650.  * PARAMETERS:  Name                - New scope path
  651.  *
  652.  * RETURN:      Status
  653.  *
  654.  * DESCRIPTION: Set the "current scope" as maintained by this utility.
  655.  *              The scope is used as a prefix to ACPI paths.
  656.  *
  657.  ******************************************************************************/
  658. void
  659. acpi_db_set_scope (
  660. NATIVE_CHAR             *name)
  661. {
  662. if (!name || name[0] == 0) {
  663. acpi_os_printf ("Current scope: %sn", acpi_gbl_db_scope_buf);
  664. return;
  665. }
  666. acpi_db_prep_namestring (name);
  667. /* TBD: [Future] Validate scope here */
  668. if (name[0] == '\') {
  669. STRCPY (acpi_gbl_db_scope_buf, name);
  670. STRCAT (acpi_gbl_db_scope_buf, "\");
  671. }
  672. else {
  673. STRCAT (acpi_gbl_db_scope_buf, name);
  674. STRCAT (acpi_gbl_db_scope_buf, "\");
  675. }
  676. acpi_os_printf ("New scope: %sn", acpi_gbl_db_scope_buf);
  677. }
  678. /*******************************************************************************
  679.  *
  680.  * FUNCTION:    Acpi_db_display_resources
  681.  *
  682.  * PARAMETERS:  Object_arg      - String with hex value of the object
  683.  *
  684.  * RETURN:      None
  685.  *
  686.  * DESCRIPTION:
  687.  *
  688.  ******************************************************************************/
  689. void
  690. acpi_db_display_resources (
  691. NATIVE_CHAR             *object_arg)
  692. {
  693. #ifndef _IA16
  694. acpi_operand_object     *obj_desc;
  695. acpi_status             status;
  696. acpi_buffer             return_obj;
  697. acpi_db_set_output_destination (DB_REDIRECTABLE_OUTPUT);
  698. /* Convert string to object pointer */
  699. obj_desc = (acpi_operand_object *) STRTOUL (object_arg, NULL, 16);
  700. /* Prepare for a return object of arbitrary size */
  701. return_obj.pointer          = acpi_gbl_db_buffer;
  702. return_obj.length           = ACPI_DEBUG_BUFFER_SIZE;
  703. /* _PRT */
  704. acpi_os_printf ("Evaluating _PRTn");
  705. status = acpi_evaluate_object (obj_desc, "_PRT", NULL, &return_obj);
  706. if (ACPI_FAILURE (status)) {
  707. acpi_os_printf ("Could not obtain _PRT: %sn", acpi_format_exception (status));
  708. goto get_crs;
  709. }
  710. return_obj.pointer          = acpi_gbl_db_buffer;
  711. return_obj.length           = ACPI_DEBUG_BUFFER_SIZE;
  712. status = acpi_get_irq_routing_table (obj_desc, &return_obj);
  713. if (ACPI_FAILURE (status)) {
  714. acpi_os_printf ("Get_irq_routing_table failed: %sn", acpi_format_exception (status));
  715. }
  716. else {
  717. acpi_rs_dump_irq_list ((u8 *) acpi_gbl_db_buffer);
  718. }
  719. /* _CRS */
  720. get_crs:
  721. acpi_os_printf ("Evaluating _CRSn");
  722. return_obj.pointer          = acpi_gbl_db_buffer;
  723. return_obj.length           = ACPI_DEBUG_BUFFER_SIZE;
  724. status = acpi_evaluate_object (obj_desc, "_CRS", NULL, &return_obj);
  725. if (ACPI_FAILURE (status)) {
  726. acpi_os_printf ("Could not obtain _CRS: %sn", acpi_format_exception (status));
  727. goto get_prs;
  728. }
  729. return_obj.pointer          = acpi_gbl_db_buffer;
  730. return_obj.length           = ACPI_DEBUG_BUFFER_SIZE;
  731. status = acpi_get_current_resources (obj_desc, &return_obj);
  732. if (ACPI_FAILURE (status)) {
  733. acpi_os_printf ("Acpi_get_current_resources failed: %sn", acpi_format_exception (status));
  734. }
  735. else {
  736. acpi_rs_dump_resource_list ((acpi_resource *) acpi_gbl_db_buffer);
  737. }
  738. /* _PRS */
  739. get_prs:
  740. acpi_os_printf ("Evaluating _PRSn");
  741. return_obj.pointer          = acpi_gbl_db_buffer;
  742. return_obj.length           = ACPI_DEBUG_BUFFER_SIZE;
  743. status = acpi_evaluate_object (obj_desc, "_PRS", NULL, &return_obj);
  744. if (ACPI_FAILURE (status)) {
  745. acpi_os_printf ("Could not obtain _PRS: %sn", acpi_format_exception (status));
  746. goto cleanup;
  747. }
  748. return_obj.pointer          = acpi_gbl_db_buffer;
  749. return_obj.length           = ACPI_DEBUG_BUFFER_SIZE;
  750. status = acpi_get_possible_resources (obj_desc, &return_obj);
  751. if (ACPI_FAILURE (status)) {
  752. acpi_os_printf ("Acpi_get_possible_resources failed: %sn", acpi_format_exception (status));
  753. }
  754. else {
  755. acpi_rs_dump_resource_list ((acpi_resource *) acpi_gbl_db_buffer);
  756. }
  757. cleanup:
  758. acpi_db_set_output_destination (DB_CONSOLE_OUTPUT);
  759. return;
  760. #endif
  761. }
  762. #endif /* ENABLE_DEBUGGER */