1 /******************************************************************************
3 * Module Name: dswload - Dispatcher namespace load callbacks
5 *****************************************************************************/
8 * Copyright (C) 2000 - 2013, Intel Corp.
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions, and the following disclaimer,
16 * without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 * substantially similar to the "NO WARRANTY" disclaimer below
19 * ("Disclaimer") and any redistribution must be conditioned upon
20 * including a substantially similar Disclaimer requirement for further
21 * binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 * of any contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
46 #include "aslcompiler.h"
51 #include "aslcompiler.y.h"
53 #define _COMPONENT ACPI_COMPILER
54 ACPI_MODULE_NAME ("aslload")
56 /* Local prototypes */
60 ACPI_PARSE_OBJECT
*Op
,
61 ACPI_WALK_STATE
*WalkState
);
64 LdLoadResourceElements (
65 ACPI_PARSE_OBJECT
*Op
,
66 ACPI_WALK_STATE
*WalkState
);
70 ACPI_PARSE_OBJECT
*Op
,
76 ACPI_PARSE_OBJECT
*Op
,
81 LdCommonNamespaceEnd (
82 ACPI_PARSE_OBJECT
*Op
,
87 /*******************************************************************************
89 * FUNCTION: LdLoadNamespace
91 * PARAMETERS: RootOp - Root of the parse tree
95 * DESCRIPTION: Perform a walk of the parse tree that in turn loads all of the
96 * named ASL/AML objects into the namespace. The namespace is
97 * constructed in order to resolve named references and references
98 * to named fields within resource templates/descriptors.
100 ******************************************************************************/
104 ACPI_PARSE_OBJECT
*RootOp
)
106 ACPI_WALK_STATE
*WalkState
;
109 DbgPrint (ASL_DEBUG_OUTPUT
, "\nCreating namespace\n\n");
111 /* Create a new walk state */
113 WalkState
= AcpiDsCreateWalkState (0, NULL
, NULL
, NULL
);
116 return (AE_NO_MEMORY
);
119 /* Walk the entire parse tree, first pass */
121 TrWalkParseTree (RootOp
, ASL_WALK_VISIT_TWICE
, LdNamespace1Begin
,
122 LdCommonNamespaceEnd
, WalkState
);
124 /* Second pass to handle forward references */
126 TrWalkParseTree (RootOp
, ASL_WALK_VISIT_TWICE
, LdNamespace2Begin
,
127 LdCommonNamespaceEnd
, WalkState
);
129 /* Dump the namespace if debug is enabled */
131 AcpiNsDumpTables (ACPI_NS_ALL
, ACPI_UINT32_MAX
);
136 /*******************************************************************************
138 * FUNCTION: LdLoadFieldElements
140 * PARAMETERS: Op - Parent node (Field)
141 * WalkState - Current walk state
145 * DESCRIPTION: Enter the named elements of the field (children of the parent)
146 * into the namespace.
148 ******************************************************************************/
151 LdLoadFieldElements (
152 ACPI_PARSE_OBJECT
*Op
,
153 ACPI_WALK_STATE
*WalkState
)
155 ACPI_PARSE_OBJECT
*Child
= NULL
;
156 ACPI_NAMESPACE_NODE
*Node
;
160 /* Get the first named field element */
162 switch (Op
->Asl
.AmlOpcode
)
164 case AML_BANK_FIELD_OP
:
166 Child
= UtGetArg (Op
, 6);
169 case AML_INDEX_FIELD_OP
:
171 Child
= UtGetArg (Op
, 5);
176 Child
= UtGetArg (Op
, 4);
181 /* No other opcodes should arrive here */
183 return (AE_BAD_PARAMETER
);
186 /* Enter all elements into the namespace */
190 switch (Child
->Asl
.AmlOpcode
)
192 case AML_INT_RESERVEDFIELD_OP
:
193 case AML_INT_ACCESSFIELD_OP
:
194 case AML_INT_CONNECTION_OP
:
199 Status
= AcpiNsLookup (WalkState
->ScopeInfo
,
200 Child
->Asl
.Value
.String
,
201 ACPI_TYPE_LOCAL_REGION_FIELD
,
202 ACPI_IMODE_LOAD_PASS1
,
203 ACPI_NS_NO_UPSEARCH
| ACPI_NS_DONT_OPEN_SCOPE
|
204 ACPI_NS_ERROR_IF_FOUND
,
206 if (ACPI_FAILURE (Status
))
208 if (Status
!= AE_ALREADY_EXISTS
)
210 AslError (ASL_ERROR
, ASL_MSG_CORE_EXCEPTION
, Child
,
211 Child
->Asl
.Value
.String
);
216 * The name already exists in this scope
217 * But continue processing the elements
219 AslError (ASL_ERROR
, ASL_MSG_NAME_EXISTS
, Child
,
220 Child
->Asl
.Value
.String
);
224 Child
->Asl
.Node
= Node
;
230 Child
= Child
->Asl
.Next
;
237 /*******************************************************************************
239 * FUNCTION: LdLoadResourceElements
241 * PARAMETERS: Op - Parent node (Resource Descriptor)
242 * WalkState - Current walk state
246 * DESCRIPTION: Enter the named elements of the resource descriptor (children
247 * of the parent) into the namespace.
249 * NOTE: In the real AML namespace, these named elements never exist. But
250 * we simply use the namespace here as a symbol table so we can look
251 * them up as they are referenced.
253 ******************************************************************************/
256 LdLoadResourceElements (
257 ACPI_PARSE_OBJECT
*Op
,
258 ACPI_WALK_STATE
*WalkState
)
260 ACPI_PARSE_OBJECT
*InitializerOp
= NULL
;
261 ACPI_NAMESPACE_NODE
*Node
;
266 * Enter the resource name into the namespace. Name must not already exist.
267 * This opens a scope, so later field names are guaranteed to be new/unique.
269 Status
= AcpiNsLookup (WalkState
->ScopeInfo
, Op
->Asl
.Namepath
,
270 ACPI_TYPE_LOCAL_RESOURCE
, ACPI_IMODE_LOAD_PASS1
,
271 ACPI_NS_NO_UPSEARCH
| ACPI_NS_ERROR_IF_FOUND
,
273 if (ACPI_FAILURE (Status
))
275 if (Status
== AE_ALREADY_EXISTS
)
277 /* Actual node causing the error was saved in ParentMethod */
279 AslError (ASL_ERROR
, ASL_MSG_NAME_EXISTS
,
280 (ACPI_PARSE_OBJECT
*) Op
->Asl
.ParentMethod
, Op
->Asl
.Namepath
);
286 Node
->Value
= (UINT32
) Op
->Asl
.Value
.Integer
;
291 * Now enter the predefined fields, for easy lookup when referenced
294 InitializerOp
= ASL_GET_CHILD_NODE (Op
);
295 while (InitializerOp
)
297 if (InitializerOp
->Asl
.ExternalName
)
299 Status
= AcpiNsLookup (WalkState
->ScopeInfo
,
300 InitializerOp
->Asl
.ExternalName
,
301 ACPI_TYPE_LOCAL_RESOURCE_FIELD
,
302 ACPI_IMODE_LOAD_PASS1
,
303 ACPI_NS_NO_UPSEARCH
| ACPI_NS_DONT_OPEN_SCOPE
,
305 if (ACPI_FAILURE (Status
))
311 * Store the field offset and length in the namespace node
312 * so it can be used when the field is referenced
314 Node
->Value
= InitializerOp
->Asl
.Value
.Tag
.BitOffset
;
315 Node
->Length
= InitializerOp
->Asl
.Value
.Tag
.BitLength
;
316 InitializerOp
->Asl
.Node
= Node
;
317 Node
->Op
= InitializerOp
;
320 InitializerOp
= ASL_GET_PEER_NODE (InitializerOp
);
327 /*******************************************************************************
329 * FUNCTION: LdNamespace1Begin
331 * PARAMETERS: ASL_WALK_CALLBACK
335 * DESCRIPTION: Descending callback used during the parse tree walk. If this
336 * is a named AML opcode, enter into the namespace
338 ******************************************************************************/
342 ACPI_PARSE_OBJECT
*Op
,
346 ACPI_WALK_STATE
*WalkState
= (ACPI_WALK_STATE
*) Context
;
347 ACPI_NAMESPACE_NODE
*Node
;
349 ACPI_OBJECT_TYPE ObjectType
;
350 ACPI_OBJECT_TYPE ActualObjectType
= ACPI_TYPE_ANY
;
352 UINT32 Flags
= ACPI_NS_NO_UPSEARCH
;
353 ACPI_PARSE_OBJECT
*Arg
;
355 BOOLEAN ForceNewScope
= FALSE
;
358 ACPI_FUNCTION_NAME (LdNamespace1Begin
);
359 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH
, "Op %p [%s]\n",
360 Op
, Op
->Asl
.ParseOpName
));
364 * We are only interested in opcodes that have an associated name
365 * (or multiple names)
367 switch (Op
->Asl
.AmlOpcode
)
369 case AML_BANK_FIELD_OP
:
370 case AML_INDEX_FIELD_OP
:
373 Status
= LdLoadFieldElements (Op
, WalkState
);
378 /* All other opcodes go below */
383 /* Check if this object has already been installed in the namespace */
390 Path
= Op
->Asl
.Namepath
;
396 /* Map the raw opcode into an internal object type */
398 switch (Op
->Asl
.ParseOpcode
)
402 Arg
= Op
->Asl
.Child
; /* Get the NameSeg/NameString node */
403 Arg
= Arg
->Asl
.Next
; /* First peer is the object to be associated with the name */
406 * If this name refers to a ResourceTemplate, we will need to open
407 * a new scope so that the resource subfield names can be entered into
408 * the namespace underneath this name
410 if (Op
->Asl
.CompileFlags
& NODE_IS_RESOURCE_DESC
)
412 ForceNewScope
= TRUE
;
415 /* Get the data type associated with the named object, not the name itself */
417 /* Log2 loop to convert from Btype (binary) to Etype (encoded) */
420 for (i
= 1; i
< Arg
->Asl
.AcpiBtype
; i
*= 2)
427 case PARSEOP_EXTERNAL
:
429 * "External" simply enters a name and type into the namespace.
430 * We must be careful to not open a new scope, however, no matter
431 * what type the external name refers to (e.g., a method)
433 * first child is name, next child is ObjectType
435 ActualObjectType
= (UINT8
) Op
->Asl
.Child
->Asl
.Next
->Asl
.Value
.Integer
;
436 ObjectType
= ACPI_TYPE_ANY
;
439 * We will mark every new node along the path as "External". This
440 * allows some or all of the nodes to be created later in the ASL
441 * code. Handles cases like this:
443 * External (\_SB_.PCI0.ABCD, IntObj)
452 * Store (\_SB_.PCI0.ABCD, Local0)
455 Flags
|= ACPI_NS_EXTERNAL
;
458 case PARSEOP_DEFAULT_ARG
:
460 if (Op
->Asl
.CompileFlags
== NODE_IS_RESOURCE_DESC
)
462 Status
= LdLoadResourceElements (Op
, WalkState
);
463 return_ACPI_STATUS (Status
);
466 ObjectType
= AslMapNamedOpcodeToDataType (Op
->Asl
.AmlOpcode
);
472 * The name referenced by Scope(Name) must already exist at this point.
473 * In other words, forward references for Scope() are not supported.
474 * The only real reason for this is that the MS interpreter cannot
475 * handle this case. Perhaps someday this case can go away.
477 Status
= AcpiNsLookup (WalkState
->ScopeInfo
, Path
, ACPI_TYPE_ANY
,
478 ACPI_IMODE_EXECUTE
, ACPI_NS_SEARCH_PARENT
,
480 if (ACPI_FAILURE (Status
))
482 if (Status
== AE_NOT_FOUND
)
484 /* The name was not found, go ahead and create it */
486 Status
= AcpiNsLookup (WalkState
->ScopeInfo
, Path
,
487 ACPI_TYPE_LOCAL_SCOPE
,
488 ACPI_IMODE_LOAD_PASS1
, Flags
,
490 if (ACPI_FAILURE (Status
))
492 return_ACPI_STATUS (Status
);
496 * However, this is an error -- primarily because the MS
497 * interpreter can't handle a forward reference from the
500 AslError (ASL_ERROR
, ASL_MSG_NOT_FOUND
, Op
,
501 Op
->Asl
.ExternalName
);
502 AslError (ASL_ERROR
, ASL_MSG_SCOPE_FWD_REF
, Op
,
503 Op
->Asl
.ExternalName
);
507 AslCoreSubsystemError (Op
, Status
,
508 "Failure from namespace lookup", FALSE
);
510 return_ACPI_STATUS (Status
);
513 /* We found a node with this name, now check the type */
517 case ACPI_TYPE_LOCAL_SCOPE
:
518 case ACPI_TYPE_DEVICE
:
519 case ACPI_TYPE_POWER
:
520 case ACPI_TYPE_PROCESSOR
:
521 case ACPI_TYPE_THERMAL
:
523 /* These are acceptable types - they all open a new scope */
526 case ACPI_TYPE_INTEGER
:
527 case ACPI_TYPE_STRING
:
528 case ACPI_TYPE_BUFFER
:
530 * These types we will allow, but we will change the type.
531 * This enables some existing code of the form:
534 * Scope (DEB) { ... }
536 * Which is used to workaround the fact that the MS interpreter
537 * does not allow Scope() forward references.
539 sprintf (MsgBuffer
, "%s [%s], changing type to [Scope]",
540 Op
->Asl
.ExternalName
, AcpiUtGetTypeName (Node
->Type
));
541 AslError (ASL_REMARK
, ASL_MSG_SCOPE_TYPE
, Op
, MsgBuffer
);
543 /* Switch the type to scope, open the new scope */
545 Node
->Type
= ACPI_TYPE_LOCAL_SCOPE
;
546 Status
= AcpiDsScopeStackPush (Node
, ACPI_TYPE_LOCAL_SCOPE
,
548 if (ACPI_FAILURE (Status
))
550 return_ACPI_STATUS (Status
);
556 /* All other types are an error */
558 sprintf (MsgBuffer
, "%s [%s]", Op
->Asl
.ExternalName
,
559 AcpiUtGetTypeName (Node
->Type
));
560 AslError (ASL_ERROR
, ASL_MSG_SCOPE_TYPE
, Op
, MsgBuffer
);
563 * However, switch the type to be an actual scope so
564 * that compilation can continue without generating a whole
565 * cascade of additional errors. Open the new scope.
567 Node
->Type
= ACPI_TYPE_LOCAL_SCOPE
;
568 Status
= AcpiDsScopeStackPush (Node
, ACPI_TYPE_LOCAL_SCOPE
,
570 if (ACPI_FAILURE (Status
))
572 return_ACPI_STATUS (Status
);
583 ObjectType
= AslMapNamedOpcodeToDataType (Op
->Asl
.AmlOpcode
);
588 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH
, "Loading name: %s, (%s)\n",
589 Op
->Asl
.ExternalName
, AcpiUtGetTypeName (ObjectType
)));
591 /* The name must not already exist */
593 Flags
|= ACPI_NS_ERROR_IF_FOUND
;
596 * Enter the named type into the internal namespace. We enter the name
597 * as we go downward in the parse tree. Any necessary subobjects that
598 * involve arguments to the opcode must be created as we go back up the
601 Status
= AcpiNsLookup (WalkState
->ScopeInfo
, Path
, ObjectType
,
602 ACPI_IMODE_LOAD_PASS1
, Flags
, WalkState
, &Node
);
603 if (ACPI_FAILURE (Status
))
605 if (Status
== AE_ALREADY_EXISTS
)
607 /* The name already exists in this scope */
609 if (Node
->Type
== ACPI_TYPE_LOCAL_SCOPE
)
611 /* Allow multiple references to the same scope */
613 Node
->Type
= (UINT8
) ObjectType
;
616 else if ((Node
->Flags
& ANOBJ_IS_EXTERNAL
) &&
617 (Op
->Asl
.ParseOpcode
!= PARSEOP_EXTERNAL
))
620 * Allow one create on an object or segment that was
621 * previously declared External
623 Node
->Flags
&= ~ANOBJ_IS_EXTERNAL
;
624 Node
->Type
= (UINT8
) ObjectType
;
626 /* Just retyped a node, probably will need to open a scope */
628 if (AcpiNsOpensScope (ObjectType
))
630 Status
= AcpiDsScopeStackPush (Node
, ObjectType
, WalkState
);
631 if (ACPI_FAILURE (Status
))
633 return_ACPI_STATUS (Status
);
640 /* Valid error, object already exists */
642 AslError (ASL_ERROR
, ASL_MSG_NAME_EXISTS
, Op
,
643 Op
->Asl
.ExternalName
);
644 return_ACPI_STATUS (AE_OK
);
649 AslCoreSubsystemError (Op
, Status
,
650 "Failure from namespace lookup", FALSE
);
651 return_ACPI_STATUS (Status
);
657 Status
= AcpiDsScopeStackPush (Node
, ObjectType
, WalkState
);
658 if (ACPI_FAILURE (Status
))
660 return_ACPI_STATUS (Status
);
666 * Point the parse node to the new namespace node, and point
667 * the Node back to the original Parse node
672 /* Set the actual data type if appropriate (EXTERNAL term only) */
674 if (ActualObjectType
!= ACPI_TYPE_ANY
)
676 Node
->Type
= (UINT8
) ActualObjectType
;
677 Node
->Value
= ASL_EXTERNAL_METHOD
;
680 if (Op
->Asl
.ParseOpcode
== PARSEOP_METHOD
)
683 * Get the method argument count from "Extra" and save
684 * it in the namespace node
686 Node
->Value
= (UINT32
) Op
->Asl
.Extra
;
689 return_ACPI_STATUS (Status
);
693 /*******************************************************************************
695 * FUNCTION: LdNamespace2Begin
697 * PARAMETERS: ASL_WALK_CALLBACK
701 * DESCRIPTION: Descending callback used during the pass 2 parse tree walk.
702 * Second pass resolves some forward references.
705 * Currently only needs to handle the Alias operator.
706 * Could be used to allow forward references from the Scope() operator, but
707 * the MS interpreter does not allow this, so this compiler does not either.
709 ******************************************************************************/
713 ACPI_PARSE_OBJECT
*Op
,
717 ACPI_WALK_STATE
*WalkState
= (ACPI_WALK_STATE
*) Context
;
719 ACPI_NAMESPACE_NODE
*Node
;
720 ACPI_OBJECT_TYPE ObjectType
;
721 BOOLEAN ForceNewScope
= FALSE
;
722 ACPI_PARSE_OBJECT
*Arg
;
724 ACPI_NAMESPACE_NODE
*TargetNode
;
727 ACPI_FUNCTION_NAME (LdNamespace2Begin
);
728 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH
, "Op %p [%s]\n",
729 Op
, Op
->Asl
.ParseOpName
));
732 /* Ignore Ops with no namespace node */
740 /* Get the type to determine if we should push the scope */
742 if ((Op
->Asl
.ParseOpcode
== PARSEOP_DEFAULT_ARG
) &&
743 (Op
->Asl
.CompileFlags
== NODE_IS_RESOURCE_DESC
))
745 ObjectType
= ACPI_TYPE_LOCAL_RESOURCE
;
749 ObjectType
= AslMapNamedOpcodeToDataType (Op
->Asl
.AmlOpcode
);
752 /* Push scope for Resource Templates */
754 if (Op
->Asl
.ParseOpcode
== PARSEOP_NAME
)
756 if (Op
->Asl
.CompileFlags
& NODE_IS_RESOURCE_DESC
)
758 ForceNewScope
= TRUE
;
762 /* Push the scope stack */
764 if (ForceNewScope
|| AcpiNsOpensScope (ObjectType
))
766 Status
= AcpiDsScopeStackPush (Node
, ObjectType
, WalkState
);
767 if (ACPI_FAILURE (Status
))
769 return_ACPI_STATUS (Status
);
773 if (Op
->Asl
.ParseOpcode
== PARSEOP_ALIAS
)
775 /* Complete the alias node by getting and saving the target node */
777 /* First child is the alias target */
781 /* Get the target pathname */
783 Path
= Arg
->Asl
.Namepath
;
786 Status
= UtInternalizeName (Arg
->Asl
.ExternalName
, &Path
);
787 if (ACPI_FAILURE (Status
))
793 /* Get the NS node associated with the target. It must exist. */
795 Status
= AcpiNsLookup (WalkState
->ScopeInfo
, Path
, ACPI_TYPE_ANY
,
796 ACPI_IMODE_EXECUTE
, ACPI_NS_SEARCH_PARENT
| ACPI_NS_DONT_OPEN_SCOPE
,
797 WalkState
, &TargetNode
);
798 if (ACPI_FAILURE (Status
))
800 if (Status
== AE_NOT_FOUND
)
802 AslError (ASL_ERROR
, ASL_MSG_NOT_FOUND
, Op
,
803 Op
->Asl
.ExternalName
);
806 * The name was not found, go ahead and create it.
807 * This prevents more errors later.
809 Status
= AcpiNsLookup (WalkState
->ScopeInfo
, Path
,
811 ACPI_IMODE_LOAD_PASS1
, ACPI_NS_NO_UPSEARCH
,
816 AslCoreSubsystemError (Op
, Status
,
817 "Failure from namespace lookup", FALSE
);
821 /* Save the target node within the alias node */
823 Node
->Object
= ACPI_CAST_PTR (ACPI_OPERAND_OBJECT
, TargetNode
);
830 /*******************************************************************************
832 * FUNCTION: LdCommonNamespaceEnd
834 * PARAMETERS: ASL_WALK_CALLBACK
838 * DESCRIPTION: Ascending callback used during the loading of the namespace,
839 * We only need to worry about managing the scope stack here.
841 ******************************************************************************/
844 LdCommonNamespaceEnd (
845 ACPI_PARSE_OBJECT
*Op
,
849 ACPI_WALK_STATE
*WalkState
= (ACPI_WALK_STATE
*) Context
;
850 ACPI_OBJECT_TYPE ObjectType
;
851 BOOLEAN ForceNewScope
= FALSE
;
854 ACPI_FUNCTION_NAME (LdCommonNamespaceEnd
);
857 /* We are only interested in opcodes that have an associated name */
859 if (!Op
->Asl
.Namepath
)
864 /* Get the type to determine if we should pop the scope */
866 if ((Op
->Asl
.ParseOpcode
== PARSEOP_DEFAULT_ARG
) &&
867 (Op
->Asl
.CompileFlags
== NODE_IS_RESOURCE_DESC
))
869 /* TBD: Merge into AcpiDsMapNamedOpcodeToDataType */
871 ObjectType
= ACPI_TYPE_LOCAL_RESOURCE
;
875 ObjectType
= AslMapNamedOpcodeToDataType (Op
->Asl
.AmlOpcode
);
878 /* Pop scope that was pushed for Resource Templates */
880 if (Op
->Asl
.ParseOpcode
== PARSEOP_NAME
)
882 if (Op
->Asl
.CompileFlags
& NODE_IS_RESOURCE_DESC
)
884 ForceNewScope
= TRUE
;
888 /* Pop the scope stack */
890 if (ForceNewScope
|| AcpiNsOpensScope (ObjectType
))
892 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH
,
893 "(%s): Popping scope for Op [%s] %p\n",
894 AcpiUtGetTypeName (ObjectType
), Op
->Asl
.ParseOpName
, Op
));
896 (void) AcpiDsScopeStackPop (WalkState
);