10d02842fSSascha Wildner /******************************************************************************
20d02842fSSascha Wildner  *
30d02842fSSascha Wildner  * Module Name: nsparse - namespace interface to AML parser
40d02842fSSascha Wildner  *
50d02842fSSascha Wildner  *****************************************************************************/
60d02842fSSascha Wildner 
7b4315fc7SSascha Wildner /******************************************************************************
8b4315fc7SSascha Wildner  *
9b4315fc7SSascha Wildner  * 1. Copyright Notice
10b4315fc7SSascha Wildner  *
11*383048acSSascha Wildner  * Some or all of this work - Copyright (c) 1999 - 2021, Intel Corp.
120d02842fSSascha Wildner  * All rights reserved.
130d02842fSSascha Wildner  *
14b4315fc7SSascha Wildner  * 2. License
15b4315fc7SSascha Wildner  *
16b4315fc7SSascha Wildner  * 2.1. This is your license from Intel Corp. under its intellectual property
17b4315fc7SSascha Wildner  * rights. You may have additional license terms from the party that provided
18b4315fc7SSascha Wildner  * you this software, covering your right to use that party's intellectual
19b4315fc7SSascha Wildner  * property rights.
20b4315fc7SSascha Wildner  *
21b4315fc7SSascha Wildner  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22b4315fc7SSascha Wildner  * copy of the source code appearing in this file ("Covered Code") an
23b4315fc7SSascha Wildner  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24b4315fc7SSascha Wildner  * base code distributed originally by Intel ("Original Intel Code") to copy,
25b4315fc7SSascha Wildner  * make derivatives, distribute, use and display any portion of the Covered
26b4315fc7SSascha Wildner  * Code in any form, with the right to sublicense such rights; and
27b4315fc7SSascha Wildner  *
28b4315fc7SSascha Wildner  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29b4315fc7SSascha Wildner  * license (with the right to sublicense), under only those claims of Intel
30b4315fc7SSascha Wildner  * patents that are infringed by the Original Intel Code, to make, use, sell,
31b4315fc7SSascha Wildner  * offer to sell, and import the Covered Code and derivative works thereof
32b4315fc7SSascha Wildner  * solely to the minimum extent necessary to exercise the above copyright
33b4315fc7SSascha Wildner  * license, and in no event shall the patent license extend to any additions
34b4315fc7SSascha Wildner  * to or modifications of the Original Intel Code. No other license or right
35b4315fc7SSascha Wildner  * is granted directly or by implication, estoppel or otherwise;
36b4315fc7SSascha Wildner  *
37b4315fc7SSascha Wildner  * The above copyright and patent license is granted only if the following
38b4315fc7SSascha Wildner  * conditions are met:
39b4315fc7SSascha Wildner  *
40b4315fc7SSascha Wildner  * 3. Conditions
41b4315fc7SSascha Wildner  *
42b4315fc7SSascha Wildner  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43b4315fc7SSascha Wildner  * Redistribution of source code of any substantial portion of the Covered
44b4315fc7SSascha Wildner  * Code or modification with rights to further distribute source must include
45b4315fc7SSascha Wildner  * the above Copyright Notice, the above License, this list of Conditions,
46b4315fc7SSascha Wildner  * and the following Disclaimer and Export Compliance provision. In addition,
47b4315fc7SSascha Wildner  * Licensee must cause all Covered Code to which Licensee contributes to
48b4315fc7SSascha Wildner  * contain a file documenting the changes Licensee made to create that Covered
49b4315fc7SSascha Wildner  * Code and the date of any change. Licensee must include in that file the
50b4315fc7SSascha Wildner  * documentation of any changes made by any predecessor Licensee. Licensee
51b4315fc7SSascha Wildner  * must include a prominent statement that the modification is derived,
52b4315fc7SSascha Wildner  * directly or indirectly, from Original Intel Code.
53b4315fc7SSascha Wildner  *
54b4315fc7SSascha Wildner  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55b4315fc7SSascha Wildner  * Redistribution of source code of any substantial portion of the Covered
56b4315fc7SSascha Wildner  * Code or modification without rights to further distribute source must
57b4315fc7SSascha Wildner  * include the following Disclaimer and Export Compliance provision in the
58b4315fc7SSascha Wildner  * documentation and/or other materials provided with distribution. In
59b4315fc7SSascha Wildner  * addition, Licensee may not authorize further sublicense of source of any
60b4315fc7SSascha Wildner  * portion of the Covered Code, and must include terms to the effect that the
61b4315fc7SSascha Wildner  * license from Licensee to its licensee is limited to the intellectual
62b4315fc7SSascha Wildner  * property embodied in the software Licensee provides to its licensee, and
63b4315fc7SSascha Wildner  * not to intellectual property embodied in modifications its licensee may
64b4315fc7SSascha Wildner  * make.
65b4315fc7SSascha Wildner  *
66b4315fc7SSascha Wildner  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67b4315fc7SSascha Wildner  * substantial portion of the Covered Code or modification must reproduce the
68b4315fc7SSascha Wildner  * above Copyright Notice, and the following Disclaimer and Export Compliance
69b4315fc7SSascha Wildner  * provision in the documentation and/or other materials provided with the
70b4315fc7SSascha Wildner  * distribution.
71b4315fc7SSascha Wildner  *
72b4315fc7SSascha Wildner  * 3.4. Intel retains all right, title, and interest in and to the Original
73b4315fc7SSascha Wildner  * Intel Code.
74b4315fc7SSascha Wildner  *
75b4315fc7SSascha Wildner  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76b4315fc7SSascha Wildner  * Intel shall be used in advertising or otherwise to promote the sale, use or
77b4315fc7SSascha Wildner  * other dealings in products derived from or relating to the Covered Code
78b4315fc7SSascha Wildner  * without prior written authorization from Intel.
79b4315fc7SSascha Wildner  *
80b4315fc7SSascha Wildner  * 4. Disclaimer and Export Compliance
81b4315fc7SSascha Wildner  *
82b4315fc7SSascha Wildner  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83b4315fc7SSascha Wildner  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84b4315fc7SSascha Wildner  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85b4315fc7SSascha Wildner  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86b4315fc7SSascha Wildner  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87b4315fc7SSascha Wildner  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88b4315fc7SSascha Wildner  * PARTICULAR PURPOSE.
89b4315fc7SSascha Wildner  *
90b4315fc7SSascha Wildner  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91b4315fc7SSascha Wildner  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92b4315fc7SSascha Wildner  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93b4315fc7SSascha Wildner  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94b4315fc7SSascha Wildner  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95b4315fc7SSascha Wildner  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96b4315fc7SSascha Wildner  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97b4315fc7SSascha Wildner  * LIMITED REMEDY.
98b4315fc7SSascha Wildner  *
99b4315fc7SSascha Wildner  * 4.3. Licensee shall not export, either directly or indirectly, any of this
100b4315fc7SSascha Wildner  * software or system incorporating such software without first obtaining any
101b4315fc7SSascha Wildner  * required license or other approval from the U. S. Department of Commerce or
102b4315fc7SSascha Wildner  * any other agency or department of the United States Government. In the
103b4315fc7SSascha Wildner  * event Licensee exports any such software from the United States or
104b4315fc7SSascha Wildner  * re-exports any such software from a foreign destination, Licensee shall
105b4315fc7SSascha Wildner  * ensure that the distribution and export/re-export of the software is in
106b4315fc7SSascha Wildner  * compliance with all laws, regulations, orders, or other restrictions of the
107b4315fc7SSascha Wildner  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108b4315fc7SSascha Wildner  * any of its subsidiaries will export/re-export any technical data, process,
109b4315fc7SSascha Wildner  * software, or service, directly or indirectly, to any country for which the
110b4315fc7SSascha Wildner  * United States government or any agency thereof requires an export license,
111b4315fc7SSascha Wildner  * other governmental approval, or letter of assurance, without first obtaining
112b4315fc7SSascha Wildner  * such license, approval or letter.
113b4315fc7SSascha Wildner  *
114b4315fc7SSascha Wildner  *****************************************************************************
115b4315fc7SSascha Wildner  *
116b4315fc7SSascha Wildner  * Alternatively, you may choose to be licensed under the terms of the
117b4315fc7SSascha Wildner  * following license:
118b4315fc7SSascha Wildner  *
1190d02842fSSascha Wildner  * Redistribution and use in source and binary forms, with or without
1200d02842fSSascha Wildner  * modification, are permitted provided that the following conditions
1210d02842fSSascha Wildner  * are met:
1220d02842fSSascha Wildner  * 1. Redistributions of source code must retain the above copyright
1230d02842fSSascha Wildner  *    notice, this list of conditions, and the following disclaimer,
1240d02842fSSascha Wildner  *    without modification.
1250d02842fSSascha Wildner  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
1260d02842fSSascha Wildner  *    substantially similar to the "NO WARRANTY" disclaimer below
1270d02842fSSascha Wildner  *    ("Disclaimer") and any redistribution must be conditioned upon
1280d02842fSSascha Wildner  *    including a substantially similar Disclaimer requirement for further
1290d02842fSSascha Wildner  *    binary redistribution.
1300d02842fSSascha Wildner  * 3. Neither the names of the above-listed copyright holders nor the names
1310d02842fSSascha Wildner  *    of any contributors may be used to endorse or promote products derived
1320d02842fSSascha Wildner  *    from this software without specific prior written permission.
1330d02842fSSascha Wildner  *
134b4315fc7SSascha Wildner  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135b4315fc7SSascha Wildner  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136b4315fc7SSascha Wildner  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137b4315fc7SSascha Wildner  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138b4315fc7SSascha Wildner  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139b4315fc7SSascha Wildner  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140b4315fc7SSascha Wildner  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141b4315fc7SSascha Wildner  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142b4315fc7SSascha Wildner  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143b4315fc7SSascha Wildner  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144b4315fc7SSascha Wildner  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145b4315fc7SSascha Wildner  *
146b4315fc7SSascha Wildner  * Alternatively, you may choose to be licensed under the terms of the
1470d02842fSSascha Wildner  * GNU General Public License ("GPL") version 2 as published by the Free
1480d02842fSSascha Wildner  * Software Foundation.
1490d02842fSSascha Wildner  *
150b4315fc7SSascha Wildner  *****************************************************************************/
1510d02842fSSascha Wildner 
1520d02842fSSascha Wildner #include "acpi.h"
1530d02842fSSascha Wildner #include "accommon.h"
1540d02842fSSascha Wildner #include "acnamesp.h"
1550d02842fSSascha Wildner #include "acparser.h"
1560d02842fSSascha Wildner #include "acdispat.h"
1570d02842fSSascha Wildner #include "actables.h"
158e5e174adSSascha Wildner #include "acinterp.h"
1590d02842fSSascha Wildner 
1600d02842fSSascha Wildner 
1610d02842fSSascha Wildner #define _COMPONENT          ACPI_NAMESPACE
1620d02842fSSascha Wildner         ACPI_MODULE_NAME    ("nsparse")
1630d02842fSSascha Wildner 
1640d02842fSSascha Wildner 
1650d02842fSSascha Wildner /*******************************************************************************
1660d02842fSSascha Wildner  *
167e5e174adSSascha Wildner  * FUNCTION:    NsExecuteTable
168e5e174adSSascha Wildner  *
169e5e174adSSascha Wildner  * PARAMETERS:  TableDesc       - An ACPI table descriptor for table to parse
170e5e174adSSascha Wildner  *              StartNode       - Where to enter the table into the namespace
171e5e174adSSascha Wildner  *
172e5e174adSSascha Wildner  * RETURN:      Status
173e5e174adSSascha Wildner  *
1747bcb6cafSSascha Wildner  * DESCRIPTION: Load ACPI/AML table by executing the entire table as a single
1757bcb6cafSSascha Wildner  *              large control method.
1767bcb6cafSSascha Wildner  *
1777bcb6cafSSascha Wildner  * NOTE: The point of this is to execute any module-level code in-place
1787bcb6cafSSascha Wildner  * as the table is parsed. Some AML code depends on this behavior.
1797bcb6cafSSascha Wildner  *
1807bcb6cafSSascha Wildner  * It is a run-time option at this time, but will eventually become
1817bcb6cafSSascha Wildner  * the default.
1827bcb6cafSSascha Wildner  *
1837bcb6cafSSascha Wildner  * Note: This causes the table to only have a single-pass parse.
1847bcb6cafSSascha Wildner  * However, this is compatible with other ACPI implementations.
185e5e174adSSascha Wildner  *
186e5e174adSSascha Wildner  ******************************************************************************/
187e5e174adSSascha Wildner 
188e5e174adSSascha Wildner ACPI_STATUS
AcpiNsExecuteTable(UINT32 TableIndex,ACPI_NAMESPACE_NODE * StartNode)189e5e174adSSascha Wildner AcpiNsExecuteTable (
190e5e174adSSascha Wildner     UINT32                  TableIndex,
191e5e174adSSascha Wildner     ACPI_NAMESPACE_NODE     *StartNode)
192e5e174adSSascha Wildner {
193e5e174adSSascha Wildner     ACPI_STATUS             Status;
194e5e174adSSascha Wildner     ACPI_TABLE_HEADER       *Table;
195e5e174adSSascha Wildner     ACPI_OWNER_ID           OwnerId;
196e5e174adSSascha Wildner     ACPI_EVALUATE_INFO      *Info = NULL;
197e5e174adSSascha Wildner     UINT32                  AmlLength;
198e5e174adSSascha Wildner     UINT8                   *AmlStart;
199e5e174adSSascha Wildner     ACPI_OPERAND_OBJECT     *MethodObj = NULL;
200e5e174adSSascha Wildner 
201e5e174adSSascha Wildner 
202e5e174adSSascha Wildner     ACPI_FUNCTION_TRACE (NsExecuteTable);
203e5e174adSSascha Wildner 
204e5e174adSSascha Wildner 
205e5e174adSSascha Wildner     Status = AcpiGetTableByIndex (TableIndex, &Table);
206e5e174adSSascha Wildner     if (ACPI_FAILURE (Status))
207e5e174adSSascha Wildner     {
208e5e174adSSascha Wildner         return_ACPI_STATUS (Status);
209e5e174adSSascha Wildner     }
210e5e174adSSascha Wildner 
211e5e174adSSascha Wildner     /* Table must consist of at least a complete header */
212e5e174adSSascha Wildner 
213e5e174adSSascha Wildner     if (Table->Length < sizeof (ACPI_TABLE_HEADER))
214e5e174adSSascha Wildner     {
215e5e174adSSascha Wildner         return_ACPI_STATUS (AE_BAD_HEADER);
216e5e174adSSascha Wildner     }
217e5e174adSSascha Wildner 
218e5e174adSSascha Wildner     AmlStart = (UINT8 *) Table + sizeof (ACPI_TABLE_HEADER);
219e5e174adSSascha Wildner     AmlLength = Table->Length - sizeof (ACPI_TABLE_HEADER);
220e5e174adSSascha Wildner 
221e5e174adSSascha Wildner     Status = AcpiTbGetOwnerId (TableIndex, &OwnerId);
222e5e174adSSascha Wildner     if (ACPI_FAILURE (Status))
223e5e174adSSascha Wildner     {
224e5e174adSSascha Wildner         return_ACPI_STATUS (Status);
225e5e174adSSascha Wildner     }
226e5e174adSSascha Wildner 
227e5e174adSSascha Wildner     /* Create, initialize, and link a new temporary method object */
228e5e174adSSascha Wildner 
229e5e174adSSascha Wildner     MethodObj = AcpiUtCreateInternalObject (ACPI_TYPE_METHOD);
230e5e174adSSascha Wildner     if (!MethodObj)
231e5e174adSSascha Wildner     {
232e5e174adSSascha Wildner         return_ACPI_STATUS (AE_NO_MEMORY);
233e5e174adSSascha Wildner     }
234e5e174adSSascha Wildner 
235e5e174adSSascha Wildner     /* Allocate the evaluation information block */
236e5e174adSSascha Wildner 
237e5e174adSSascha Wildner     Info = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_EVALUATE_INFO));
238e5e174adSSascha Wildner     if (!Info)
239e5e174adSSascha Wildner     {
240e5e174adSSascha Wildner         Status = AE_NO_MEMORY;
241e5e174adSSascha Wildner         goto Cleanup;
242e5e174adSSascha Wildner     }
243e5e174adSSascha Wildner 
2447bcb6cafSSascha Wildner     ACPI_DEBUG_PRINT_RAW ((ACPI_DB_PARSE,
2457bcb6cafSSascha Wildner         "%s: Create table pseudo-method for [%4.4s] @%p, method %p\n",
2467bcb6cafSSascha Wildner         ACPI_GET_FUNCTION_NAME, Table->Signature, Table, MethodObj));
247e5e174adSSascha Wildner 
248e5e174adSSascha Wildner     MethodObj->Method.AmlStart = AmlStart;
249e5e174adSSascha Wildner     MethodObj->Method.AmlLength = AmlLength;
250e5e174adSSascha Wildner     MethodObj->Method.OwnerId = OwnerId;
251e5e174adSSascha Wildner     MethodObj->Method.InfoFlags |= ACPI_METHOD_MODULE_LEVEL;
252e5e174adSSascha Wildner 
253e5e174adSSascha Wildner     Info->PassNumber = ACPI_IMODE_EXECUTE;
254e5e174adSSascha Wildner     Info->Node = StartNode;
255e5e174adSSascha Wildner     Info->ObjDesc = MethodObj;
256e5e174adSSascha Wildner     Info->NodeFlags = Info->Node->Flags;
257e5e174adSSascha Wildner     Info->FullPathname = AcpiNsGetNormalizedPathname (Info->Node, TRUE);
258e5e174adSSascha Wildner     if (!Info->FullPathname)
259e5e174adSSascha Wildner     {
260e5e174adSSascha Wildner         Status = AE_NO_MEMORY;
261e5e174adSSascha Wildner         goto Cleanup;
262e5e174adSSascha Wildner     }
263e5e174adSSascha Wildner 
264ef944814SSascha Wildner     /* Optional object evaluation log */
265ef944814SSascha Wildner 
266ef944814SSascha Wildner     ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EVALUATION,
267ef944814SSascha Wildner         "%-26s:  (Definition Block level)\n", "Module-level evaluation"));
268ef944814SSascha Wildner 
269e5e174adSSascha Wildner     Status = AcpiPsExecuteTable (Info);
270e5e174adSSascha Wildner 
271ef944814SSascha Wildner     /* Optional object evaluation log */
272ef944814SSascha Wildner 
273ef944814SSascha Wildner     ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EVALUATION,
274ef944814SSascha Wildner         "%-26s:  (Definition Block level)\n", "Module-level complete"));
275ef944814SSascha Wildner 
276e5e174adSSascha Wildner Cleanup:
277e5e174adSSascha Wildner     if (Info)
278e5e174adSSascha Wildner     {
279e5e174adSSascha Wildner         ACPI_FREE (Info->FullPathname);
280e5e174adSSascha Wildner         Info->FullPathname = NULL;
281e5e174adSSascha Wildner     }
282e5e174adSSascha Wildner     ACPI_FREE (Info);
283e5e174adSSascha Wildner     AcpiUtRemoveReference (MethodObj);
284e5e174adSSascha Wildner     return_ACPI_STATUS (Status);
285e5e174adSSascha Wildner }
286e5e174adSSascha Wildner 
287e5e174adSSascha Wildner 
288e5e174adSSascha Wildner /*******************************************************************************
289e5e174adSSascha Wildner  *
2900d02842fSSascha Wildner  * FUNCTION:    NsOneCompleteParse
2910d02842fSSascha Wildner  *
2920d02842fSSascha Wildner  * PARAMETERS:  PassNumber              - 1 or 2
2930d02842fSSascha Wildner  *              TableDesc               - The table to be parsed.
2940d02842fSSascha Wildner  *
2950d02842fSSascha Wildner  * RETURN:      Status
2960d02842fSSascha Wildner  *
2970d02842fSSascha Wildner  * DESCRIPTION: Perform one complete parse of an ACPI/AML table.
2980d02842fSSascha Wildner  *
2990d02842fSSascha Wildner  ******************************************************************************/
3000d02842fSSascha Wildner 
3010d02842fSSascha Wildner ACPI_STATUS
AcpiNsOneCompleteParse(UINT32 PassNumber,UINT32 TableIndex,ACPI_NAMESPACE_NODE * StartNode)3020d02842fSSascha Wildner AcpiNsOneCompleteParse (
3030d02842fSSascha Wildner     UINT32                  PassNumber,
3040d02842fSSascha Wildner     UINT32                  TableIndex,
3050d02842fSSascha Wildner     ACPI_NAMESPACE_NODE     *StartNode)
3060d02842fSSascha Wildner {
3070d02842fSSascha Wildner     ACPI_PARSE_OBJECT       *ParseRoot;
3080d02842fSSascha Wildner     ACPI_STATUS             Status;
3090d02842fSSascha Wildner     UINT32                  AmlLength;
3100d02842fSSascha Wildner     UINT8                   *AmlStart;
3110d02842fSSascha Wildner     ACPI_WALK_STATE         *WalkState;
3120d02842fSSascha Wildner     ACPI_TABLE_HEADER       *Table;
3130d02842fSSascha Wildner     ACPI_OWNER_ID           OwnerId;
3140d02842fSSascha Wildner 
3150d02842fSSascha Wildner 
3160d02842fSSascha Wildner     ACPI_FUNCTION_TRACE (NsOneCompleteParse);
3170d02842fSSascha Wildner 
3180d02842fSSascha Wildner 
319267c04fdSSascha Wildner     Status = AcpiGetTableByIndex (TableIndex, &Table);
320267c04fdSSascha Wildner     if (ACPI_FAILURE (Status))
321267c04fdSSascha Wildner     {
322267c04fdSSascha Wildner         return_ACPI_STATUS (Status);
323267c04fdSSascha Wildner     }
324267c04fdSSascha Wildner 
325267c04fdSSascha Wildner     /* Table must consist of at least a complete header */
326267c04fdSSascha Wildner 
327267c04fdSSascha Wildner     if (Table->Length < sizeof (ACPI_TABLE_HEADER))
328267c04fdSSascha Wildner     {
329267c04fdSSascha Wildner         return_ACPI_STATUS (AE_BAD_HEADER);
330267c04fdSSascha Wildner     }
331267c04fdSSascha Wildner 
332267c04fdSSascha Wildner     AmlStart = (UINT8 *) Table + sizeof (ACPI_TABLE_HEADER);
333267c04fdSSascha Wildner     AmlLength = Table->Length - sizeof (ACPI_TABLE_HEADER);
334267c04fdSSascha Wildner 
3350d02842fSSascha Wildner     Status = AcpiTbGetOwnerId (TableIndex, &OwnerId);
3360d02842fSSascha Wildner     if (ACPI_FAILURE (Status))
3370d02842fSSascha Wildner     {
3380d02842fSSascha Wildner         return_ACPI_STATUS (Status);
3390d02842fSSascha Wildner     }
3400d02842fSSascha Wildner 
3410d02842fSSascha Wildner     /* Create and init a Root Node */
3420d02842fSSascha Wildner 
343267c04fdSSascha Wildner     ParseRoot = AcpiPsCreateScopeOp (AmlStart);
3440d02842fSSascha Wildner     if (!ParseRoot)
3450d02842fSSascha Wildner     {
3460d02842fSSascha Wildner         return_ACPI_STATUS (AE_NO_MEMORY);
3470d02842fSSascha Wildner     }
3480d02842fSSascha Wildner 
3490d02842fSSascha Wildner     /* Create and initialize a new walk state */
3500d02842fSSascha Wildner 
3510d02842fSSascha Wildner     WalkState = AcpiDsCreateWalkState (OwnerId, NULL, NULL, NULL);
3520d02842fSSascha Wildner     if (!WalkState)
3530d02842fSSascha Wildner     {
3540d02842fSSascha Wildner         AcpiPsFreeOp (ParseRoot);
3550d02842fSSascha Wildner         return_ACPI_STATUS (AE_NO_MEMORY);
3560d02842fSSascha Wildner     }
3570d02842fSSascha Wildner 
358267c04fdSSascha Wildner     Status = AcpiDsInitAmlWalk (WalkState, ParseRoot, NULL,
359267c04fdSSascha Wildner         AmlStart, AmlLength, NULL, (UINT8) PassNumber);
3600d02842fSSascha Wildner     if (ACPI_FAILURE (Status))
3610d02842fSSascha Wildner     {
3620d02842fSSascha Wildner         AcpiDsDeleteWalkState (WalkState);
363267c04fdSSascha Wildner         goto Cleanup;
3640d02842fSSascha Wildner     }
3650d02842fSSascha Wildner 
36625ca8c79SSascha Wildner     /* Found OSDT table, enable the namespace override feature */
36725ca8c79SSascha Wildner 
368c1776041SSascha Wildner     if (ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_OSDT) &&
36925ca8c79SSascha Wildner         PassNumber == ACPI_IMODE_LOAD_PASS1)
37025ca8c79SSascha Wildner     {
37125ca8c79SSascha Wildner         WalkState->NamespaceOverride = TRUE;
37225ca8c79SSascha Wildner     }
37325ca8c79SSascha Wildner 
3740d02842fSSascha Wildner     /* StartNode is the default location to load the table  */
3750d02842fSSascha Wildner 
3760d02842fSSascha Wildner     if (StartNode && StartNode != AcpiGbl_RootNode)
3770d02842fSSascha Wildner     {
378820c5b08SSascha Wildner         Status = AcpiDsScopeStackPush (
379820c5b08SSascha Wildner             StartNode, ACPI_TYPE_METHOD, WalkState);
3800d02842fSSascha Wildner         if (ACPI_FAILURE (Status))
3810d02842fSSascha Wildner         {
3820d02842fSSascha Wildner             AcpiDsDeleteWalkState (WalkState);
3830d02842fSSascha Wildner             goto Cleanup;
3840d02842fSSascha Wildner         }
3850d02842fSSascha Wildner     }
3860d02842fSSascha Wildner 
3870d02842fSSascha Wildner     /* Parse the AML */
3880d02842fSSascha Wildner 
389820c5b08SSascha Wildner     ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
390820c5b08SSascha Wildner         "*PARSE* pass %u parse\n", PassNumber));
391e5e174adSSascha Wildner     AcpiExEnterInterpreter ();
3920d02842fSSascha Wildner     Status = AcpiPsParseAml (WalkState);
393e5e174adSSascha Wildner     AcpiExExitInterpreter ();
3940d02842fSSascha Wildner 
3950d02842fSSascha Wildner Cleanup:
3960d02842fSSascha Wildner     AcpiPsDeleteParseTree (ParseRoot);
3970d02842fSSascha Wildner     return_ACPI_STATUS (Status);
3980d02842fSSascha Wildner }
3990d02842fSSascha Wildner 
4000d02842fSSascha Wildner 
4010d02842fSSascha Wildner /*******************************************************************************
4020d02842fSSascha Wildner  *
4030d02842fSSascha Wildner  * FUNCTION:    AcpiNsParseTable
4040d02842fSSascha Wildner  *
4050d02842fSSascha Wildner  * PARAMETERS:  TableDesc       - An ACPI table descriptor for table to parse
4060d02842fSSascha Wildner  *              StartNode       - Where to enter the table into the namespace
4070d02842fSSascha Wildner  *
4080d02842fSSascha Wildner  * RETURN:      Status
4090d02842fSSascha Wildner  *
4100d02842fSSascha Wildner  * DESCRIPTION: Parse AML within an ACPI table and return a tree of ops
4110d02842fSSascha Wildner  *
4120d02842fSSascha Wildner  ******************************************************************************/
4130d02842fSSascha Wildner 
4140d02842fSSascha Wildner ACPI_STATUS
AcpiNsParseTable(UINT32 TableIndex,ACPI_NAMESPACE_NODE * StartNode)4150d02842fSSascha Wildner AcpiNsParseTable (
4160d02842fSSascha Wildner     UINT32                  TableIndex,
4170d02842fSSascha Wildner     ACPI_NAMESPACE_NODE     *StartNode)
4180d02842fSSascha Wildner {
4190d02842fSSascha Wildner     ACPI_STATUS             Status;
4200d02842fSSascha Wildner 
4210d02842fSSascha Wildner 
4220d02842fSSascha Wildner     ACPI_FUNCTION_TRACE (NsParseTable);
4230d02842fSSascha Wildner 
4240d02842fSSascha Wildner 
4257bcb6cafSSascha Wildner     /*
42600ffa116SSascha Wildner      * Executes the AML table as one large control method.
4277bcb6cafSSascha Wildner      * The point of this is to execute any module-level code in-place
4287bcb6cafSSascha Wildner      * as the table is parsed. Some AML code depends on this behavior.
4297bcb6cafSSascha Wildner      *
4307bcb6cafSSascha Wildner      * Note: This causes the table to only have a single-pass parse.
4317bcb6cafSSascha Wildner      * However, this is compatible with other ACPI implementations.
4327bcb6cafSSascha Wildner      */
4337bcb6cafSSascha Wildner     ACPI_DEBUG_PRINT_RAW ((ACPI_DB_PARSE,
4347bcb6cafSSascha Wildner         "%s: **** Start table execution pass\n", ACPI_GET_FUNCTION_NAME));
435e5e174adSSascha Wildner 
436e5e174adSSascha Wildner     Status = AcpiNsExecuteTable (TableIndex, StartNode);
4370d02842fSSascha Wildner 
4380d02842fSSascha Wildner     return_ACPI_STATUS (Status);
4390d02842fSSascha Wildner }
440