xref: /freebsd/sys/contrib/dev/acpica/compiler/aslload.c (revision 676041c41ba587285bb934aa2fca290ea7208038)
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 - 2023, 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 as well as type information */
1408  
1409          Node->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode);
1410          Node->Type = TargetNode->Type;
1411          if (Node->Type == ACPI_TYPE_METHOD)
1412          {
1413              /* Save the parameter count for methods */
1414  
1415              Node->Value = TargetNode->Value;
1416          }
1417      }
1418  
1419      return (AE_OK);
1420  }
1421  
1422  
1423  /*******************************************************************************
1424   *
1425   * FUNCTION:    LdCommonNamespaceEnd
1426   *
1427   * PARAMETERS:  ASL_WALK_CALLBACK
1428   *
1429   * RETURN:      Status
1430   *
1431   * DESCRIPTION: Ascending callback used during the loading of the namespace,
1432   *              We only need to worry about managing the scope stack here.
1433   *
1434   ******************************************************************************/
1435  
1436  static ACPI_STATUS
1437  LdCommonNamespaceEnd (
1438      ACPI_PARSE_OBJECT       *Op,
1439      UINT32                  Level,
1440      void                    *Context)
1441  {
1442      ACPI_WALK_STATE         *WalkState = (ACPI_WALK_STATE *) Context;
1443      ACPI_OBJECT_TYPE        ObjectType;
1444      BOOLEAN                 ForceNewScope = FALSE;
1445  
1446  
1447      ACPI_FUNCTION_NAME (LdCommonNamespaceEnd);
1448  
1449  
1450      /* We are only interested in opcodes that have an associated name */
1451  
1452      if (!Op->Asl.Namepath)
1453      {
1454          return (AE_OK);
1455      }
1456  
1457      /* Get the type to determine if we should pop the scope */
1458  
1459      if ((Op->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG) &&
1460          (Op->Asl.CompileFlags == OP_IS_RESOURCE_DESC))
1461      {
1462          /* TBD: Merge into AcpiDsMapNamedOpcodeToDataType */
1463  
1464          ObjectType = ACPI_TYPE_LOCAL_RESOURCE;
1465      }
1466      else
1467      {
1468          ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
1469      }
1470  
1471      /* Pop scope that was pushed for Resource Templates */
1472  
1473      if (Op->Asl.ParseOpcode == PARSEOP_NAME)
1474      {
1475          if (Op->Asl.CompileFlags & OP_IS_RESOURCE_DESC)
1476          {
1477              ForceNewScope = TRUE;
1478          }
1479      }
1480  
1481      /* Pop the scope stack */
1482  
1483      if (ForceNewScope || AcpiNsOpensScope (ObjectType))
1484      {
1485          ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
1486              "(%s): Popping scope for Op [%s] %p\n",
1487              AcpiUtGetTypeName (ObjectType), Op->Asl.ParseOpName, Op));
1488  
1489          (void) AcpiDsScopeStackPop (WalkState);
1490      }
1491  
1492      return (AE_OK);
1493  }
1494