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