1 /****************************************************************************** 2 * 3 * Module Name: nsdump - table dumping routines for debug 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2011, 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 #define __NSDUMP_C__ 45 46 #include "acpi.h" 47 #include "accommon.h" 48 #include "acnamesp.h" 49 50 51 #define _COMPONENT ACPI_NAMESPACE 52 ACPI_MODULE_NAME ("nsdump") 53 54 /* Local prototypes */ 55 56 #ifdef ACPI_OBSOLETE_FUNCTIONS 57 void 58 AcpiNsDumpRootDevices ( 59 void); 60 61 static ACPI_STATUS 62 AcpiNsDumpOneDevice ( 63 ACPI_HANDLE ObjHandle, 64 UINT32 Level, 65 void *Context, 66 void **ReturnValue); 67 #endif 68 69 70 #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER) 71 /******************************************************************************* 72 * 73 * FUNCTION: AcpiNsPrintPathname 74 * 75 * PARAMETERS: NumSegments - 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 85 AcpiNsPrintPathname ( 86 UINT32 NumSegments, 87 char *Pathname) 88 { 89 UINT32 i; 90 91 92 ACPI_FUNCTION_NAME (NsPrintPathname); 93 94 95 if (!(AcpiDbgLevel & ACPI_LV_NAMES) || !(AcpiDbgLayer & ACPI_NAMESPACE)) 96 { 97 return; 98 } 99 100 /* Print the entire name */ 101 102 ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "[")); 103 104 while (NumSegments) 105 { 106 for (i = 0; i < 4; i++) 107 { 108 ACPI_IS_PRINT (Pathname[i]) ? 109 AcpiOsPrintf ("%c", Pathname[i]) : 110 AcpiOsPrintf ("?"); 111 } 112 113 Pathname += ACPI_NAME_SIZE; 114 NumSegments--; 115 if (NumSegments) 116 { 117 AcpiOsPrintf ("."); 118 } 119 } 120 121 AcpiOsPrintf ("]\n"); 122 } 123 124 125 /******************************************************************************* 126 * 127 * FUNCTION: AcpiNsDumpPathname 128 * 129 * PARAMETERS: Handle - Object 130 * Msg - Prefix message 131 * Level - Desired debug level 132 * Component - Caller's component ID 133 * 134 * RETURN: None 135 * 136 * DESCRIPTION: Print an object's full namespace pathname 137 * Manages allocation/freeing of a pathname buffer 138 * 139 ******************************************************************************/ 140 141 void 142 AcpiNsDumpPathname ( 143 ACPI_HANDLE Handle, 144 char *Msg, 145 UINT32 Level, 146 UINT32 Component) 147 { 148 149 ACPI_FUNCTION_TRACE (NsDumpPathname); 150 151 152 /* Do this only if the requested debug level and component are enabled */ 153 154 if (!(AcpiDbgLevel & Level) || !(AcpiDbgLayer & Component)) 155 { 156 return_VOID; 157 } 158 159 /* Convert handle to a full pathname and print it (with supplied message) */ 160 161 AcpiNsPrintNodePathname (Handle, Msg); 162 AcpiOsPrintf ("\n"); 163 return_VOID; 164 } 165 166 167 /******************************************************************************* 168 * 169 * FUNCTION: AcpiNsDumpOneObject 170 * 171 * PARAMETERS: ObjHandle - Node to be dumped 172 * Level - Nesting level of the handle 173 * Context - Passed into WalkNamespace 174 * ReturnValue - Not used 175 * 176 * RETURN: Status 177 * 178 * DESCRIPTION: Dump a single Node 179 * This procedure is a UserFunction called by AcpiNsWalkNamespace. 180 * 181 ******************************************************************************/ 182 183 ACPI_STATUS 184 AcpiNsDumpOneObject ( 185 ACPI_HANDLE ObjHandle, 186 UINT32 Level, 187 void *Context, 188 void **ReturnValue) 189 { 190 ACPI_WALK_INFO *Info = (ACPI_WALK_INFO *) Context; 191 ACPI_NAMESPACE_NODE *ThisNode; 192 ACPI_OPERAND_OBJECT *ObjDesc = NULL; 193 ACPI_OBJECT_TYPE ObjType; 194 ACPI_OBJECT_TYPE Type; 195 UINT32 BytesToDump; 196 UINT32 DbgLevel; 197 UINT32 i; 198 199 200 ACPI_FUNCTION_NAME (NsDumpOneObject); 201 202 203 /* Is output enabled? */ 204 205 if (!(AcpiDbgLevel & Info->DebugLevel)) 206 { 207 return (AE_OK); 208 } 209 210 if (!ObjHandle) 211 { 212 ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Null object handle\n")); 213 return (AE_OK); 214 } 215 216 ThisNode = AcpiNsValidateHandle (ObjHandle); 217 if (!ThisNode) 218 { 219 ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Invalid object handle %p\n", 220 ObjHandle)); 221 return (AE_OK); 222 } 223 224 Type = ThisNode->Type; 225 226 /* Check if the owner matches */ 227 228 if ((Info->OwnerId != ACPI_OWNER_ID_MAX) && 229 (Info->OwnerId != ThisNode->OwnerId)) 230 { 231 return (AE_OK); 232 } 233 234 if (!(Info->DisplayType & ACPI_DISPLAY_SHORT)) 235 { 236 /* Indent the object according to the level */ 237 238 AcpiOsPrintf ("%2d%*s", (UINT32) Level - 1, (int) Level * 2, " "); 239 240 /* Check the node type and name */ 241 242 if (Type > ACPI_TYPE_LOCAL_MAX) 243 { 244 ACPI_WARNING ((AE_INFO, "Invalid ACPI Object Type 0x%08X", Type)); 245 } 246 247 AcpiOsPrintf ("%4.4s", AcpiUtGetNodeName (ThisNode)); 248 } 249 250 /* Now we can print out the pertinent information */ 251 252 AcpiOsPrintf (" %-12s %p %2.2X ", 253 AcpiUtGetTypeName (Type), ThisNode, ThisNode->OwnerId); 254 255 DbgLevel = AcpiDbgLevel; 256 AcpiDbgLevel = 0; 257 ObjDesc = AcpiNsGetAttachedObject (ThisNode); 258 AcpiDbgLevel = DbgLevel; 259 260 /* Temp nodes are those nodes created by a control method */ 261 262 if (ThisNode->Flags & ANOBJ_TEMPORARY) 263 { 264 AcpiOsPrintf ("(T) "); 265 } 266 267 switch (Info->DisplayType & ACPI_DISPLAY_MASK) 268 { 269 case ACPI_DISPLAY_SUMMARY: 270 271 if (!ObjDesc) 272 { 273 /* No attached object, we are done */ 274 275 AcpiOsPrintf ("\n"); 276 return (AE_OK); 277 } 278 279 switch (Type) 280 { 281 case ACPI_TYPE_PROCESSOR: 282 283 AcpiOsPrintf ("ID %X Len %.4X Addr %p\n", 284 ObjDesc->Processor.ProcId, ObjDesc->Processor.Length, 285 ACPI_CAST_PTR (void, ObjDesc->Processor.Address)); 286 break; 287 288 289 case ACPI_TYPE_DEVICE: 290 291 AcpiOsPrintf ("Notify Object: %p\n", ObjDesc); 292 break; 293 294 295 case ACPI_TYPE_METHOD: 296 297 AcpiOsPrintf ("Args %X Len %.4X Aml %p\n", 298 (UINT32) ObjDesc->Method.ParamCount, 299 ObjDesc->Method.AmlLength, ObjDesc->Method.AmlStart); 300 break; 301 302 303 case ACPI_TYPE_INTEGER: 304 305 AcpiOsPrintf ("= %8.8X%8.8X\n", 306 ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value)); 307 break; 308 309 310 case ACPI_TYPE_PACKAGE: 311 312 if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID) 313 { 314 AcpiOsPrintf ("Elements %.2X\n", 315 ObjDesc->Package.Count); 316 } 317 else 318 { 319 AcpiOsPrintf ("[Length not yet evaluated]\n"); 320 } 321 break; 322 323 324 case ACPI_TYPE_BUFFER: 325 326 if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID) 327 { 328 AcpiOsPrintf ("Len %.2X", 329 ObjDesc->Buffer.Length); 330 331 /* Dump some of the buffer */ 332 333 if (ObjDesc->Buffer.Length > 0) 334 { 335 AcpiOsPrintf (" ="); 336 for (i = 0; (i < ObjDesc->Buffer.Length && i < 12); i++) 337 { 338 AcpiOsPrintf (" %.2hX", ObjDesc->Buffer.Pointer[i]); 339 } 340 } 341 AcpiOsPrintf ("\n"); 342 } 343 else 344 { 345 AcpiOsPrintf ("[Length not yet evaluated]\n"); 346 } 347 break; 348 349 350 case ACPI_TYPE_STRING: 351 352 AcpiOsPrintf ("Len %.2X ", ObjDesc->String.Length); 353 AcpiUtPrintString (ObjDesc->String.Pointer, 32); 354 AcpiOsPrintf ("\n"); 355 break; 356 357 358 case ACPI_TYPE_REGION: 359 360 AcpiOsPrintf ("[%s]", 361 AcpiUtGetRegionName (ObjDesc->Region.SpaceId)); 362 if (ObjDesc->Region.Flags & AOPOBJ_DATA_VALID) 363 { 364 AcpiOsPrintf (" Addr %8.8X%8.8X Len %.4X\n", 365 ACPI_FORMAT_NATIVE_UINT (ObjDesc->Region.Address), 366 ObjDesc->Region.Length); 367 } 368 else 369 { 370 AcpiOsPrintf (" [Address/Length not yet evaluated]\n"); 371 } 372 break; 373 374 375 case ACPI_TYPE_LOCAL_REFERENCE: 376 377 AcpiOsPrintf ("[%s]\n", AcpiUtGetReferenceName (ObjDesc)); 378 break; 379 380 381 case ACPI_TYPE_BUFFER_FIELD: 382 383 if (ObjDesc->BufferField.BufferObj && 384 ObjDesc->BufferField.BufferObj->Buffer.Node) 385 { 386 AcpiOsPrintf ("Buf [%4.4s]", 387 AcpiUtGetNodeName ( 388 ObjDesc->BufferField.BufferObj->Buffer.Node)); 389 } 390 break; 391 392 393 case ACPI_TYPE_LOCAL_REGION_FIELD: 394 395 AcpiOsPrintf ("Rgn [%4.4s]", 396 AcpiUtGetNodeName ( 397 ObjDesc->CommonField.RegionObj->Region.Node)); 398 break; 399 400 401 case ACPI_TYPE_LOCAL_BANK_FIELD: 402 403 AcpiOsPrintf ("Rgn [%4.4s] Bnk [%4.4s]", 404 AcpiUtGetNodeName ( 405 ObjDesc->CommonField.RegionObj->Region.Node), 406 AcpiUtGetNodeName ( 407 ObjDesc->BankField.BankObj->CommonField.Node)); 408 break; 409 410 411 case ACPI_TYPE_LOCAL_INDEX_FIELD: 412 413 AcpiOsPrintf ("Idx [%4.4s] Dat [%4.4s]", 414 AcpiUtGetNodeName ( 415 ObjDesc->IndexField.IndexObj->CommonField.Node), 416 AcpiUtGetNodeName ( 417 ObjDesc->IndexField.DataObj->CommonField.Node)); 418 break; 419 420 421 case ACPI_TYPE_LOCAL_ALIAS: 422 case ACPI_TYPE_LOCAL_METHOD_ALIAS: 423 424 AcpiOsPrintf ("Target %4.4s (%p)\n", 425 AcpiUtGetNodeName (ObjDesc), ObjDesc); 426 break; 427 428 default: 429 430 AcpiOsPrintf ("Object %p\n", ObjDesc); 431 break; 432 } 433 434 /* Common field handling */ 435 436 switch (Type) 437 { 438 case ACPI_TYPE_BUFFER_FIELD: 439 case ACPI_TYPE_LOCAL_REGION_FIELD: 440 case ACPI_TYPE_LOCAL_BANK_FIELD: 441 case ACPI_TYPE_LOCAL_INDEX_FIELD: 442 443 AcpiOsPrintf (" Off %.3X Len %.2X Acc %.2hd\n", 444 (ObjDesc->CommonField.BaseByteOffset * 8) 445 + ObjDesc->CommonField.StartFieldBitOffset, 446 ObjDesc->CommonField.BitLength, 447 ObjDesc->CommonField.AccessByteWidth); 448 break; 449 450 default: 451 break; 452 } 453 break; 454 455 456 case ACPI_DISPLAY_OBJECTS: 457 458 AcpiOsPrintf ("O:%p", ObjDesc); 459 if (!ObjDesc) 460 { 461 /* No attached object, we are done */ 462 463 AcpiOsPrintf ("\n"); 464 return (AE_OK); 465 } 466 467 AcpiOsPrintf ("(R%u)", ObjDesc->Common.ReferenceCount); 468 469 switch (Type) 470 { 471 case ACPI_TYPE_METHOD: 472 473 /* Name is a Method and its AML offset/length are set */ 474 475 AcpiOsPrintf (" M:%p-%X\n", ObjDesc->Method.AmlStart, 476 ObjDesc->Method.AmlLength); 477 break; 478 479 case ACPI_TYPE_INTEGER: 480 481 AcpiOsPrintf (" I:%8.8X8.8%X\n", 482 ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value)); 483 break; 484 485 case ACPI_TYPE_STRING: 486 487 AcpiOsPrintf (" S:%p-%X\n", ObjDesc->String.Pointer, 488 ObjDesc->String.Length); 489 break; 490 491 case ACPI_TYPE_BUFFER: 492 493 AcpiOsPrintf (" B:%p-%X\n", ObjDesc->Buffer.Pointer, 494 ObjDesc->Buffer.Length); 495 break; 496 497 default: 498 499 AcpiOsPrintf ("\n"); 500 break; 501 } 502 break; 503 504 505 default: 506 AcpiOsPrintf ("\n"); 507 break; 508 } 509 510 /* If debug turned off, done */ 511 512 if (!(AcpiDbgLevel & ACPI_LV_VALUES)) 513 { 514 return (AE_OK); 515 } 516 517 /* If there is an attached object, display it */ 518 519 DbgLevel = AcpiDbgLevel; 520 AcpiDbgLevel = 0; 521 ObjDesc = AcpiNsGetAttachedObject (ThisNode); 522 AcpiDbgLevel = DbgLevel; 523 524 /* Dump attached objects */ 525 526 while (ObjDesc) 527 { 528 ObjType = ACPI_TYPE_INVALID; 529 AcpiOsPrintf ("Attached Object %p: ", ObjDesc); 530 531 /* Decode the type of attached object and dump the contents */ 532 533 switch (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc)) 534 { 535 case ACPI_DESC_TYPE_NAMED: 536 537 AcpiOsPrintf ("(Ptr to Node)\n"); 538 BytesToDump = sizeof (ACPI_NAMESPACE_NODE); 539 ACPI_DUMP_BUFFER (ObjDesc, BytesToDump); 540 break; 541 542 case ACPI_DESC_TYPE_OPERAND: 543 544 ObjType = ObjDesc->Common.Type; 545 546 if (ObjType > ACPI_TYPE_LOCAL_MAX) 547 { 548 AcpiOsPrintf ("(Pointer to ACPI Object type %.2X [UNKNOWN])\n", 549 ObjType); 550 BytesToDump = 32; 551 } 552 else 553 { 554 AcpiOsPrintf ("(Pointer to ACPI Object type %.2X [%s])\n", 555 ObjType, AcpiUtGetTypeName (ObjType)); 556 BytesToDump = sizeof (ACPI_OPERAND_OBJECT); 557 } 558 559 ACPI_DUMP_BUFFER (ObjDesc, BytesToDump); 560 break; 561 562 default: 563 564 break; 565 } 566 567 /* If value is NOT an internal object, we are done */ 568 569 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND) 570 { 571 goto Cleanup; 572 } 573 574 /* Valid object, get the pointer to next level, if any */ 575 576 switch (ObjType) 577 { 578 case ACPI_TYPE_BUFFER: 579 case ACPI_TYPE_STRING: 580 /* 581 * NOTE: takes advantage of common fields between string/buffer 582 */ 583 BytesToDump = ObjDesc->String.Length; 584 ObjDesc = (void *) ObjDesc->String.Pointer; 585 AcpiOsPrintf ( "(Buffer/String pointer %p length %X)\n", 586 ObjDesc, BytesToDump); 587 ACPI_DUMP_BUFFER (ObjDesc, BytesToDump); 588 goto Cleanup; 589 590 case ACPI_TYPE_BUFFER_FIELD: 591 ObjDesc = (ACPI_OPERAND_OBJECT *) ObjDesc->BufferField.BufferObj; 592 break; 593 594 case ACPI_TYPE_PACKAGE: 595 ObjDesc = (void *) ObjDesc->Package.Elements; 596 break; 597 598 case ACPI_TYPE_METHOD: 599 ObjDesc = (void *) ObjDesc->Method.AmlStart; 600 break; 601 602 case ACPI_TYPE_LOCAL_REGION_FIELD: 603 ObjDesc = (void *) ObjDesc->Field.RegionObj; 604 break; 605 606 case ACPI_TYPE_LOCAL_BANK_FIELD: 607 ObjDesc = (void *) ObjDesc->BankField.RegionObj; 608 break; 609 610 case ACPI_TYPE_LOCAL_INDEX_FIELD: 611 ObjDesc = (void *) ObjDesc->IndexField.IndexObj; 612 break; 613 614 default: 615 goto Cleanup; 616 } 617 618 ObjType = ACPI_TYPE_INVALID; /* Terminate loop after next pass */ 619 } 620 621 Cleanup: 622 AcpiOsPrintf ("\n"); 623 return (AE_OK); 624 } 625 626 627 /******************************************************************************* 628 * 629 * FUNCTION: AcpiNsDumpObjects 630 * 631 * PARAMETERS: Type - Object type to be dumped 632 * DisplayType - 0 or ACPI_DISPLAY_SUMMARY 633 * MaxDepth - Maximum depth of dump. Use ACPI_UINT32_MAX 634 * for an effectively unlimited depth. 635 * OwnerId - Dump only objects owned by this ID. Use 636 * ACPI_UINT32_MAX to match all owners. 637 * StartHandle - Where in namespace to start/end search 638 * 639 * RETURN: None 640 * 641 * DESCRIPTION: Dump typed objects within the loaded namespace. Uses 642 * AcpiNsWalkNamespace in conjunction with AcpiNsDumpOneObject. 643 * 644 ******************************************************************************/ 645 646 void 647 AcpiNsDumpObjects ( 648 ACPI_OBJECT_TYPE Type, 649 UINT8 DisplayType, 650 UINT32 MaxDepth, 651 ACPI_OWNER_ID OwnerId, 652 ACPI_HANDLE StartHandle) 653 { 654 ACPI_WALK_INFO Info; 655 ACPI_STATUS Status; 656 657 658 ACPI_FUNCTION_ENTRY (); 659 660 661 /* 662 * Just lock the entire namespace for the duration of the dump. 663 * We don't want any changes to the namespace during this time, 664 * especially the temporary nodes since we are going to display 665 * them also. 666 */ 667 Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); 668 if (ACPI_FAILURE (Status)) 669 { 670 AcpiOsPrintf ("Could not acquire namespace mutex\n"); 671 return; 672 } 673 674 Info.DebugLevel = ACPI_LV_TABLES; 675 Info.OwnerId = OwnerId; 676 Info.DisplayType = DisplayType; 677 678 (void) AcpiNsWalkNamespace (Type, StartHandle, MaxDepth, 679 ACPI_NS_WALK_NO_UNLOCK | ACPI_NS_WALK_TEMP_NODES, 680 AcpiNsDumpOneObject, NULL, (void *) &Info, NULL); 681 682 (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); 683 } 684 685 686 /******************************************************************************* 687 * 688 * FUNCTION: AcpiNsDumpEntry 689 * 690 * PARAMETERS: Handle - Node to be dumped 691 * DebugLevel - Output level 692 * 693 * RETURN: None 694 * 695 * DESCRIPTION: Dump a single Node 696 * 697 ******************************************************************************/ 698 699 void 700 AcpiNsDumpEntry ( 701 ACPI_HANDLE Handle, 702 UINT32 DebugLevel) 703 { 704 ACPI_WALK_INFO Info; 705 706 707 ACPI_FUNCTION_ENTRY (); 708 709 710 Info.DebugLevel = DebugLevel; 711 Info.OwnerId = ACPI_OWNER_ID_MAX; 712 Info.DisplayType = ACPI_DISPLAY_SUMMARY; 713 714 (void) AcpiNsDumpOneObject (Handle, 1, &Info, NULL); 715 } 716 717 718 #ifdef ACPI_ASL_COMPILER 719 /******************************************************************************* 720 * 721 * FUNCTION: AcpiNsDumpTables 722 * 723 * PARAMETERS: SearchBase - Root of subtree to be dumped, or 724 * NS_ALL to dump the entire namespace 725 * MaxDepth - Maximum depth of dump. Use INT_MAX 726 * for an effectively unlimited depth. 727 * 728 * RETURN: None 729 * 730 * DESCRIPTION: Dump the name space, or a portion of it. 731 * 732 ******************************************************************************/ 733 734 void 735 AcpiNsDumpTables ( 736 ACPI_HANDLE SearchBase, 737 UINT32 MaxDepth) 738 { 739 ACPI_HANDLE SearchHandle = SearchBase; 740 741 742 ACPI_FUNCTION_TRACE (NsDumpTables); 743 744 745 if (!AcpiGbl_RootNode) 746 { 747 /* 748 * If the name space has not been initialized, 749 * there is nothing to dump. 750 */ 751 ACPI_DEBUG_PRINT ((ACPI_DB_TABLES, "namespace not initialized!\n")); 752 return_VOID; 753 } 754 755 if (ACPI_NS_ALL == SearchBase) 756 { 757 /* Entire namespace */ 758 759 SearchHandle = AcpiGbl_RootNode; 760 ACPI_DEBUG_PRINT ((ACPI_DB_TABLES, "\\\n")); 761 } 762 763 AcpiNsDumpObjects (ACPI_TYPE_ANY, ACPI_DISPLAY_OBJECTS, MaxDepth, 764 ACPI_OWNER_ID_MAX, SearchHandle); 765 return_VOID; 766 } 767 #endif 768 #endif 769