Subversion Repositories Kolibri OS

Rev

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

  1. /*******************************************************************************
  2.  *
  3.  * Module Name: dbstats - Generation and display of ACPI table statistics
  4.  *
  5.  ******************************************************************************/
  6.  
  7. /******************************************************************************
  8.  *
  9.  * 1. Copyright Notice
  10.  *
  11.  * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp.
  12.  * All rights reserved.
  13.  *
  14.  * 2. License
  15.  *
  16.  * 2.1. This is your license from Intel Corp. under its intellectual property
  17.  * rights.  You may have additional license terms from the party that provided
  18.  * you this software, covering your right to use that party's intellectual
  19.  * property rights.
  20.  *
  21.  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
  22.  * copy of the source code appearing in this file ("Covered Code") an
  23.  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
  24.  * base code distributed originally by Intel ("Original Intel Code") to copy,
  25.  * make derivatives, distribute, use and display any portion of the Covered
  26.  * Code in any form, with the right to sublicense such rights; and
  27.  *
  28.  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
  29.  * license (with the right to sublicense), under only those claims of Intel
  30.  * patents that are infringed by the Original Intel Code, to make, use, sell,
  31.  * offer to sell, and import the Covered Code and derivative works thereof
  32.  * solely to the minimum extent necessary to exercise the above copyright
  33.  * license, and in no event shall the patent license extend to any additions
  34.  * to or modifications of the Original Intel Code.  No other license or right
  35.  * is granted directly or by implication, estoppel or otherwise;
  36.  *
  37.  * The above copyright and patent license is granted only if the following
  38.  * conditions are met:
  39.  *
  40.  * 3. Conditions
  41.  *
  42.  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
  43.  * Redistribution of source code of any substantial portion of the Covered
  44.  * Code or modification with rights to further distribute source must include
  45.  * the above Copyright Notice, the above License, this list of Conditions,
  46.  * and the following Disclaimer and Export Compliance provision.  In addition,
  47.  * Licensee must cause all Covered Code to which Licensee contributes to
  48.  * contain a file documenting the changes Licensee made to create that Covered
  49.  * Code and the date of any change.  Licensee must include in that file the
  50.  * documentation of any changes made by any predecessor Licensee.  Licensee
  51.  * must include a prominent statement that the modification is derived,
  52.  * directly or indirectly, from Original Intel Code.
  53.  *
  54.  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
  55.  * Redistribution of source code of any substantial portion of the Covered
  56.  * Code or modification without rights to further distribute source must
  57.  * include the following Disclaimer and Export Compliance provision in the
  58.  * documentation and/or other materials provided with distribution.  In
  59.  * addition, Licensee may not authorize further sublicense of source of any
  60.  * portion of the Covered Code, and must include terms to the effect that the
  61.  * license from Licensee to its licensee is limited to the intellectual
  62.  * property embodied in the software Licensee provides to its licensee, and
  63.  * not to intellectual property embodied in modifications its licensee may
  64.  * make.
  65.  *
  66.  * 3.3. Redistribution of Executable. Redistribution in executable form of any
  67.  * substantial portion of the Covered Code or modification must reproduce the
  68.  * above Copyright Notice, and the following Disclaimer and Export Compliance
  69.  * provision in the documentation and/or other materials provided with the
  70.  * distribution.
  71.  *
  72.  * 3.4. Intel retains all right, title, and interest in and to the Original
  73.  * Intel Code.
  74.  *
  75.  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
  76.  * Intel shall be used in advertising or otherwise to promote the sale, use or
  77.  * other dealings in products derived from or relating to the Covered Code
  78.  * without prior written authorization from Intel.
  79.  *
  80.  * 4. Disclaimer and Export Compliance
  81.  *
  82.  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
  83.  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
  84.  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
  85.  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
  86.  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
  87.  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
  88.  * PARTICULAR PURPOSE.
  89.  *
  90.  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
  91.  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
  92.  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
  93.  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
  94.  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
  95.  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
  96.  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
  97.  * LIMITED REMEDY.
  98.  *
  99.  * 4.3. Licensee shall not export, either directly or indirectly, any of this
  100.  * software or system incorporating such software without first obtaining any
  101.  * required license or other approval from the U. S. Department of Commerce or
  102.  * any other agency or department of the United States Government.  In the
  103.  * event Licensee exports any such software from the United States or
  104.  * re-exports any such software from a foreign destination, Licensee shall
  105.  * ensure that the distribution and export/re-export of the software is in
  106.  * compliance with all laws, regulations, orders, or other restrictions of the
  107.  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
  108.  * any of its subsidiaries will export/re-export any technical data, process,
  109.  * software, or service, directly or indirectly, to any country for which the
  110.  * United States government or any agency thereof requires an export license,
  111.  * other governmental approval, or letter of assurance, without first obtaining
  112.  * such license, approval or letter.
  113.  *
  114.  *****************************************************************************/
  115.  
  116.  
  117. #include "acpi.h"
  118. #include "accommon.h"
  119. #include "acdebug.h"
  120. #include "acnamesp.h"
  121.  
  122. #ifdef ACPI_DEBUGGER
  123.  
  124. #define _COMPONENT          ACPI_CA_DEBUGGER
  125.         ACPI_MODULE_NAME    ("dbstats")
  126.  
  127. /* Local prototypes */
  128.  
  129. static void
  130. AcpiDbCountNamespaceObjects (
  131.     void);
  132.  
  133. static void
  134. AcpiDbEnumerateObject (
  135.     ACPI_OPERAND_OBJECT     *ObjDesc);
  136.  
  137. static ACPI_STATUS
  138. AcpiDbClassifyOneObject (
  139.     ACPI_HANDLE             ObjHandle,
  140.     UINT32                  NestingLevel,
  141.     void                    *Context,
  142.     void                    **ReturnValue);
  143.  
  144. #if defined ACPI_DBG_TRACK_ALLOCATIONS || defined ACPI_USE_LOCAL_CACHE
  145. static void
  146. AcpiDbListInfo (
  147.     ACPI_MEMORY_LIST        *List);
  148. #endif
  149.  
  150.  
  151. /*
  152.  * Statistics subcommands
  153.  */
  154. static ARGUMENT_INFO        AcpiDbStatTypes [] =
  155. {
  156.     {"ALLOCATIONS"},
  157.     {"OBJECTS"},
  158.     {"MEMORY"},
  159.     {"MISC"},
  160.     {"TABLES"},
  161.     {"SIZES"},
  162.     {"STACK"},
  163.     {NULL}           /* Must be null terminated */
  164. };
  165.  
  166. #define CMD_STAT_ALLOCATIONS     0
  167. #define CMD_STAT_OBJECTS         1
  168. #define CMD_STAT_MEMORY          2
  169. #define CMD_STAT_MISC            3
  170. #define CMD_STAT_TABLES          4
  171. #define CMD_STAT_SIZES           5
  172. #define CMD_STAT_STACK           6
  173.  
  174.  
  175. #if defined ACPI_DBG_TRACK_ALLOCATIONS || defined ACPI_USE_LOCAL_CACHE
  176. /*******************************************************************************
  177.  *
  178.  * FUNCTION:    AcpiDbListInfo
  179.  *
  180.  * PARAMETERS:  List            - Memory list/cache to be displayed
  181.  *
  182.  * RETURN:      None
  183.  *
  184.  * DESCRIPTION: Display information about the input memory list or cache.
  185.  *
  186.  ******************************************************************************/
  187.  
  188. static void
  189. AcpiDbListInfo (
  190.     ACPI_MEMORY_LIST        *List)
  191. {
  192. #ifdef ACPI_DBG_TRACK_ALLOCATIONS
  193.     UINT32                  Outstanding;
  194. #endif
  195.  
  196.     AcpiOsPrintf ("\n%s\n", List->ListName);
  197.  
  198.     /* MaxDepth > 0 indicates a cache object */
  199.  
  200.     if (List->MaxDepth > 0)
  201.     {
  202.         AcpiOsPrintf (
  203.             "    Cache: [Depth    MaxD Avail  Size]                %8.2X %8.2X %8.2X %8.2X\n",
  204.             List->CurrentDepth,
  205.             List->MaxDepth,
  206.             List->MaxDepth - List->CurrentDepth,
  207.             (List->CurrentDepth * List->ObjectSize));
  208.     }
  209.  
  210. #ifdef ACPI_DBG_TRACK_ALLOCATIONS
  211.     if (List->MaxDepth > 0)
  212.     {
  213.         AcpiOsPrintf (
  214.             "    Cache: [Requests Hits Misses ObjSize]             %8.2X %8.2X %8.2X %8.2X\n",
  215.             List->Requests,
  216.             List->Hits,
  217.             List->Requests - List->Hits,
  218.             List->ObjectSize);
  219.     }
  220.  
  221.     Outstanding = AcpiDbGetCacheInfo (List);
  222.  
  223.     if (List->ObjectSize)
  224.     {
  225.         AcpiOsPrintf (
  226.             "    Mem:   [Alloc    Free Max    CurSize Outstanding] %8.2X %8.2X %8.2X %8.2X %8.2X\n",
  227.             List->TotalAllocated,
  228.             List->TotalFreed,
  229.             List->MaxOccupied,
  230.             Outstanding * List->ObjectSize,
  231.             Outstanding);
  232.     }
  233.     else
  234.     {
  235.         AcpiOsPrintf (
  236.             "    Mem:   [Alloc Free Max CurSize Outstanding Total] %8.2X %8.2X %8.2X %8.2X %8.2X %8.2X\n",
  237.             List->TotalAllocated,
  238.             List->TotalFreed,
  239.             List->MaxOccupied,
  240.             List->CurrentTotalSize,
  241.             Outstanding,
  242.             List->TotalSize);
  243.     }
  244. #endif
  245. }
  246. #endif
  247.  
  248.  
  249. /*******************************************************************************
  250.  *
  251.  * FUNCTION:    AcpiDbEnumerateObject
  252.  *
  253.  * PARAMETERS:  ObjDesc             - Object to be counted
  254.  *
  255.  * RETURN:      None
  256.  *
  257.  * DESCRIPTION: Add this object to the global counts, by object type.
  258.  *              Limited recursion handles subobjects and packages, and this
  259.  *              is probably acceptable within the AML debugger only.
  260.  *
  261.  ******************************************************************************/
  262.  
  263. static void
  264. AcpiDbEnumerateObject (
  265.     ACPI_OPERAND_OBJECT     *ObjDesc)
  266. {
  267.     UINT32                  i;
  268.  
  269.  
  270.     if (!ObjDesc)
  271.     {
  272.         return;
  273.     }
  274.  
  275.     /* Enumerate this object first */
  276.  
  277.     AcpiGbl_NumObjects++;
  278.  
  279.     if (ObjDesc->Common.Type > ACPI_TYPE_NS_NODE_MAX)
  280.     {
  281.         AcpiGbl_ObjTypeCountMisc++;
  282.     }
  283.     else
  284.     {
  285.         AcpiGbl_ObjTypeCount [ObjDesc->Common.Type]++;
  286.     }
  287.  
  288.     /* Count the sub-objects */
  289.  
  290.     switch (ObjDesc->Common.Type)
  291.     {
  292.     case ACPI_TYPE_PACKAGE:
  293.  
  294.         for (i = 0; i < ObjDesc->Package.Count; i++)
  295.         {
  296.             AcpiDbEnumerateObject (ObjDesc->Package.Elements[i]);
  297.         }
  298.         break;
  299.  
  300.     case ACPI_TYPE_DEVICE:
  301.  
  302.         AcpiDbEnumerateObject (ObjDesc->Device.SystemNotify);
  303.         AcpiDbEnumerateObject (ObjDesc->Device.DeviceNotify);
  304.         AcpiDbEnumerateObject (ObjDesc->Device.Handler);
  305.         break;
  306.  
  307.     case ACPI_TYPE_BUFFER_FIELD:
  308.  
  309.         if (AcpiNsGetSecondaryObject (ObjDesc))
  310.         {
  311.             AcpiGbl_ObjTypeCount [ACPI_TYPE_BUFFER_FIELD]++;
  312.         }
  313.         break;
  314.  
  315.     case ACPI_TYPE_REGION:
  316.  
  317.         AcpiGbl_ObjTypeCount [ACPI_TYPE_LOCAL_REGION_FIELD ]++;
  318.         AcpiDbEnumerateObject (ObjDesc->Region.Handler);
  319.         break;
  320.  
  321.     case ACPI_TYPE_POWER:
  322.  
  323.         AcpiDbEnumerateObject (ObjDesc->PowerResource.SystemNotify);
  324.         AcpiDbEnumerateObject (ObjDesc->PowerResource.DeviceNotify);
  325.         break;
  326.  
  327.     case ACPI_TYPE_PROCESSOR:
  328.  
  329.         AcpiDbEnumerateObject (ObjDesc->Processor.SystemNotify);
  330.         AcpiDbEnumerateObject (ObjDesc->Processor.DeviceNotify);
  331.         AcpiDbEnumerateObject (ObjDesc->Processor.Handler);
  332.         break;
  333.  
  334.     case ACPI_TYPE_THERMAL:
  335.  
  336.         AcpiDbEnumerateObject (ObjDesc->ThermalZone.SystemNotify);
  337.         AcpiDbEnumerateObject (ObjDesc->ThermalZone.DeviceNotify);
  338.         AcpiDbEnumerateObject (ObjDesc->ThermalZone.Handler);
  339.         break;
  340.  
  341.     default:
  342.         break;
  343.     }
  344. }
  345.  
  346.  
  347. /*******************************************************************************
  348.  *
  349.  * FUNCTION:    AcpiDbClassifyOneObject
  350.  *
  351.  * PARAMETERS:  Callback for WalkNamespace
  352.  *
  353.  * RETURN:      Status
  354.  *
  355.  * DESCRIPTION: Enumerate both the object descriptor (including subobjects) and
  356.  *              the parent namespace node.
  357.  *
  358.  ******************************************************************************/
  359.  
  360. static ACPI_STATUS
  361. AcpiDbClassifyOneObject (
  362.     ACPI_HANDLE             ObjHandle,
  363.     UINT32                  NestingLevel,
  364.     void                    *Context,
  365.     void                    **ReturnValue)
  366. {
  367.     ACPI_NAMESPACE_NODE     *Node;
  368.     ACPI_OPERAND_OBJECT     *ObjDesc;
  369.     UINT32                  Type;
  370.  
  371.  
  372.     AcpiGbl_NumNodes++;
  373.  
  374.     Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
  375.     ObjDesc = AcpiNsGetAttachedObject (Node);
  376.  
  377.     AcpiDbEnumerateObject (ObjDesc);
  378.  
  379.     Type = Node->Type;
  380.     if (Type > ACPI_TYPE_NS_NODE_MAX)
  381.     {
  382.         AcpiGbl_NodeTypeCountMisc++;
  383.     }
  384.     else
  385.     {
  386.         AcpiGbl_NodeTypeCount [Type]++;
  387.     }
  388.  
  389.     return AE_OK;
  390.  
  391.  
  392. #ifdef ACPI_FUTURE_IMPLEMENTATION
  393.  
  394.     /* TBD: These need to be counted during the initial parsing phase */
  395.  
  396.     if (AcpiPsIsNamedOp (Op->Opcode))
  397.     {
  398.         NumNodes++;
  399.     }
  400.  
  401.     if (IsMethod)
  402.     {
  403.         NumMethodElements++;
  404.     }
  405.  
  406.     NumGrammarElements++;
  407.     Op = AcpiPsGetDepthNext (Root, Op);
  408.  
  409.     SizeOfParseTree   = (NumGrammarElements - NumMethodElements) *
  410.                             (UINT32) sizeof (ACPI_PARSE_OBJECT);
  411.     SizeOfMethodTrees = NumMethodElements * (UINT32) sizeof (ACPI_PARSE_OBJECT);
  412.     SizeOfNodeEntries = NumNodes * (UINT32) sizeof (ACPI_NAMESPACE_NODE);
  413.     SizeOfAcpiObjects = NumNodes * (UINT32) sizeof (ACPI_OPERAND_OBJECT);
  414. #endif
  415. }
  416.  
  417.  
  418. /*******************************************************************************
  419.  *
  420.  * FUNCTION:    AcpiDbCountNamespaceObjects
  421.  *
  422.  * PARAMETERS:  None
  423.  *
  424.  * RETURN:      None
  425.  *
  426.  * DESCRIPTION: Count and classify the entire namespace, including all
  427.  *              namespace nodes and attached objects.
  428.  *
  429.  ******************************************************************************/
  430.  
  431. static void
  432. AcpiDbCountNamespaceObjects (
  433.     void)
  434. {
  435.     UINT32                  i;
  436.  
  437.  
  438.     AcpiGbl_NumNodes = 0;
  439.     AcpiGbl_NumObjects = 0;
  440.  
  441.     AcpiGbl_ObjTypeCountMisc = 0;
  442.     for (i = 0; i < (ACPI_TYPE_NS_NODE_MAX -1); i++)
  443.     {
  444.         AcpiGbl_ObjTypeCount [i] = 0;
  445.         AcpiGbl_NodeTypeCount [i] = 0;
  446.     }
  447.  
  448.     (void) AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
  449.                 ACPI_UINT32_MAX, FALSE, AcpiDbClassifyOneObject, NULL, NULL, NULL);
  450. }
  451.  
  452.  
  453. /*******************************************************************************
  454.  *
  455.  * FUNCTION:    AcpiDbDisplayStatistics
  456.  *
  457.  * PARAMETERS:  TypeArg         - Subcommand
  458.  *
  459.  * RETURN:      Status
  460.  *
  461.  * DESCRIPTION: Display various statistics
  462.  *
  463.  ******************************************************************************/
  464.  
  465. ACPI_STATUS
  466. AcpiDbDisplayStatistics (
  467.     char                    *TypeArg)
  468. {
  469.     UINT32                  i;
  470.     UINT32                  Temp;
  471.  
  472.  
  473.     if (!TypeArg)
  474.     {
  475.         AcpiOsPrintf ("The following subcommands are available:\n    ALLOCATIONS, OBJECTS, MEMORY, MISC, SIZES, TABLES\n");
  476.         return (AE_OK);
  477.     }
  478.  
  479.     AcpiUtStrupr (TypeArg);
  480.     Temp = AcpiDbMatchArgument (TypeArg, AcpiDbStatTypes);
  481.     if (Temp == (UINT32) -1)
  482.     {
  483.         AcpiOsPrintf ("Invalid or unsupported argument\n");
  484.         return (AE_OK);
  485.     }
  486.  
  487.  
  488.     switch (Temp)
  489.     {
  490.     case CMD_STAT_ALLOCATIONS:
  491.  
  492. #ifdef ACPI_DBG_TRACK_ALLOCATIONS
  493.         AcpiUtDumpAllocationInfo ();
  494. #endif
  495.         break;
  496.  
  497.     case CMD_STAT_TABLES:
  498.  
  499.         AcpiOsPrintf ("ACPI Table Information (not implemented):\n\n");
  500.         break;
  501.  
  502.     case CMD_STAT_OBJECTS:
  503.  
  504.         AcpiDbCountNamespaceObjects ();
  505.  
  506.         AcpiOsPrintf ("\nObjects defined in the current namespace:\n\n");
  507.  
  508.         AcpiOsPrintf ("%16.16s %10.10s %10.10s\n",
  509.             "ACPI_TYPE", "NODES", "OBJECTS");
  510.  
  511.         for (i = 0; i < ACPI_TYPE_NS_NODE_MAX; i++)
  512.         {
  513.             AcpiOsPrintf ("%16.16s % 10ld% 10ld\n", AcpiUtGetTypeName (i),
  514.                 AcpiGbl_NodeTypeCount [i], AcpiGbl_ObjTypeCount [i]);
  515.         }
  516.         AcpiOsPrintf ("%16.16s % 10ld% 10ld\n", "Misc/Unknown",
  517.             AcpiGbl_NodeTypeCountMisc, AcpiGbl_ObjTypeCountMisc);
  518.  
  519.         AcpiOsPrintf ("%16.16s % 10ld% 10ld\n", "TOTALS:",
  520.             AcpiGbl_NumNodes, AcpiGbl_NumObjects);
  521.         break;
  522.  
  523.     case CMD_STAT_MEMORY:
  524.  
  525. #ifdef ACPI_DBG_TRACK_ALLOCATIONS
  526.         AcpiOsPrintf ("\n----Object Statistics (all in hex)---------\n");
  527.  
  528.         AcpiDbListInfo (AcpiGbl_GlobalList);
  529.         AcpiDbListInfo (AcpiGbl_NsNodeList);
  530. #endif
  531.  
  532. #ifdef ACPI_USE_LOCAL_CACHE
  533.         AcpiOsPrintf ("\n----Cache Statistics (all in hex)---------\n");
  534.         AcpiDbListInfo (AcpiGbl_OperandCache);
  535.         AcpiDbListInfo (AcpiGbl_PsNodeCache);
  536.         AcpiDbListInfo (AcpiGbl_PsNodeExtCache);
  537.         AcpiDbListInfo (AcpiGbl_StateCache);
  538. #endif
  539.  
  540.         break;
  541.  
  542.     case CMD_STAT_MISC:
  543.  
  544.         AcpiOsPrintf ("\nMiscellaneous Statistics:\n\n");
  545.         AcpiOsPrintf ("Calls to AcpiPsFind:..  ........% 7ld\n",
  546.             AcpiGbl_PsFindCount);
  547.         AcpiOsPrintf ("Calls to AcpiNsLookup:..........% 7ld\n",
  548.             AcpiGbl_NsLookupCount);
  549.  
  550.         AcpiOsPrintf ("\n");
  551.  
  552.         AcpiOsPrintf ("Mutex usage:\n\n");
  553.         for (i = 0; i < ACPI_NUM_MUTEX; i++)
  554.         {
  555.             AcpiOsPrintf ("%-28s:       % 7ld\n",
  556.                 AcpiUtGetMutexName (i), AcpiGbl_MutexInfo[i].UseCount);
  557.         }
  558.         break;
  559.  
  560.  
  561.     case CMD_STAT_SIZES:
  562.  
  563.         AcpiOsPrintf ("\nInternal object sizes:\n\n");
  564.  
  565.         AcpiOsPrintf ("Common           %3d\n", sizeof (ACPI_OBJECT_COMMON));
  566.         AcpiOsPrintf ("Number           %3d\n", sizeof (ACPI_OBJECT_INTEGER));
  567.         AcpiOsPrintf ("String           %3d\n", sizeof (ACPI_OBJECT_STRING));
  568.         AcpiOsPrintf ("Buffer           %3d\n", sizeof (ACPI_OBJECT_BUFFER));
  569.         AcpiOsPrintf ("Package          %3d\n", sizeof (ACPI_OBJECT_PACKAGE));
  570.         AcpiOsPrintf ("BufferField      %3d\n", sizeof (ACPI_OBJECT_BUFFER_FIELD));
  571.         AcpiOsPrintf ("Device           %3d\n", sizeof (ACPI_OBJECT_DEVICE));
  572.         AcpiOsPrintf ("Event            %3d\n", sizeof (ACPI_OBJECT_EVENT));
  573.         AcpiOsPrintf ("Method           %3d\n", sizeof (ACPI_OBJECT_METHOD));
  574.         AcpiOsPrintf ("Mutex            %3d\n", sizeof (ACPI_OBJECT_MUTEX));
  575.         AcpiOsPrintf ("Region           %3d\n", sizeof (ACPI_OBJECT_REGION));
  576.         AcpiOsPrintf ("PowerResource    %3d\n", sizeof (ACPI_OBJECT_POWER_RESOURCE));
  577.         AcpiOsPrintf ("Processor        %3d\n", sizeof (ACPI_OBJECT_PROCESSOR));
  578.         AcpiOsPrintf ("ThermalZone      %3d\n", sizeof (ACPI_OBJECT_THERMAL_ZONE));
  579.         AcpiOsPrintf ("RegionField      %3d\n", sizeof (ACPI_OBJECT_REGION_FIELD));
  580.         AcpiOsPrintf ("BankField        %3d\n", sizeof (ACPI_OBJECT_BANK_FIELD));
  581.         AcpiOsPrintf ("IndexField       %3d\n", sizeof (ACPI_OBJECT_INDEX_FIELD));
  582.         AcpiOsPrintf ("Reference        %3d\n", sizeof (ACPI_OBJECT_REFERENCE));
  583.         AcpiOsPrintf ("Notify           %3d\n", sizeof (ACPI_OBJECT_NOTIFY_HANDLER));
  584.         AcpiOsPrintf ("AddressSpace     %3d\n", sizeof (ACPI_OBJECT_ADDR_HANDLER));
  585.         AcpiOsPrintf ("Extra            %3d\n", sizeof (ACPI_OBJECT_EXTRA));
  586.         AcpiOsPrintf ("Data             %3d\n", sizeof (ACPI_OBJECT_DATA));
  587.  
  588.         AcpiOsPrintf ("\n");
  589.  
  590.         AcpiOsPrintf ("ParseObject      %3d\n", sizeof (ACPI_PARSE_OBJ_COMMON));
  591.         AcpiOsPrintf ("ParseObjectNamed %3d\n", sizeof (ACPI_PARSE_OBJ_NAMED));
  592.         AcpiOsPrintf ("ParseObjectAsl   %3d\n", sizeof (ACPI_PARSE_OBJ_ASL));
  593.         AcpiOsPrintf ("OperandObject    %3d\n", sizeof (ACPI_OPERAND_OBJECT));
  594.         AcpiOsPrintf ("NamespaceNode    %3d\n", sizeof (ACPI_NAMESPACE_NODE));
  595.         AcpiOsPrintf ("AcpiObject       %3d\n", sizeof (ACPI_OBJECT));
  596.  
  597.         break;
  598.  
  599.  
  600.     case CMD_STAT_STACK:
  601. #if defined(ACPI_DEBUG_OUTPUT)
  602.  
  603.         Temp = (UINT32) ACPI_PTR_DIFF (AcpiGbl_EntryStackPointer, AcpiGbl_LowestStackPointer);
  604.  
  605.         AcpiOsPrintf ("\nSubsystem Stack Usage:\n\n");
  606.         AcpiOsPrintf ("Entry Stack Pointer          %p\n", AcpiGbl_EntryStackPointer);
  607.         AcpiOsPrintf ("Lowest Stack Pointer         %p\n", AcpiGbl_LowestStackPointer);
  608.         AcpiOsPrintf ("Stack Use                    %X (%u)\n", Temp, Temp);
  609.         AcpiOsPrintf ("Deepest Procedure Nesting    %u\n", AcpiGbl_DeepestNesting);
  610. #endif
  611.         break;
  612.  
  613.     default:
  614.         break;
  615.     }
  616.  
  617.     AcpiOsPrintf ("\n");
  618.     return (AE_OK);
  619. }
  620.  
  621. #endif /* ACPI_DEBUGGER  */
  622.