Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /******************************************************************************
  2.  *
  3.  * Module Name: nsdump - table dumping routines for debug
  4.  *
  5.  *****************************************************************************/
  6.  
  7. /*
  8.  * Copyright (C) 2000 - 2015, Intel Corp.
  9.  * All rights reserved.
  10.  *
  11.  * Redistribution and use in source and binary forms, with or without
  12.  * modification, are permitted provided that the following conditions
  13.  * are met:
  14.  * 1. Redistributions of source code must retain the above copyright
  15.  *    notice, this list of conditions, and the following disclaimer,
  16.  *    without modification.
  17.  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
  18.  *    substantially similar to the "NO WARRANTY" disclaimer below
  19.  *    ("Disclaimer") and any redistribution must be conditioned upon
  20.  *    including a substantially similar Disclaimer requirement for further
  21.  *    binary redistribution.
  22.  * 3. Neither the names of the above-listed copyright holders nor the names
  23.  *    of any contributors may be used to endorse or promote products derived
  24.  *    from this software without specific prior written permission.
  25.  *
  26.  * Alternatively, this software may be distributed under the terms of the
  27.  * GNU General Public License ("GPL") version 2 as published by the Free
  28.  * Software Foundation.
  29.  *
  30.  * NO WARRANTY
  31.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  32.  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  33.  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
  34.  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  35.  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  36.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  37.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  38.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  39.  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
  40.  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  41.  * POSSIBILITY OF SUCH DAMAGES.
  42.  */
  43.  
  44. #include <acpi/acpi.h>
  45. #include "accommon.h"
  46. #include "acnamesp.h"
  47. #include <acpi/acoutput.h>
  48.  
  49. #define _COMPONENT          ACPI_NAMESPACE
  50. ACPI_MODULE_NAME("nsdump")
  51.  
  52. /* Local prototypes */
  53. #ifdef ACPI_OBSOLETE_FUNCTIONS
  54. void acpi_ns_dump_root_devices(void);
  55.  
  56. static acpi_status
  57. acpi_ns_dump_one_device(acpi_handle obj_handle,
  58.                         u32 level, void *context, void **return_value);
  59. #endif
  60.  
  61. #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
  62.  
  63. static acpi_status
  64. acpi_ns_dump_one_object_path(acpi_handle obj_handle,
  65.                              u32 level, void *context, void **return_value);
  66.  
  67. static acpi_status
  68. acpi_ns_get_max_depth(acpi_handle obj_handle,
  69.                       u32 level, void *context, void **return_value);
  70.  
  71. /*******************************************************************************
  72.  *
  73.  * FUNCTION:    acpi_ns_print_pathname
  74.  *
  75.  * PARAMETERS:  num_segments        - Number of ACPI name segments
  76.  *              pathname            - The compressed (internal) path
  77.  *
  78.  * RETURN:      None
  79.  *
  80.  * DESCRIPTION: Print an object's full namespace pathname
  81.  *
  82.  ******************************************************************************/
  83.  
  84. void acpi_ns_print_pathname(u32 num_segments, char *pathname)
  85. {
  86.         u32 i;
  87.  
  88.         ACPI_FUNCTION_NAME(ns_print_pathname);
  89.  
  90.         /* Check if debug output enabled */
  91.  
  92.         if (!ACPI_IS_DEBUG_ENABLED(ACPI_LV_NAMES, ACPI_NAMESPACE)) {
  93.                 return;
  94.         }
  95.  
  96.         /* Print the entire name */
  97.  
  98.         ACPI_DEBUG_PRINT((ACPI_DB_NAMES, "["));
  99.  
  100.         while (num_segments) {
  101.                 for (i = 0; i < 4; i++) {
  102.                         isprint((int)pathname[i]) ?
  103.                             acpi_os_printf("%c", pathname[i]) :
  104.                             acpi_os_printf("?");
  105.                 }
  106.  
  107.                 pathname += ACPI_NAME_SIZE;
  108.                 num_segments--;
  109.                 if (num_segments) {
  110.                         acpi_os_printf(".");
  111.                 }
  112.         }
  113.  
  114.         acpi_os_printf("]\n");
  115. }
  116.  
  117. /*******************************************************************************
  118.  *
  119.  * FUNCTION:    acpi_ns_dump_pathname
  120.  *
  121.  * PARAMETERS:  handle              - Object
  122.  *              msg                 - Prefix message
  123.  *              level               - Desired debug level
  124.  *              component           - Caller's component ID
  125.  *
  126.  * RETURN:      None
  127.  *
  128.  * DESCRIPTION: Print an object's full namespace pathname
  129.  *              Manages allocation/freeing of a pathname buffer
  130.  *
  131.  ******************************************************************************/
  132.  
  133. void
  134. acpi_ns_dump_pathname(acpi_handle handle, char *msg, u32 level, u32 component)
  135. {
  136.  
  137.         ACPI_FUNCTION_TRACE(ns_dump_pathname);
  138.  
  139.         /* Do this only if the requested debug level and component are enabled */
  140.  
  141.         if (!ACPI_IS_DEBUG_ENABLED(level, component)) {
  142.                 return_VOID;
  143.         }
  144.  
  145.         /* Convert handle to a full pathname and print it (with supplied message) */
  146.  
  147.         acpi_ns_print_node_pathname(handle, msg);
  148.         acpi_os_printf("\n");
  149.         return_VOID;
  150. }
  151.  
  152. /*******************************************************************************
  153.  *
  154.  * FUNCTION:    acpi_ns_dump_one_object
  155.  *
  156.  * PARAMETERS:  obj_handle          - Node to be dumped
  157.  *              level               - Nesting level of the handle
  158.  *              context             - Passed into walk_namespace
  159.  *              return_value        - Not used
  160.  *
  161.  * RETURN:      Status
  162.  *
  163.  * DESCRIPTION: Dump a single Node
  164.  *              This procedure is a user_function called by acpi_ns_walk_namespace.
  165.  *
  166.  ******************************************************************************/
  167.  
  168. acpi_status
  169. acpi_ns_dump_one_object(acpi_handle obj_handle,
  170.                         u32 level, void *context, void **return_value)
  171. {
  172.         struct acpi_walk_info *info = (struct acpi_walk_info *)context;
  173.         struct acpi_namespace_node *this_node;
  174.         union acpi_operand_object *obj_desc = NULL;
  175.         acpi_object_type obj_type;
  176.         acpi_object_type type;
  177.         u32 bytes_to_dump;
  178.         u32 dbg_level;
  179.         u32 i;
  180.  
  181.         ACPI_FUNCTION_NAME(ns_dump_one_object);
  182.  
  183.         /* Is output enabled? */
  184.  
  185.         if (!(acpi_dbg_level & info->debug_level)) {
  186.                 return (AE_OK);
  187.         }
  188.  
  189.         if (!obj_handle) {
  190.                 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Null object handle\n"));
  191.                 return (AE_OK);
  192.         }
  193.  
  194.         this_node = acpi_ns_validate_handle(obj_handle);
  195.         if (!this_node) {
  196.                 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Invalid object handle %p\n",
  197.                                   obj_handle));
  198.                 return (AE_OK);
  199.         }
  200.  
  201.         type = this_node->type;
  202.  
  203.         /* Check if the owner matches */
  204.  
  205.         if ((info->owner_id != ACPI_OWNER_ID_MAX) &&
  206.             (info->owner_id != this_node->owner_id)) {
  207.                 return (AE_OK);
  208.         }
  209.  
  210.         if (!(info->display_type & ACPI_DISPLAY_SHORT)) {
  211.  
  212.                 /* Indent the object according to the level */
  213.  
  214.                 acpi_os_printf("%2d%*s", (u32) level - 1, (int)level * 2, " ");
  215.  
  216.                 /* Check the node type and name */
  217.  
  218.                 if (type > ACPI_TYPE_LOCAL_MAX) {
  219.                         ACPI_WARNING((AE_INFO,
  220.                                       "Invalid ACPI Object Type 0x%08X", type));
  221.                 }
  222.  
  223.                 acpi_os_printf("%4.4s", acpi_ut_get_node_name(this_node));
  224.         }
  225.  
  226.         /* Now we can print out the pertinent information */
  227.  
  228.         acpi_os_printf(" %-12s %p %2.2X ",
  229.                        acpi_ut_get_type_name(type), this_node,
  230.                        this_node->owner_id);
  231.  
  232.         dbg_level = acpi_dbg_level;
  233.         acpi_dbg_level = 0;
  234.         obj_desc = acpi_ns_get_attached_object(this_node);
  235.         acpi_dbg_level = dbg_level;
  236.  
  237.         /* Temp nodes are those nodes created by a control method */
  238.  
  239.         if (this_node->flags & ANOBJ_TEMPORARY) {
  240.                 acpi_os_printf("(T) ");
  241.         }
  242.  
  243.         switch (info->display_type & ACPI_DISPLAY_MASK) {
  244.         case ACPI_DISPLAY_SUMMARY:
  245.  
  246.                 if (!obj_desc) {
  247.  
  248.                         /* No attached object. Some types should always have an object */
  249.  
  250.                         switch (type) {
  251.                         case ACPI_TYPE_INTEGER:
  252.                         case ACPI_TYPE_PACKAGE:
  253.                         case ACPI_TYPE_BUFFER:
  254.                         case ACPI_TYPE_STRING:
  255.                         case ACPI_TYPE_METHOD:
  256.  
  257.                                 acpi_os_printf("<No attached object>");
  258.                                 break;
  259.  
  260.                         default:
  261.  
  262.                                 break;
  263.                         }
  264.  
  265.                         acpi_os_printf("\n");
  266.                         return (AE_OK);
  267.                 }
  268.  
  269.                 switch (type) {
  270.                 case ACPI_TYPE_PROCESSOR:
  271.  
  272.                         acpi_os_printf("ID %02X Len %02X Addr %8.8X%8.8X\n",
  273.                                        obj_desc->processor.proc_id,
  274.                                        obj_desc->processor.length,
  275.                                        ACPI_FORMAT_UINT64(obj_desc->processor.
  276.                                                           address));
  277.                         break;
  278.  
  279.                 case ACPI_TYPE_DEVICE:
  280.  
  281.                         acpi_os_printf("Notify Object: %p\n", obj_desc);
  282.                         break;
  283.  
  284.                 case ACPI_TYPE_METHOD:
  285.  
  286.                         acpi_os_printf("Args %X Len %.4X Aml %p\n",
  287.                                        (u32) obj_desc->method.param_count,
  288.                                        obj_desc->method.aml_length,
  289.                                        obj_desc->method.aml_start);
  290.                         break;
  291.  
  292.                 case ACPI_TYPE_INTEGER:
  293.  
  294.                         acpi_os_printf("= %8.8X%8.8X\n",
  295.                                        ACPI_FORMAT_UINT64(obj_desc->integer.
  296.                                                           value));
  297.                         break;
  298.  
  299.                 case ACPI_TYPE_PACKAGE:
  300.  
  301.                         if (obj_desc->common.flags & AOPOBJ_DATA_VALID) {
  302.                                 acpi_os_printf("Elements %.2X\n",
  303.                                                obj_desc->package.count);
  304.                         } else {
  305.                                 acpi_os_printf("[Length not yet evaluated]\n");
  306.                         }
  307.                         break;
  308.  
  309.                 case ACPI_TYPE_BUFFER:
  310.  
  311.                         if (obj_desc->common.flags & AOPOBJ_DATA_VALID) {
  312.                                 acpi_os_printf("Len %.2X",
  313.                                                obj_desc->buffer.length);
  314.  
  315.                                 /* Dump some of the buffer */
  316.  
  317.                                 if (obj_desc->buffer.length > 0) {
  318.                                         acpi_os_printf(" =");
  319.                                         for (i = 0;
  320.                                              (i < obj_desc->buffer.length
  321.                                               && i < 12); i++) {
  322.                                                 acpi_os_printf(" %.2hX",
  323.                                                                obj_desc->buffer.
  324.                                                                pointer[i]);
  325.                                         }
  326.                                 }
  327.                                 acpi_os_printf("\n");
  328.                         } else {
  329.                                 acpi_os_printf("[Length not yet evaluated]\n");
  330.                         }
  331.                         break;
  332.  
  333.                 case ACPI_TYPE_STRING:
  334.  
  335.                         acpi_os_printf("Len %.2X ", obj_desc->string.length);
  336.                         acpi_ut_print_string(obj_desc->string.pointer, 32);
  337.                         acpi_os_printf("\n");
  338.                         break;
  339.  
  340.                 case ACPI_TYPE_REGION:
  341.  
  342.                         acpi_os_printf("[%s]",
  343.                                        acpi_ut_get_region_name(obj_desc->region.
  344.                                                                space_id));
  345.                         if (obj_desc->region.flags & AOPOBJ_DATA_VALID) {
  346.                                 acpi_os_printf(" Addr %8.8X%8.8X Len %.4X\n",
  347.                                                ACPI_FORMAT_UINT64(obj_desc->
  348.                                                                   region.
  349.                                                                   address),
  350.                                                obj_desc->region.length);
  351.                         } else {
  352.                                 acpi_os_printf
  353.                                     (" [Address/Length not yet evaluated]\n");
  354.                         }
  355.                         break;
  356.  
  357.                 case ACPI_TYPE_LOCAL_REFERENCE:
  358.  
  359.                         acpi_os_printf("[%s]\n",
  360.                                        acpi_ut_get_reference_name(obj_desc));
  361.                         break;
  362.  
  363.                 case ACPI_TYPE_BUFFER_FIELD:
  364.  
  365.                         if (obj_desc->buffer_field.buffer_obj &&
  366.                             obj_desc->buffer_field.buffer_obj->buffer.node) {
  367.                                 acpi_os_printf("Buf [%4.4s]",
  368.                                                acpi_ut_get_node_name(obj_desc->
  369.                                                                      buffer_field.
  370.                                                                      buffer_obj->
  371.                                                                      buffer.
  372.                                                                      node));
  373.                         }
  374.                         break;
  375.  
  376.                 case ACPI_TYPE_LOCAL_REGION_FIELD:
  377.  
  378.                         acpi_os_printf("Rgn [%4.4s]",
  379.                                        acpi_ut_get_node_name(obj_desc->
  380.                                                              common_field.
  381.                                                              region_obj->region.
  382.                                                              node));
  383.                         break;
  384.  
  385.                 case ACPI_TYPE_LOCAL_BANK_FIELD:
  386.  
  387.                         acpi_os_printf("Rgn [%4.4s] Bnk [%4.4s]",
  388.                                        acpi_ut_get_node_name(obj_desc->
  389.                                                              common_field.
  390.                                                              region_obj->region.
  391.                                                              node),
  392.                                        acpi_ut_get_node_name(obj_desc->
  393.                                                              bank_field.
  394.                                                              bank_obj->
  395.                                                              common_field.
  396.                                                              node));
  397.                         break;
  398.  
  399.                 case ACPI_TYPE_LOCAL_INDEX_FIELD:
  400.  
  401.                         acpi_os_printf("Idx [%4.4s] Dat [%4.4s]",
  402.                                        acpi_ut_get_node_name(obj_desc->
  403.                                                              index_field.
  404.                                                              index_obj->
  405.                                                              common_field.node),
  406.                                        acpi_ut_get_node_name(obj_desc->
  407.                                                              index_field.
  408.                                                              data_obj->
  409.                                                              common_field.
  410.                                                              node));
  411.                         break;
  412.  
  413.                 case ACPI_TYPE_LOCAL_ALIAS:
  414.                 case ACPI_TYPE_LOCAL_METHOD_ALIAS:
  415.  
  416.                         acpi_os_printf("Target %4.4s (%p)\n",
  417.                                        acpi_ut_get_node_name(obj_desc),
  418.                                        obj_desc);
  419.                         break;
  420.  
  421.                 default:
  422.  
  423.                         acpi_os_printf("Object %p\n", obj_desc);
  424.                         break;
  425.                 }
  426.  
  427.                 /* Common field handling */
  428.  
  429.                 switch (type) {
  430.                 case ACPI_TYPE_BUFFER_FIELD:
  431.                 case ACPI_TYPE_LOCAL_REGION_FIELD:
  432.                 case ACPI_TYPE_LOCAL_BANK_FIELD:
  433.                 case ACPI_TYPE_LOCAL_INDEX_FIELD:
  434.  
  435.                         acpi_os_printf(" Off %.3X Len %.2X Acc %.2hd\n",
  436.                                        (obj_desc->common_field.
  437.                                         base_byte_offset * 8)
  438.                                        +
  439.                                        obj_desc->common_field.
  440.                                        start_field_bit_offset,
  441.                                        obj_desc->common_field.bit_length,
  442.                                        obj_desc->common_field.
  443.                                        access_byte_width);
  444.                         break;
  445.  
  446.                 default:
  447.  
  448.                         break;
  449.                 }
  450.                 break;
  451.  
  452.         case ACPI_DISPLAY_OBJECTS:
  453.  
  454.                 acpi_os_printf("O:%p", obj_desc);
  455.                 if (!obj_desc) {
  456.  
  457.                         /* No attached object, we are done */
  458.  
  459.                         acpi_os_printf("\n");
  460.                         return (AE_OK);
  461.                 }
  462.  
  463.                 acpi_os_printf("(R%u)", obj_desc->common.reference_count);
  464.  
  465.                 switch (type) {
  466.                 case ACPI_TYPE_METHOD:
  467.  
  468.                         /* Name is a Method and its AML offset/length are set */
  469.  
  470.                         acpi_os_printf(" M:%p-%X\n", obj_desc->method.aml_start,
  471.                                        obj_desc->method.aml_length);
  472.                         break;
  473.  
  474.                 case ACPI_TYPE_INTEGER:
  475.  
  476.                         acpi_os_printf(" I:%8.8X8.8%X\n",
  477.                                        ACPI_FORMAT_UINT64(obj_desc->integer.
  478.                                                           value));
  479.                         break;
  480.  
  481.                 case ACPI_TYPE_STRING:
  482.  
  483.                         acpi_os_printf(" S:%p-%X\n", obj_desc->string.pointer,
  484.                                        obj_desc->string.length);
  485.                         break;
  486.  
  487.                 case ACPI_TYPE_BUFFER:
  488.  
  489.                         acpi_os_printf(" B:%p-%X\n", obj_desc->buffer.pointer,
  490.                                        obj_desc->buffer.length);
  491.                         break;
  492.  
  493.                 default:
  494.  
  495.                         acpi_os_printf("\n");
  496.                         break;
  497.                 }
  498.                 break;
  499.  
  500.         default:
  501.                 acpi_os_printf("\n");
  502.                 break;
  503.         }
  504.  
  505.         /* If debug turned off, done */
  506.  
  507.         if (!(acpi_dbg_level & ACPI_LV_VALUES)) {
  508.                 return (AE_OK);
  509.         }
  510.  
  511.         /* If there is an attached object, display it */
  512.  
  513.         dbg_level = acpi_dbg_level;
  514.         acpi_dbg_level = 0;
  515.         obj_desc = acpi_ns_get_attached_object(this_node);
  516.         acpi_dbg_level = dbg_level;
  517.  
  518.         /* Dump attached objects */
  519.  
  520.         while (obj_desc) {
  521.                 obj_type = ACPI_TYPE_INVALID;
  522.                 acpi_os_printf("Attached Object %p: ", obj_desc);
  523.  
  524.                 /* Decode the type of attached object and dump the contents */
  525.  
  526.                 switch (ACPI_GET_DESCRIPTOR_TYPE(obj_desc)) {
  527.                 case ACPI_DESC_TYPE_NAMED:
  528.  
  529.                         acpi_os_printf("(Ptr to Node)\n");
  530.                         bytes_to_dump = sizeof(struct acpi_namespace_node);
  531.                         ACPI_DUMP_BUFFER(obj_desc, bytes_to_dump);
  532.                         break;
  533.  
  534.                 case ACPI_DESC_TYPE_OPERAND:
  535.  
  536.                         obj_type = obj_desc->common.type;
  537.  
  538.                         if (obj_type > ACPI_TYPE_LOCAL_MAX) {
  539.                                 acpi_os_printf
  540.                                     ("(Pointer to ACPI Object type %.2X [UNKNOWN])\n",
  541.                                      obj_type);
  542.                                 bytes_to_dump = 32;
  543.                         } else {
  544.                                 acpi_os_printf
  545.                                     ("(Pointer to ACPI Object type %.2X [%s])\n",
  546.                                      obj_type, acpi_ut_get_type_name(obj_type));
  547.                                 bytes_to_dump =
  548.                                     sizeof(union acpi_operand_object);
  549.                         }
  550.  
  551.                         ACPI_DUMP_BUFFER(obj_desc, bytes_to_dump);
  552.                         break;
  553.  
  554.                 default:
  555.  
  556.                         break;
  557.                 }
  558.  
  559.                 /* If value is NOT an internal object, we are done */
  560.  
  561.                 if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) !=
  562.                     ACPI_DESC_TYPE_OPERAND) {
  563.                         goto cleanup;
  564.                 }
  565.  
  566.                 /* Valid object, get the pointer to next level, if any */
  567.  
  568.                 switch (obj_type) {
  569.                 case ACPI_TYPE_BUFFER:
  570.                 case ACPI_TYPE_STRING:
  571.                         /*
  572.                          * NOTE: takes advantage of common fields between string/buffer
  573.                          */
  574.                         bytes_to_dump = obj_desc->string.length;
  575.                         obj_desc = (void *)obj_desc->string.pointer;
  576.                         acpi_os_printf("(Buffer/String pointer %p length %X)\n",
  577.                                        obj_desc, bytes_to_dump);
  578.                         ACPI_DUMP_BUFFER(obj_desc, bytes_to_dump);
  579.                         goto cleanup;
  580.  
  581.                 case ACPI_TYPE_BUFFER_FIELD:
  582.  
  583.                         obj_desc =
  584.                             (union acpi_operand_object *)obj_desc->buffer_field.
  585.                             buffer_obj;
  586.                         break;
  587.  
  588.                 case ACPI_TYPE_PACKAGE:
  589.  
  590.                         obj_desc = (void *)obj_desc->package.elements;
  591.                         break;
  592.  
  593.                 case ACPI_TYPE_METHOD:
  594.  
  595.                         obj_desc = (void *)obj_desc->method.aml_start;
  596.                         break;
  597.  
  598.                 case ACPI_TYPE_LOCAL_REGION_FIELD:
  599.  
  600.                         obj_desc = (void *)obj_desc->field.region_obj;
  601.                         break;
  602.  
  603.                 case ACPI_TYPE_LOCAL_BANK_FIELD:
  604.  
  605.                         obj_desc = (void *)obj_desc->bank_field.region_obj;
  606.                         break;
  607.  
  608.                 case ACPI_TYPE_LOCAL_INDEX_FIELD:
  609.  
  610.                         obj_desc = (void *)obj_desc->index_field.index_obj;
  611.                         break;
  612.  
  613.                 default:
  614.  
  615.                         goto cleanup;
  616.                 }
  617.  
  618.                 obj_type = ACPI_TYPE_INVALID;   /* Terminate loop after next pass */
  619.         }
  620.  
  621. cleanup:
  622.         acpi_os_printf("\n");
  623.         return (AE_OK);
  624. }
  625.  
  626. /*******************************************************************************
  627.  *
  628.  * FUNCTION:    acpi_ns_dump_objects
  629.  *
  630.  * PARAMETERS:  type                - Object type to be dumped
  631.  *              display_type        - 0 or ACPI_DISPLAY_SUMMARY
  632.  *              max_depth           - Maximum depth of dump. Use ACPI_UINT32_MAX
  633.  *                                    for an effectively unlimited depth.
  634.  *              owner_id            - Dump only objects owned by this ID. Use
  635.  *                                    ACPI_UINT32_MAX to match all owners.
  636.  *              start_handle        - Where in namespace to start/end search
  637.  *
  638.  * RETURN:      None
  639.  *
  640.  * DESCRIPTION: Dump typed objects within the loaded namespace. Uses
  641.  *              acpi_ns_walk_namespace in conjunction with acpi_ns_dump_one_object.
  642.  *
  643.  ******************************************************************************/
  644.  
  645. void
  646. acpi_ns_dump_objects(acpi_object_type type,
  647.                      u8 display_type,
  648.                      u32 max_depth,
  649.                      acpi_owner_id owner_id, acpi_handle start_handle)
  650. {
  651.         struct acpi_walk_info info;
  652.         acpi_status status;
  653.  
  654.         ACPI_FUNCTION_ENTRY();
  655.  
  656.         /*
  657.          * Just lock the entire namespace for the duration of the dump.
  658.          * We don't want any changes to the namespace during this time,
  659.          * especially the temporary nodes since we are going to display
  660.          * them also.
  661.          */
  662.         status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
  663.         if (ACPI_FAILURE(status)) {
  664.                 acpi_os_printf("Could not acquire namespace mutex\n");
  665.                 return;
  666.         }
  667.  
  668.         info.debug_level = ACPI_LV_TABLES;
  669.         info.owner_id = owner_id;
  670.         info.display_type = display_type;
  671.  
  672.         (void)acpi_ns_walk_namespace(type, start_handle, max_depth,
  673.                                      ACPI_NS_WALK_NO_UNLOCK |
  674.                                      ACPI_NS_WALK_TEMP_NODES,
  675.                                      acpi_ns_dump_one_object, NULL,
  676.                                      (void *)&info, NULL);
  677.  
  678.         (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
  679. }
  680.  
  681. /*******************************************************************************
  682.  *
  683.  * FUNCTION:    acpi_ns_dump_one_object_path, acpi_ns_get_max_depth
  684.  *
  685.  * PARAMETERS:  obj_handle          - Node to be dumped
  686.  *              level               - Nesting level of the handle
  687.  *              context             - Passed into walk_namespace
  688.  *              return_value        - Not used
  689.  *
  690.  * RETURN:      Status
  691.  *
  692.  * DESCRIPTION: Dump the full pathname to a namespace object. acp_ns_get_max_depth
  693.  *              computes the maximum nesting depth in the namespace tree, in
  694.  *              order to simplify formatting in acpi_ns_dump_one_object_path.
  695.  *              These procedures are user_functions called by acpi_ns_walk_namespace.
  696.  *
  697.  ******************************************************************************/
  698.  
  699. static acpi_status
  700. acpi_ns_dump_one_object_path(acpi_handle obj_handle,
  701.                              u32 level, void *context, void **return_value)
  702. {
  703.         u32 max_level = *((u32 *)context);
  704.         char *pathname;
  705.         struct acpi_namespace_node *node;
  706.         int path_indent;
  707.  
  708.         if (!obj_handle) {
  709.                 return (AE_OK);
  710.         }
  711.  
  712.         node = acpi_ns_validate_handle(obj_handle);
  713.         if (!node) {
  714.  
  715.                 /* Ignore bad node during namespace walk */
  716.  
  717.                 return (AE_OK);
  718.         }
  719.  
  720.         pathname = acpi_ns_get_external_pathname(node);
  721.  
  722.         path_indent = 1;
  723.         if (level <= max_level) {
  724.                 path_indent = max_level - level + 1;
  725.         }
  726.  
  727.         acpi_os_printf("%2d%*s%-12s%*s",
  728.                        level, level, " ", acpi_ut_get_type_name(node->type),
  729.                        path_indent, " ");
  730.  
  731.         acpi_os_printf("%s\n", &pathname[1]);
  732.         ACPI_FREE(pathname);
  733.         return (AE_OK);
  734. }
  735.  
  736. static acpi_status
  737. acpi_ns_get_max_depth(acpi_handle obj_handle,
  738.                       u32 level, void *context, void **return_value)
  739. {
  740.         u32 *max_level = (u32 *)context;
  741.  
  742.         if (level > *max_level) {
  743.                 *max_level = level;
  744.         }
  745.         return (AE_OK);
  746. }
  747.  
  748. /*******************************************************************************
  749.  *
  750.  * FUNCTION:    acpi_ns_dump_object_paths
  751.  *
  752.  * PARAMETERS:  type                - Object type to be dumped
  753.  *              display_type        - 0 or ACPI_DISPLAY_SUMMARY
  754.  *              max_depth           - Maximum depth of dump. Use ACPI_UINT32_MAX
  755.  *                                    for an effectively unlimited depth.
  756.  *              owner_id            - Dump only objects owned by this ID. Use
  757.  *                                    ACPI_UINT32_MAX to match all owners.
  758.  *              start_handle        - Where in namespace to start/end search
  759.  *
  760.  * RETURN:      None
  761.  *
  762.  * DESCRIPTION: Dump full object pathnames within the loaded namespace. Uses
  763.  *              acpi_ns_walk_namespace in conjunction with acpi_ns_dump_one_object_path.
  764.  *
  765.  ******************************************************************************/
  766.  
  767. void
  768. acpi_ns_dump_object_paths(acpi_object_type type,
  769.                           u8 display_type,
  770.                           u32 max_depth,
  771.                           acpi_owner_id owner_id, acpi_handle start_handle)
  772. {
  773.         acpi_status status;
  774.         u32 max_level = 0;
  775.  
  776.         ACPI_FUNCTION_ENTRY();
  777.  
  778.         /*
  779.          * Just lock the entire namespace for the duration of the dump.
  780.          * We don't want any changes to the namespace during this time,
  781.          * especially the temporary nodes since we are going to display
  782.          * them also.
  783.          */
  784.         status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
  785.         if (ACPI_FAILURE(status)) {
  786.                 acpi_os_printf("Could not acquire namespace mutex\n");
  787.                 return;
  788.         }
  789.  
  790.         /* Get the max depth of the namespace tree, for formatting later */
  791.  
  792.         (void)acpi_ns_walk_namespace(type, start_handle, max_depth,
  793.                                      ACPI_NS_WALK_NO_UNLOCK |
  794.                                      ACPI_NS_WALK_TEMP_NODES,
  795.                                      acpi_ns_get_max_depth, NULL,
  796.                                      (void *)&max_level, NULL);
  797.  
  798.         /* Now dump the entire namespace */
  799.  
  800.         (void)acpi_ns_walk_namespace(type, start_handle, max_depth,
  801.                                      ACPI_NS_WALK_NO_UNLOCK |
  802.                                      ACPI_NS_WALK_TEMP_NODES,
  803.                                      acpi_ns_dump_one_object_path, NULL,
  804.                                      (void *)&max_level, NULL);
  805.  
  806.         (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
  807. }
  808.  
  809. /*******************************************************************************
  810.  *
  811.  * FUNCTION:    acpi_ns_dump_entry
  812.  *
  813.  * PARAMETERS:  handle              - Node to be dumped
  814.  *              debug_level         - Output level
  815.  *
  816.  * RETURN:      None
  817.  *
  818.  * DESCRIPTION: Dump a single Node
  819.  *
  820.  ******************************************************************************/
  821.  
  822. void acpi_ns_dump_entry(acpi_handle handle, u32 debug_level)
  823. {
  824.         struct acpi_walk_info info;
  825.  
  826.         ACPI_FUNCTION_ENTRY();
  827.  
  828.         info.debug_level = debug_level;
  829.         info.owner_id = ACPI_OWNER_ID_MAX;
  830.         info.display_type = ACPI_DISPLAY_SUMMARY;
  831.  
  832.         (void)acpi_ns_dump_one_object(handle, 1, &info, NULL);
  833. }
  834.  
  835. #ifdef ACPI_ASL_COMPILER
  836. /*******************************************************************************
  837.  *
  838.  * FUNCTION:    acpi_ns_dump_tables
  839.  *
  840.  * PARAMETERS:  search_base         - Root of subtree to be dumped, or
  841.  *                                    NS_ALL to dump the entire namespace
  842.  *              max_depth           - Maximum depth of dump. Use INT_MAX
  843.  *                                    for an effectively unlimited depth.
  844.  *
  845.  * RETURN:      None
  846.  *
  847.  * DESCRIPTION: Dump the name space, or a portion of it.
  848.  *
  849.  ******************************************************************************/
  850.  
  851. void acpi_ns_dump_tables(acpi_handle search_base, u32 max_depth)
  852. {
  853.         acpi_handle search_handle = search_base;
  854.  
  855.         ACPI_FUNCTION_TRACE(ns_dump_tables);
  856.  
  857.         if (!acpi_gbl_root_node) {
  858.                 /*
  859.                  * If the name space has not been initialized,
  860.                  * there is nothing to dump.
  861.                  */
  862.                 ACPI_DEBUG_PRINT((ACPI_DB_TABLES,
  863.                                   "namespace not initialized!\n"));
  864.                 return_VOID;
  865.         }
  866.  
  867.         if (ACPI_NS_ALL == search_base) {
  868.  
  869.                 /* Entire namespace */
  870.  
  871.                 search_handle = acpi_gbl_root_node;
  872.                 ACPI_DEBUG_PRINT((ACPI_DB_TABLES, "\\\n"));
  873.         }
  874.  
  875.         acpi_ns_dump_objects(ACPI_TYPE_ANY, ACPI_DISPLAY_OBJECTS, max_depth,
  876.                              ACPI_OWNER_ID_MAX, search_handle);
  877.         return_VOID;
  878. }
  879. #endif
  880. #endif
  881.