Home | History | Annotate | Line # | Download | only in debugger
dbstats.c revision 1.1.1.1
      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