1 /****************************************************************************** 2 * 3 * Module Name: aslload - compiler namespace load callbacks 4 * 5 *****************************************************************************/ 6 7 /****************************************************************************** 8 * 9 * 1. Copyright Notice 10 * 11 * Some or all of this work - Copyright (c) 1999 - 2020, 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 * Alternatively, you may choose to be licensed under the terms of the 117 * following license: 118 * 119 * Redistribution and use in source and binary forms, with or without 120 * modification, are permitted provided that the following conditions 121 * are met: 122 * 1. Redistributions of source code must retain the above copyright 123 * notice, this list of conditions, and the following disclaimer, 124 * without modification. 125 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 126 * substantially similar to the "NO WARRANTY" disclaimer below 127 * ("Disclaimer") and any redistribution must be conditioned upon 128 * including a substantially similar Disclaimer requirement for further 129 * binary redistribution. 130 * 3. Neither the names of the above-listed copyright holders nor the names 131 * of any contributors may be used to endorse or promote products derived 132 * from this software without specific prior written permission. 133 * 134 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 135 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 136 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 137 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 138 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 139 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 140 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 141 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 142 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 143 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 144 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 145 * 146 * Alternatively, you may choose to be licensed under the terms of the 147 * GNU General Public License ("GPL") version 2 as published by the Free 148 * Software Foundation. 149 * 150 *****************************************************************************/ 151 152 #include <contrib/dev/acpica/compiler/aslcompiler.h> 153 #include <contrib/dev/acpica/include/amlcode.h> 154 #include <contrib/dev/acpica/include/acdispat.h> 155 #include <contrib/dev/acpica/include/acnamesp.h> 156 #include <contrib/dev/acpica/include/acparser.h> 157 #include "aslcompiler.y.h" 158 159 160 #define _COMPONENT ACPI_COMPILER 161 ACPI_MODULE_NAME ("aslload") 162 163 /* Local prototypes */ 164 165 static ACPI_STATUS 166 LdLoadFieldElements ( 167 UINT32 AmlType, 168 ACPI_PARSE_OBJECT *Op, 169 ACPI_WALK_STATE *WalkState); 170 171 static ACPI_STATUS 172 LdLoadResourceElements ( 173 ACPI_PARSE_OBJECT *Op, 174 ACPI_WALK_STATE *WalkState); 175 176 static ACPI_STATUS 177 LdNamespace1Begin ( 178 ACPI_PARSE_OBJECT *Op, 179 UINT32 Level, 180 void *Context); 181 182 static ACPI_STATUS 183 LdNamespace2Begin ( 184 ACPI_PARSE_OBJECT *Op, 185 UINT32 Level, 186 void *Context); 187 188 static ACPI_STATUS 189 LdCommonNamespaceEnd ( 190 ACPI_PARSE_OBJECT *Op, 191 UINT32 Level, 192 void *Context); 193 194 static void 195 LdCheckSpecialNames ( 196 ACPI_NAMESPACE_NODE *Node, 197 ACPI_PARSE_OBJECT *Op); 198 199 static ACPI_STATUS 200 LdAnalyzeExternals ( 201 ACPI_NAMESPACE_NODE *Node, 202 ACPI_PARSE_OBJECT *Op, 203 ACPI_OBJECT_TYPE ExternalOpType, 204 ACPI_WALK_STATE *WalkState); 205 206 207 /******************************************************************************* 208 * 209 * FUNCTION: LdLoadNamespace 210 * 211 * PARAMETERS: RootOp - Root of the parse tree 212 * 213 * RETURN: Status 214 * 215 * DESCRIPTION: Perform a walk of the parse tree that in turn loads all of the 216 * named ASL/AML objects into the namespace. The namespace is 217 * constructed in order to resolve named references and references 218 * to named fields within resource templates/descriptors. 219 * 220 ******************************************************************************/ 221 222 ACPI_STATUS 223 LdLoadNamespace ( 224 ACPI_PARSE_OBJECT *RootOp) 225 { 226 ACPI_WALK_STATE *WalkState; 227 228 229 /* Create a new walk state */ 230 231 WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL); 232 if (!WalkState) 233 { 234 return (AE_NO_MEMORY); 235 } 236 237 /* Walk the entire parse tree, first pass */ 238 239 TrWalkParseTree (RootOp, ASL_WALK_VISIT_TWICE, LdNamespace1Begin, 240 LdCommonNamespaceEnd, WalkState); 241 242 /* Second pass to handle forward references */ 243 244 TrWalkParseTree (RootOp, ASL_WALK_VISIT_TWICE, LdNamespace2Begin, 245 LdCommonNamespaceEnd, WalkState); 246 247 /* Dump the namespace if debug is enabled */ 248 249 if (AcpiDbgLevel & ACPI_LV_TABLES) 250 { 251 AcpiNsDumpTables (ACPI_NS_ALL, ACPI_UINT32_MAX); 252 } 253 254 ACPI_FREE (WalkState); 255 return (AE_OK); 256 } 257 258 259 /******************************************************************************* 260 * 261 * FUNCTION: LdLoadFieldElements 262 * 263 * PARAMETERS: AmlType - Type to search 264 * Op - Parent node (Field) 265 * WalkState - Current walk state 266 * 267 * RETURN: Status 268 * 269 * DESCRIPTION: Enter the named elements of the field (children of the parent) 270 * into the namespace. 271 * 272 ******************************************************************************/ 273 274 static ACPI_STATUS 275 LdLoadFieldElements ( 276 UINT32 AmlType, 277 ACPI_PARSE_OBJECT *Op, 278 ACPI_WALK_STATE *WalkState) 279 { 280 ACPI_PARSE_OBJECT *Child = NULL; 281 ACPI_PARSE_OBJECT *SourceRegion; 282 ACPI_NAMESPACE_NODE *Node; 283 ACPI_STATUS Status; 284 char *ExternalPath; 285 286 287 SourceRegion = UtGetArg (Op, 0); 288 if (SourceRegion) 289 { 290 Status = AcpiNsLookup (WalkState->ScopeInfo, 291 SourceRegion->Asl.Value.String, AmlType, ACPI_IMODE_EXECUTE, 292 ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, NULL, &Node); 293 if (Status == AE_NOT_FOUND) 294 { 295 /* 296 * If the named object is not found, it means that it is either a 297 * forward reference or the named object does not exist. 298 */ 299 SourceRegion->Asl.CompileFlags |= OP_NOT_FOUND_DURING_LOAD; 300 } 301 } 302 303 /* Get the first named field element */ 304 305 switch (Op->Asl.AmlOpcode) 306 { 307 case AML_BANK_FIELD_OP: 308 309 Child = UtGetArg (Op, 6); 310 break; 311 312 case AML_INDEX_FIELD_OP: 313 314 Child = UtGetArg (Op, 5); 315 break; 316 317 case AML_FIELD_OP: 318 319 Child = UtGetArg (Op, 4); 320 break; 321 322 default: 323 324 /* No other opcodes should arrive here */ 325 326 return (AE_BAD_PARAMETER); 327 } 328 329 /* Enter all elements into the namespace */ 330 331 while (Child) 332 { 333 switch (Child->Asl.AmlOpcode) 334 { 335 case AML_INT_RESERVEDFIELD_OP: 336 case AML_INT_ACCESSFIELD_OP: 337 case AML_INT_CONNECTION_OP: 338 break; 339 340 default: 341 342 Status = AcpiNsLookup (WalkState->ScopeInfo, 343 Child->Asl.Value.String, 344 ACPI_TYPE_LOCAL_REGION_FIELD, 345 ACPI_IMODE_LOAD_PASS1, 346 ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE | 347 ACPI_NS_ERROR_IF_FOUND, NULL, &Node); 348 if (ACPI_FAILURE (Status)) 349 { 350 if (Status != AE_ALREADY_EXISTS) 351 { 352 AslError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION, Child, 353 Child->Asl.Value.String); 354 return (Status); 355 } 356 else if (Status == AE_ALREADY_EXISTS && 357 (Node->Flags & ANOBJ_IS_EXTERNAL)) 358 { 359 Node->Type = (UINT8) ACPI_TYPE_LOCAL_REGION_FIELD; 360 Node->Flags &= ~ANOBJ_IS_EXTERNAL; 361 } 362 else 363 { 364 /* 365 * The name already exists in this scope 366 * But continue processing the elements 367 */ 368 ExternalPath = AcpiNsGetNormalizedPathname (Node, TRUE); 369 370 AslDualParseOpError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Child, 371 ExternalPath, ASL_MSG_FOUND_HERE, Node->Op, 372 ExternalPath); 373 374 if (ExternalPath) 375 { 376 ACPI_FREE (ExternalPath); 377 } 378 } 379 } 380 else 381 { 382 Child->Asl.Node = Node; 383 Node->Op = Child; 384 } 385 break; 386 } 387 388 Child = Child->Asl.Next; 389 } 390 391 return (AE_OK); 392 } 393 394 395 /******************************************************************************* 396 * 397 * FUNCTION: LdLoadResourceElements 398 * 399 * PARAMETERS: Op - Parent node (Resource Descriptor) 400 * WalkState - Current walk state 401 * 402 * RETURN: Status 403 * 404 * DESCRIPTION: Enter the named elements of the resource descriptor (children 405 * of the parent) into the namespace. 406 * 407 * NOTE: In the real AML namespace, these named elements never exist. But 408 * we simply use the namespace here as a symbol table so we can look 409 * them up as they are referenced. 410 * 411 ******************************************************************************/ 412 413 static ACPI_STATUS 414 LdLoadResourceElements ( 415 ACPI_PARSE_OBJECT *Op, 416 ACPI_WALK_STATE *WalkState) 417 { 418 ACPI_PARSE_OBJECT *InitializerOp = NULL; 419 ACPI_NAMESPACE_NODE *Node; 420 ACPI_STATUS Status; 421 char *ExternalPath; 422 423 424 /* 425 * Enter the resource name into the namespace. Name must not already exist. 426 * This opens a scope, so later field names are guaranteed to be new/unique. 427 */ 428 Status = AcpiNsLookup (WalkState->ScopeInfo, Op->Asl.Namepath, 429 ACPI_TYPE_LOCAL_RESOURCE, ACPI_IMODE_LOAD_PASS1, 430 ACPI_NS_NO_UPSEARCH | ACPI_NS_ERROR_IF_FOUND, 431 WalkState, &Node); 432 if (ACPI_FAILURE (Status)) 433 { 434 if (Status == AE_ALREADY_EXISTS) 435 { 436 /* Actual node causing the error was saved in ParentMethod */ 437 438 ExternalPath = AcpiNsGetNormalizedPathname (Node, TRUE); 439 440 AslDualParseOpError (ASL_ERROR, ASL_MSG_NAME_EXISTS, 441 (ACPI_PARSE_OBJECT *) Op->Asl.ParentMethod, 442 ExternalPath, ASL_MSG_FOUND_HERE, Node->Op, 443 ExternalPath); 444 445 if (ExternalPath) 446 { 447 ACPI_FREE (ExternalPath); 448 } 449 return (AE_OK); 450 } 451 return (Status); 452 } 453 454 Node->Value = (UINT32) Op->Asl.Value.Integer; 455 Node->Op = Op; 456 Op->Asl.Node = Node; 457 458 /* 459 * Now enter the predefined fields, for easy lookup when referenced 460 * by the source ASL 461 */ 462 InitializerOp = ASL_GET_CHILD_NODE (Op); 463 while (InitializerOp) 464 { 465 if (InitializerOp->Asl.ExternalName) 466 { 467 Status = AcpiNsLookup (WalkState->ScopeInfo, 468 InitializerOp->Asl.ExternalName, 469 ACPI_TYPE_LOCAL_RESOURCE_FIELD, ACPI_IMODE_LOAD_PASS1, 470 ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE, NULL, &Node); 471 if (ACPI_FAILURE (Status)) 472 { 473 return (Status); 474 } 475 476 /* 477 * Store the field offset and length in the namespace node 478 * so it can be used when the field is referenced 479 */ 480 Node->Value = InitializerOp->Asl.Value.Tag.BitOffset; 481 Node->Length = InitializerOp->Asl.Value.Tag.BitLength; 482 InitializerOp->Asl.Node = Node; 483 Node->Op = InitializerOp; 484 } 485 486 InitializerOp = ASL_GET_PEER_NODE (InitializerOp); 487 } 488 489 return (AE_OK); 490 } 491 492 493 /******************************************************************************* 494 * 495 * FUNCTION: LdNamespace1Begin 496 * 497 * PARAMETERS: ASL_WALK_CALLBACK 498 * 499 * RETURN: Status 500 * 501 * DESCRIPTION: Descending callback used during the parse tree walk. If this 502 * is a named AML opcode, enter into the namespace 503 * 504 ******************************************************************************/ 505 506 static ACPI_STATUS 507 LdNamespace1Begin ( 508 ACPI_PARSE_OBJECT *Op, 509 UINT32 Level, 510 void *Context) 511 { 512 ACPI_WALK_STATE *WalkState = (ACPI_WALK_STATE *) Context; 513 ACPI_NAMESPACE_NODE *Node; 514 ACPI_PARSE_OBJECT *MethodOp; 515 ACPI_STATUS Status; 516 ACPI_OBJECT_TYPE ObjectType; 517 char *Path; 518 UINT32 Flags = ACPI_NS_NO_UPSEARCH; 519 ACPI_PARSE_OBJECT *Arg; 520 UINT32 i; 521 BOOLEAN ForceNewScope = FALSE; 522 const ACPI_OPCODE_INFO *OpInfo; 523 ACPI_PARSE_OBJECT *ParentOp; 524 char *ExternalPath; 525 526 527 ACPI_FUNCTION_NAME (LdNamespace1Begin); 528 529 530 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op %p [%s]\n", 531 Op, Op->Asl.ParseOpName)); 532 533 /* 534 * We are only interested in opcodes that have an associated name 535 * (or multiple names) 536 */ 537 switch (Op->Asl.AmlOpcode) 538 { 539 case AML_INDEX_FIELD_OP: 540 541 Status = LdLoadFieldElements (ACPI_TYPE_LOCAL_REGION_FIELD, Op, WalkState); 542 return (Status); 543 544 case AML_BANK_FIELD_OP: 545 case AML_FIELD_OP: 546 547 Status = LdLoadFieldElements (ACPI_TYPE_REGION, Op, WalkState); 548 return (Status); 549 550 case AML_INT_CONNECTION_OP: 551 552 if (Op->Asl.Child->Asl.AmlOpcode != AML_INT_NAMEPATH_OP) 553 { 554 break; 555 } 556 557 Arg = Op->Asl.Child; 558 Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Asl.ExternalName, 559 ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, 560 WalkState, &Node); 561 if (ACPI_FAILURE (Status)) 562 { 563 break; 564 } 565 566 break; 567 568 default: 569 570 /* All other opcodes go below */ 571 572 break; 573 } 574 575 /* Check if this object has already been installed in the namespace */ 576 577 if (Op->Asl.Node) 578 { 579 return (AE_OK); 580 } 581 582 /* Check for a possible illegal forward reference */ 583 584 if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG) || 585 (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING) || 586 (Op->Asl.ParseOpcode == PARSEOP_METHODCALL)) 587 { 588 /* 589 * Op->Asl.Namepath will be NULL for these opcodes. 590 * These opcodes are guaranteed to have a parent. 591 * Examine the parent opcode. 592 */ 593 ParentOp = Op->Asl.Parent; 594 OpInfo = AcpiPsGetOpcodeInfo (ParentOp->Asl.AmlOpcode); 595 596 /* 597 * Exclude all operators that actually declare a new name: 598 * Name (ABCD, 1) -> Ignore (AML_CLASS_NAMED_OBJECT) 599 * We only want references to named objects: 600 * Store (2, WXYZ) -> Attempt to resolve the name 601 */ 602 if ((Op->Asl.ParseOpcode != PARSEOP_METHODCALL) && 603 (OpInfo->Class == AML_CLASS_NAMED_OBJECT)) 604 { 605 return (AE_OK); 606 } 607 608 /* 609 * Check if the referenced object exists at this point during 610 * the load: 611 * 1) If it exists, then this cannot be a forward reference. 612 * 2) If it does not exist, it could be a forward reference or 613 * it truly does not exist (and no external declaration). 614 */ 615 Status = AcpiNsLookup (WalkState->ScopeInfo, 616 Op->Asl.Value.Name, ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE, 617 ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, 618 WalkState, &Node); 619 if (Status == AE_NOT_FOUND) 620 { 621 /* 622 * This is either a forward reference or the object truly 623 * does not exist. The two cases can only be differentiated 624 * during the cross-reference stage later. Mark the Op/Name 625 * as not-found for now to indicate the need for further 626 * processing. 627 * 628 * Special case: Allow forward references from elements of 629 * Package objects. This provides compatibility with other 630 * ACPI implementations. To correctly implement this, the 631 * ACPICA table load defers package resolution until the entire 632 * namespace has been loaded. 633 */ 634 if ((ParentOp->Asl.ParseOpcode != PARSEOP_PACKAGE) && 635 (ParentOp->Asl.ParseOpcode != PARSEOP_VAR_PACKAGE)) 636 { 637 Op->Asl.CompileFlags |= OP_NOT_FOUND_DURING_LOAD; 638 } 639 640 return (AE_OK); 641 } 642 643 return (Status); 644 } 645 646 Path = Op->Asl.Namepath; 647 if (!Path) 648 { 649 return (AE_OK); 650 } 651 652 /* Map the raw opcode into an internal object type */ 653 654 switch (Op->Asl.ParseOpcode) 655 { 656 case PARSEOP_NAME: 657 658 Arg = Op->Asl.Child; /* Get the NameSeg/NameString node */ 659 Arg = Arg->Asl.Next; /* First peer is the object to be associated with the name */ 660 661 /* 662 * If this name refers to a ResourceTemplate, we will need to open 663 * a new scope so that the resource subfield names can be entered into 664 * the namespace underneath this name 665 */ 666 if (Op->Asl.CompileFlags & OP_IS_RESOURCE_DESC) 667 { 668 ForceNewScope = TRUE; 669 } 670 671 /* Get the data type associated with the named object, not the name itself */ 672 673 /* Log2 loop to convert from Btype (binary) to Etype (encoded) */ 674 675 ObjectType = 1; 676 for (i = 1; i < Arg->Asl.AcpiBtype; i *= 2) 677 { 678 ObjectType++; 679 } 680 break; 681 682 case PARSEOP_EXTERNAL: 683 /* 684 * "External" simply enters a name and type into the namespace. 685 * We must be careful to not open a new scope, however, no matter 686 * what type the external name refers to (e.g., a method) 687 * 688 * first child is name, next child is ObjectType 689 */ 690 ObjectType = (UINT8) Op->Asl.Child->Asl.Next->Asl.Value.Integer; 691 692 /* 693 * We will mark every new node along the path as "External". This 694 * allows some or all of the nodes to be created later in the ASL 695 * code. Handles cases like this: 696 * 697 * External (\_SB_.PCI0.ABCD, IntObj) 698 * Scope (_SB_) 699 * { 700 * Device (PCI0) 701 * { 702 * } 703 * } 704 * Method (X) 705 * { 706 * Store (\_SB_.PCI0.ABCD, Local0) 707 * } 708 */ 709 Flags |= ACPI_NS_EXTERNAL | ACPI_NS_DONT_OPEN_SCOPE; 710 break; 711 712 case PARSEOP_DEFAULT_ARG: 713 714 if (Op->Asl.CompileFlags == OP_IS_RESOURCE_DESC) 715 { 716 Status = LdLoadResourceElements (Op, WalkState); 717 return_ACPI_STATUS (Status); 718 } 719 720 ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 721 break; 722 723 case PARSEOP_SCOPE: 724 /* 725 * The name referenced by Scope(Name) must already exist at this point. 726 * In other words, forward references for Scope() are not supported. 727 * The only real reason for this is that the MS interpreter cannot 728 * handle this case. Perhaps someday this case can go away. 729 */ 730 Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY, 731 ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, WalkState, &Node); 732 if (ACPI_FAILURE (Status)) 733 { 734 if (Status == AE_NOT_FOUND) 735 { 736 /* The name was not found, go ahead and create it */ 737 738 Status = AcpiNsLookup (WalkState->ScopeInfo, Path, 739 ACPI_TYPE_LOCAL_SCOPE, ACPI_IMODE_LOAD_PASS1, 740 Flags, WalkState, &Node); 741 if (ACPI_FAILURE (Status)) 742 { 743 return_ACPI_STATUS (Status); 744 } 745 746 /* However, this is an error -- operand to Scope must exist */ 747 748 if (strlen (Op->Asl.ExternalName) == ACPI_NAMESEG_SIZE) 749 { 750 AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op, 751 Op->Asl.ExternalName); 752 } 753 else 754 { 755 AslError (ASL_ERROR, ASL_MSG_NAMEPATH_NOT_EXIST, Op, 756 Op->Asl.ExternalName); 757 } 758 759 goto FinishNode; 760 } 761 762 AslCoreSubsystemError (Op, Status, 763 "Failure from namespace lookup", FALSE); 764 765 return_ACPI_STATUS (Status); 766 } 767 else /* Status AE_OK */ 768 { 769 /* 770 * Do not allow references to external scopes from the DSDT. 771 * This is because the DSDT is always loaded first, and the 772 * external reference cannot be resolved -- causing a runtime 773 * error because Scope() must be resolved immediately. 774 * 10/2015. 775 */ 776 if ((Node->Flags & ANOBJ_IS_EXTERNAL) && 777 (ACPI_COMPARE_NAMESEG (AslGbl_TableSignature, "DSDT"))) 778 { 779 /* However, allowed if the reference is within a method */ 780 781 MethodOp = Op->Asl.Parent; 782 while (MethodOp && 783 (MethodOp->Asl.ParseOpcode != PARSEOP_METHOD)) 784 { 785 MethodOp = MethodOp->Asl.Parent; 786 } 787 788 if (!MethodOp) 789 { 790 /* Not in a control method, error */ 791 792 AslError (ASL_ERROR, ASL_MSG_CROSS_TABLE_SCOPE, Op, NULL); 793 } 794 } 795 } 796 797 /* We found a node with this name, now check the type */ 798 799 switch (Node->Type) 800 { 801 case ACPI_TYPE_LOCAL_SCOPE: 802 case ACPI_TYPE_DEVICE: 803 case ACPI_TYPE_POWER: 804 case ACPI_TYPE_PROCESSOR: 805 case ACPI_TYPE_THERMAL: 806 807 /* These are acceptable types - they all open a new scope */ 808 break; 809 810 case ACPI_TYPE_INTEGER: 811 case ACPI_TYPE_STRING: 812 case ACPI_TYPE_BUFFER: 813 /* 814 * These types we will allow, but we will change the type. 815 * This enables some existing code of the form: 816 * 817 * Name (DEB, 0) 818 * Scope (DEB) { ... } 819 * 820 * Which is used to workaround the fact that the MS interpreter 821 * does not allow Scope() forward references. 822 */ 823 sprintf (AslGbl_MsgBuffer, "%s [%s], changing type to [Scope]", 824 Op->Asl.ExternalName, AcpiUtGetTypeName (Node->Type)); 825 AslError (ASL_REMARK, ASL_MSG_SCOPE_TYPE, Op, AslGbl_MsgBuffer); 826 827 /* Switch the type to scope, open the new scope */ 828 829 Node->Type = ACPI_TYPE_LOCAL_SCOPE; 830 Status = AcpiDsScopeStackPush (Node, ACPI_TYPE_LOCAL_SCOPE, 831 WalkState); 832 if (ACPI_FAILURE (Status)) 833 { 834 return_ACPI_STATUS (Status); 835 } 836 break; 837 838 default: 839 840 /* All other types are an error */ 841 842 sprintf (AslGbl_MsgBuffer, "%s [%s]", Op->Asl.ExternalName, 843 AcpiUtGetTypeName (Node->Type)); 844 AslError (ASL_ERROR, ASL_MSG_SCOPE_TYPE, Op, AslGbl_MsgBuffer); 845 846 /* 847 * However, switch the type to be an actual scope so 848 * that compilation can continue without generating a whole 849 * cascade of additional errors. Open the new scope. 850 */ 851 Node->Type = ACPI_TYPE_LOCAL_SCOPE; 852 Status = AcpiDsScopeStackPush (Node, ACPI_TYPE_LOCAL_SCOPE, 853 WalkState); 854 if (ACPI_FAILURE (Status)) 855 { 856 return_ACPI_STATUS (Status); 857 } 858 break; 859 } 860 861 Status = AE_OK; 862 goto FinishNode; 863 864 default: 865 866 ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 867 break; 868 } 869 870 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Loading name: %s, (%s)\n", 871 Op->Asl.ExternalName, AcpiUtGetTypeName (ObjectType))); 872 873 /* The name must not already exist */ 874 875 Flags |= ACPI_NS_ERROR_IF_FOUND; 876 877 /* 878 * For opcodes that enter new names into the namespace, 879 * all prefix NameSegs must exist. 880 */ 881 WalkState->OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode); 882 if (((WalkState->OpInfo->Flags & AML_NAMED) || 883 (WalkState->OpInfo->Flags & AML_CREATE)) && 884 (Op->Asl.AmlOpcode != AML_EXTERNAL_OP)) 885 { 886 Flags |= ACPI_NS_PREFIX_MUST_EXIST; 887 } 888 889 /* 890 * Enter the named type into the internal namespace. We enter the name 891 * as we go downward in the parse tree. Any necessary subobjects that 892 * involve arguments to the opcode must be created as we go back up the 893 * parse tree later. 894 */ 895 Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType, 896 ACPI_IMODE_LOAD_PASS1, Flags, WalkState, &Node); 897 if (ACPI_FAILURE (Status)) 898 { 899 if (Status == AE_ALREADY_EXISTS) 900 { 901 /* The name already exists in this scope */ 902 903 if (Node->Type == ACPI_TYPE_LOCAL_SCOPE) 904 { 905 /* Allow multiple references to the same scope */ 906 907 Node->Type = (UINT8) ObjectType; 908 Status = AE_OK; 909 } 910 else if ((Node->Flags & ANOBJ_IS_EXTERNAL) || 911 (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL)) 912 { 913 Status = LdAnalyzeExternals (Node, Op, ObjectType, WalkState); 914 if (ACPI_FAILURE (Status)) 915 { 916 if (Status == AE_ERROR) 917 { 918 /* 919 * The use of AE_ERROR here indicates that there was a 920 * compiler error emitted in LdAnalyzeExternals which 921 * means that the caller should proceed to the next Op 922 * for analysis of subsequent parse objects. 923 */ 924 Status = AE_OK; 925 } 926 return_ACPI_STATUS (Status); 927 } 928 929 if (!(Node->Flags & ANOBJ_IS_EXTERNAL) && 930 (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL)) 931 { 932 /* 933 * If we get to here, it means that an actual definition of 934 * the object declared external exists. Meaning that Op 935 * loading this this Op should have no change to the ACPI 936 * namespace. By going to FinishNode, we skip the 937 * assignment of Node->Op = Op. 938 */ 939 goto FinishNode; 940 } 941 } 942 else 943 { 944 /* Valid error, object already exists */ 945 946 ExternalPath = AcpiNsGetNormalizedPathname (Node, TRUE); 947 948 AslDualParseOpError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Op, 949 ExternalPath, ASL_MSG_FOUND_HERE, Node->Op, 950 ExternalPath); 951 952 if (ExternalPath) 953 { 954 ACPI_FREE (ExternalPath); 955 } 956 return_ACPI_STATUS (AE_OK); 957 } 958 } 959 else if (AE_NOT_FOUND) 960 { 961 /* 962 * One or more prefix NameSegs of the NamePath do not exist 963 * (all of them must exist). Attempt to continue compilation 964 * by setting the current scope to the root. 965 */ 966 Node = AcpiGbl_RootNode; 967 Status = AE_OK; 968 } 969 else 970 { 971 /* Flag all other errors as coming from the ACPICA core */ 972 973 AslCoreSubsystemError (Op, Status, 974 "Failure from namespace lookup", FALSE); 975 return_ACPI_STATUS (Status); 976 } 977 } 978 979 /* Check special names like _WAK and _PTS */ 980 981 LdCheckSpecialNames (Node, Op); 982 983 if (ForceNewScope) 984 { 985 Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState); 986 if (ACPI_FAILURE (Status)) 987 { 988 return_ACPI_STATUS (Status); 989 } 990 } 991 992 /* Point the Node back to the original Parse node */ 993 994 Node->Op = Op; 995 996 FinishNode: 997 998 /* Point the parse node to the new namespace node */ 999 1000 Op->Asl.Node = Node; 1001 1002 if (Op->Asl.ParseOpcode == PARSEOP_METHOD) 1003 { 1004 /* 1005 * Get the method argument count from "Extra" and save 1006 * it in the namespace node 1007 */ 1008 Node->Value = (UINT32) Op->Asl.Extra; 1009 } 1010 else if (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL && 1011 Node->Type == ACPI_TYPE_METHOD && 1012 (Node->Flags & ANOBJ_IS_EXTERNAL)) 1013 { 1014 Node->Value = 1015 (UINT32) Op->Asl.Child->Asl.Next->Asl.Next->Asl.Value.Integer; 1016 } 1017 1018 return_ACPI_STATUS (Status); 1019 } 1020 1021 1022 /******************************************************************************* 1023 * 1024 * FUNCTION: LdMatchExternType 1025 * 1026 * PARAMETERS: Type1 1027 * Type2 1028 * 1029 * RETURN: BOOLEAN 1030 * 1031 * DESCRIPTION: Match Type1 and Type2 with the assumption that one might be 1032 * using external types and another might be using local types. 1033 * This should be used to compare the types found in external 1034 * declarations with types found in other external declarations or 1035 * named object declaration. This should not be used to match two 1036 * object type declarations. 1037 * 1038 ******************************************************************************/ 1039 1040 static BOOLEAN 1041 LdMatchExternType ( 1042 ACPI_OBJECT_TYPE Type1, 1043 ACPI_OBJECT_TYPE Type2) 1044 { 1045 BOOLEAN Type1IsLocal = Type1 > ACPI_TYPE_EXTERNAL_MAX; 1046 BOOLEAN Type2IsLocal = Type2 > ACPI_TYPE_EXTERNAL_MAX; 1047 ACPI_OBJECT_TYPE ExternalType; 1048 ACPI_OBJECT_TYPE LocalType; 1049 1050 1051 /* 1052 * The inputs could represent types that are local to ACPICA or types that 1053 * are known externally. Some local types, such as the OperationRegion 1054 * field units, are defined with more granularity than ACPICA local types. 1055 * 1056 * Therefore, map the local types to the external types before matching. 1057 */ 1058 if (Type1IsLocal && !Type2IsLocal) 1059 { 1060 LocalType = Type1; 1061 ExternalType = Type2; 1062 } 1063 else if (!Type1IsLocal && Type2IsLocal) 1064 { 1065 LocalType = Type2; 1066 ExternalType = Type1; 1067 } 1068 else 1069 { 1070 return (Type1 == Type2); 1071 } 1072 1073 switch (LocalType) 1074 { 1075 case ACPI_TYPE_LOCAL_REGION_FIELD: 1076 case ACPI_TYPE_LOCAL_BANK_FIELD: 1077 case ACPI_TYPE_LOCAL_INDEX_FIELD: 1078 1079 LocalType = ACPI_TYPE_FIELD_UNIT; 1080 break; 1081 1082 default: 1083 break; 1084 } 1085 1086 return (LocalType == ExternalType); 1087 } 1088 1089 1090 /******************************************************************************* 1091 * 1092 * FUNCTION: LdAnalyzeExternals 1093 * 1094 * PARAMETERS: Node - Node that represents the named object 1095 * Op - Named object declaring this named object 1096 * ExternalOpType - Type of ExternalOp 1097 * WalkState - Current WalkState 1098 * 1099 * RETURN: Status 1100 * 1101 * DESCRIPTION: Node and Op represents an identically named object declaration 1102 * that is either declared by the ASL external keyword or declared 1103 * by operators that declare named objects (i.e. Name, Device, 1104 * OperationRegion, and etc.). This function ensures that the 1105 * declarations do not contradict each other. 1106 * 1107 ******************************************************************************/ 1108 1109 static ACPI_STATUS 1110 LdAnalyzeExternals ( 1111 ACPI_NAMESPACE_NODE *Node, 1112 ACPI_PARSE_OBJECT *Op, 1113 ACPI_OBJECT_TYPE ExternalOpType, 1114 ACPI_WALK_STATE *WalkState) 1115 { 1116 ACPI_STATUS Status = AE_OK; 1117 ACPI_OBJECT_TYPE ActualExternalOpType; 1118 ACPI_OBJECT_TYPE ActualOpType; 1119 ACPI_PARSE_OBJECT *ExternalOp; 1120 ACPI_PARSE_OBJECT *ActualOp; 1121 1122 1123 /* 1124 * The declaration represented by Node and Op must have the same type. 1125 * The type of the external Op is represented by ExternalOpType. However, 1126 * the type of the pre-existing declaration depends on whether if Op 1127 * is an external declaration or an actual declaration. 1128 */ 1129 if (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL) 1130 { 1131 ActualExternalOpType = ExternalOpType; 1132 ActualOpType = Node->Type; 1133 } 1134 else 1135 { 1136 ActualExternalOpType = Node->Type; 1137 ActualOpType = ExternalOpType; 1138 } 1139 1140 if ((ActualOpType != ACPI_TYPE_ANY) && 1141 (ActualExternalOpType != ACPI_TYPE_ANY) && 1142 !LdMatchExternType (ActualExternalOpType, ActualOpType)) 1143 { 1144 if (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL && 1145 Node->Op->Asl.ParseOpcode == PARSEOP_EXTERNAL) 1146 { 1147 AslDualParseOpError (ASL_WARNING, 1148 ASL_MSG_DUPLICATE_EXTERN_MISMATCH, Op, NULL, 1149 ASL_MSG_DUPLICATE_EXTERN_FOUND_HERE, Node->Op, NULL); 1150 } 1151 else 1152 { 1153 if (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL && 1154 Node->Op->Asl.ParseOpcode != PARSEOP_EXTERNAL) 1155 { 1156 ExternalOp = Op; 1157 ActualOp = Node->Op; 1158 } 1159 else 1160 { 1161 ExternalOp = Node->Op; 1162 ActualOp = Op; 1163 } 1164 AslDualParseOpError (ASL_WARNING, 1165 ASL_MSG_DECLARATION_TYPE_MISMATCH, ExternalOp, NULL, 1166 ASL_MSG_TYPE_MISMATCH_FOUND_HERE, ActualOp, NULL); 1167 } 1168 } 1169 1170 /* Set the object type of the external */ 1171 1172 if ((Node->Flags & ANOBJ_IS_EXTERNAL) && 1173 (Op->Asl.ParseOpcode != PARSEOP_EXTERNAL)) 1174 { 1175 /* 1176 * Allow one create on an object or segment that was 1177 * previously declared External 1178 */ 1179 Node->Flags &= ~ANOBJ_IS_EXTERNAL; 1180 Node->Type = (UINT8) ActualOpType; 1181 1182 /* Just retyped a node, probably will need to open a scope */ 1183 1184 if (AcpiNsOpensScope (ActualOpType)) 1185 { 1186 Status = AcpiDsScopeStackPush (Node, ActualOpType, WalkState); 1187 if (ACPI_FAILURE (Status)) 1188 { 1189 return (Status); 1190 } 1191 } 1192 1193 Status = AE_OK; 1194 } 1195 else if (!(Node->Flags & ANOBJ_IS_EXTERNAL) && 1196 (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL)) 1197 { 1198 /* 1199 * Allow externals in same scope as the definition of the 1200 * actual object. Similar to C. Allows multiple definition 1201 * blocks that refer to each other in the same file. 1202 */ 1203 Status = AE_OK; 1204 } 1205 else if ((Node->Flags & ANOBJ_IS_EXTERNAL) && 1206 (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL) && 1207 (ActualOpType == ACPI_TYPE_ANY)) 1208 { 1209 /* Allow update of externals of unknown type. */ 1210 1211 Node->Type = (UINT8) ActualExternalOpType; 1212 Status = AE_OK; 1213 } 1214 1215 return (Status); 1216 } 1217 1218 1219 /******************************************************************************* 1220 * 1221 * FUNCTION: LdCheckSpecialNames 1222 * 1223 * PARAMETERS: Node - Node that represents the named object 1224 * Op - Named object declaring this named object 1225 * 1226 * RETURN: None 1227 * 1228 * DESCRIPTION: Check if certain named objects are declared in the incorrect 1229 * scope. Special named objects are listed in 1230 * AslGbl_SpecialNamedObjects and can only be declared at the root 1231 * scope. _UID inside of a processor declaration must not be a 1232 * string. 1233 * 1234 ******************************************************************************/ 1235 1236 static void 1237 LdCheckSpecialNames ( 1238 ACPI_NAMESPACE_NODE *Node, 1239 ACPI_PARSE_OBJECT *Op) 1240 { 1241 UINT32 i; 1242 1243 1244 for (i = 0; i < MAX_SPECIAL_NAMES; i++) 1245 { 1246 if (ACPI_COMPARE_NAMESEG(Node->Name.Ascii, AslGbl_SpecialNamedObjects[i]) && 1247 Node->Parent != AcpiGbl_RootNode) 1248 { 1249 AslError (ASL_ERROR, ASL_MSG_INVALID_SPECIAL_NAME, Op, Op->Asl.ExternalName); 1250 return; 1251 } 1252 } 1253 1254 if (ACPI_COMPARE_NAMESEG (Node->Name.Ascii, "_UID") && 1255 Node->Parent->Type == ACPI_TYPE_PROCESSOR && 1256 Node->Type == ACPI_TYPE_STRING) 1257 { 1258 AslError (ASL_ERROR, ASL_MSG_INVALID_PROCESSOR_UID , Op, "found a string"); 1259 } 1260 } 1261 1262 1263 /******************************************************************************* 1264 * 1265 * FUNCTION: LdNamespace2Begin 1266 * 1267 * PARAMETERS: ASL_WALK_CALLBACK 1268 * 1269 * RETURN: Status 1270 * 1271 * DESCRIPTION: Descending callback used during the pass 2 parse tree walk. 1272 * Second pass resolves some forward references. 1273 * 1274 * Notes: 1275 * Currently only needs to handle the Alias operator. 1276 * Could be used to allow forward references from the Scope() operator, but 1277 * the MS interpreter does not allow this, so this compiler does not either. 1278 * 1279 ******************************************************************************/ 1280 1281 static ACPI_STATUS 1282 LdNamespace2Begin ( 1283 ACPI_PARSE_OBJECT *Op, 1284 UINT32 Level, 1285 void *Context) 1286 { 1287 ACPI_WALK_STATE *WalkState = (ACPI_WALK_STATE *) Context; 1288 ACPI_STATUS Status; 1289 ACPI_NAMESPACE_NODE *Node; 1290 ACPI_OBJECT_TYPE ObjectType; 1291 BOOLEAN ForceNewScope = FALSE; 1292 ACPI_PARSE_OBJECT *Arg; 1293 char *Path; 1294 ACPI_NAMESPACE_NODE *TargetNode; 1295 1296 1297 ACPI_FUNCTION_NAME (LdNamespace2Begin); 1298 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op %p [%s]\n", 1299 Op, Op->Asl.ParseOpName)); 1300 1301 1302 /* Ignore Ops with no namespace node */ 1303 1304 Node = Op->Asl.Node; 1305 if (!Node) 1306 { 1307 return (AE_OK); 1308 } 1309 1310 /* Get the type to determine if we should push the scope */ 1311 1312 if ((Op->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG) && 1313 (Op->Asl.CompileFlags == OP_IS_RESOURCE_DESC)) 1314 { 1315 ObjectType = ACPI_TYPE_LOCAL_RESOURCE; 1316 } 1317 else 1318 { 1319 ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 1320 } 1321 1322 /* Push scope for Resource Templates */ 1323 1324 if (Op->Asl.ParseOpcode == PARSEOP_NAME) 1325 { 1326 if (Op->Asl.CompileFlags & OP_IS_RESOURCE_DESC) 1327 { 1328 ForceNewScope = TRUE; 1329 } 1330 } 1331 1332 /* Push the scope stack */ 1333 1334 if (ForceNewScope || AcpiNsOpensScope (ObjectType)) 1335 { 1336 Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState); 1337 if (ACPI_FAILURE (Status)) 1338 { 1339 return_ACPI_STATUS (Status); 1340 } 1341 } 1342 1343 if (Op->Asl.ParseOpcode == PARSEOP_ALIAS) 1344 { 1345 /* 1346 * Complete the alias node by getting and saving the target node. 1347 * First child is the alias target 1348 */ 1349 Arg = Op->Asl.Child; 1350 1351 /* Get the target pathname */ 1352 1353 Path = Arg->Asl.Namepath; 1354 if (!Path) 1355 { 1356 Status = UtInternalizeName (Arg->Asl.ExternalName, &Path); 1357 if (ACPI_FAILURE (Status)) 1358 { 1359 return (Status); 1360 } 1361 } 1362 1363 /* Get the NS node associated with the target. It must exist. */ 1364 1365 Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY, 1366 ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, 1367 WalkState, &TargetNode); 1368 if (ACPI_FAILURE (Status)) 1369 { 1370 if (Status == AE_NOT_FOUND) 1371 { 1372 /* Standalone NameSeg vs. NamePath */ 1373 1374 if (strlen (Arg->Asl.ExternalName) == ACPI_NAMESEG_SIZE) 1375 { 1376 AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op, 1377 Arg->Asl.ExternalName); 1378 } 1379 else 1380 { 1381 AslError (ASL_ERROR, ASL_MSG_NAMEPATH_NOT_EXIST, Op, 1382 Arg->Asl.ExternalName); 1383 } 1384 1385 #if 0 1386 /* 1387 * NOTE: Removed 10/2018 to enhance compiler error reporting. No 1388 * regressions seen. 1389 */ 1390 /* 1391 * The name was not found, go ahead and create it. 1392 * This prevents more errors later. 1393 */ 1394 Status = AcpiNsLookup (WalkState->ScopeInfo, Path, 1395 ACPI_TYPE_ANY, ACPI_IMODE_LOAD_PASS1, 1396 ACPI_NS_NO_UPSEARCH, WalkState, &Node); 1397 #endif 1398 return (Status); 1399 /* Removed: return (AE_OK)*/ 1400 } 1401 1402 AslCoreSubsystemError (Op, Status, 1403 "Failure from namespace lookup", FALSE); 1404 return (AE_OK); 1405 } 1406 1407 /* Save the target node within the alias node */ 1408 1409 Node->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode); 1410 } 1411 1412 return (AE_OK); 1413 } 1414 1415 1416 /******************************************************************************* 1417 * 1418 * FUNCTION: LdCommonNamespaceEnd 1419 * 1420 * PARAMETERS: ASL_WALK_CALLBACK 1421 * 1422 * RETURN: Status 1423 * 1424 * DESCRIPTION: Ascending callback used during the loading of the namespace, 1425 * We only need to worry about managing the scope stack here. 1426 * 1427 ******************************************************************************/ 1428 1429 static ACPI_STATUS 1430 LdCommonNamespaceEnd ( 1431 ACPI_PARSE_OBJECT *Op, 1432 UINT32 Level, 1433 void *Context) 1434 { 1435 ACPI_WALK_STATE *WalkState = (ACPI_WALK_STATE *) Context; 1436 ACPI_OBJECT_TYPE ObjectType; 1437 BOOLEAN ForceNewScope = FALSE; 1438 1439 1440 ACPI_FUNCTION_NAME (LdCommonNamespaceEnd); 1441 1442 1443 /* We are only interested in opcodes that have an associated name */ 1444 1445 if (!Op->Asl.Namepath) 1446 { 1447 return (AE_OK); 1448 } 1449 1450 /* Get the type to determine if we should pop the scope */ 1451 1452 if ((Op->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG) && 1453 (Op->Asl.CompileFlags == OP_IS_RESOURCE_DESC)) 1454 { 1455 /* TBD: Merge into AcpiDsMapNamedOpcodeToDataType */ 1456 1457 ObjectType = ACPI_TYPE_LOCAL_RESOURCE; 1458 } 1459 else 1460 { 1461 ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 1462 } 1463 1464 /* Pop scope that was pushed for Resource Templates */ 1465 1466 if (Op->Asl.ParseOpcode == PARSEOP_NAME) 1467 { 1468 if (Op->Asl.CompileFlags & OP_IS_RESOURCE_DESC) 1469 { 1470 ForceNewScope = TRUE; 1471 } 1472 } 1473 1474 /* Pop the scope stack */ 1475 1476 if (ForceNewScope || AcpiNsOpensScope (ObjectType)) 1477 { 1478 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, 1479 "(%s): Popping scope for Op [%s] %p\n", 1480 AcpiUtGetTypeName (ObjectType), Op->Asl.ParseOpName, Op)); 1481 1482 (void) AcpiDsScopeStackPop (WalkState); 1483 } 1484 1485 return (AE_OK); 1486 } 1487