1*385cc6b4SJerry Jelinek /******************************************************************************
2*385cc6b4SJerry Jelinek *
3*385cc6b4SJerry Jelinek * Module Name: psobject - Support for parse objects
4*385cc6b4SJerry Jelinek *
5*385cc6b4SJerry Jelinek *****************************************************************************/
6*385cc6b4SJerry Jelinek
7*385cc6b4SJerry Jelinek /*
8*385cc6b4SJerry Jelinek * Copyright (C) 2000 - 2016, Intel Corp.
9*385cc6b4SJerry Jelinek * All rights reserved.
10*385cc6b4SJerry Jelinek *
11*385cc6b4SJerry Jelinek * Redistribution and use in source and binary forms, with or without
12*385cc6b4SJerry Jelinek * modification, are permitted provided that the following conditions
13*385cc6b4SJerry Jelinek * are met:
14*385cc6b4SJerry Jelinek * 1. Redistributions of source code must retain the above copyright
15*385cc6b4SJerry Jelinek * notice, this list of conditions, and the following disclaimer,
16*385cc6b4SJerry Jelinek * without modification.
17*385cc6b4SJerry Jelinek * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18*385cc6b4SJerry Jelinek * substantially similar to the "NO WARRANTY" disclaimer below
19*385cc6b4SJerry Jelinek * ("Disclaimer") and any redistribution must be conditioned upon
20*385cc6b4SJerry Jelinek * including a substantially similar Disclaimer requirement for further
21*385cc6b4SJerry Jelinek * binary redistribution.
22*385cc6b4SJerry Jelinek * 3. Neither the names of the above-listed copyright holders nor the names
23*385cc6b4SJerry Jelinek * of any contributors may be used to endorse or promote products derived
24*385cc6b4SJerry Jelinek * from this software without specific prior written permission.
25*385cc6b4SJerry Jelinek *
26*385cc6b4SJerry Jelinek * Alternatively, this software may be distributed under the terms of the
27*385cc6b4SJerry Jelinek * GNU General Public License ("GPL") version 2 as published by the Free
28*385cc6b4SJerry Jelinek * Software Foundation.
29*385cc6b4SJerry Jelinek *
30*385cc6b4SJerry Jelinek * NO WARRANTY
31*385cc6b4SJerry Jelinek * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32*385cc6b4SJerry Jelinek * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33*385cc6b4SJerry Jelinek * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34*385cc6b4SJerry Jelinek * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35*385cc6b4SJerry Jelinek * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36*385cc6b4SJerry Jelinek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37*385cc6b4SJerry Jelinek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38*385cc6b4SJerry Jelinek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39*385cc6b4SJerry Jelinek * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40*385cc6b4SJerry Jelinek * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41*385cc6b4SJerry Jelinek * POSSIBILITY OF SUCH DAMAGES.
42*385cc6b4SJerry Jelinek */
43*385cc6b4SJerry Jelinek
44*385cc6b4SJerry Jelinek #include "acpi.h"
45*385cc6b4SJerry Jelinek #include "accommon.h"
46*385cc6b4SJerry Jelinek #include "acparser.h"
47*385cc6b4SJerry Jelinek #include "amlcode.h"
48*385cc6b4SJerry Jelinek
49*385cc6b4SJerry Jelinek #define _COMPONENT ACPI_PARSER
50*385cc6b4SJerry Jelinek ACPI_MODULE_NAME ("psobject")
51*385cc6b4SJerry Jelinek
52*385cc6b4SJerry Jelinek
53*385cc6b4SJerry Jelinek /* Local prototypes */
54*385cc6b4SJerry Jelinek
55*385cc6b4SJerry Jelinek static ACPI_STATUS
56*385cc6b4SJerry Jelinek AcpiPsGetAmlOpcode (
57*385cc6b4SJerry Jelinek ACPI_WALK_STATE *WalkState);
58*385cc6b4SJerry Jelinek
59*385cc6b4SJerry Jelinek
60*385cc6b4SJerry Jelinek /*******************************************************************************
61*385cc6b4SJerry Jelinek *
62*385cc6b4SJerry Jelinek * FUNCTION: AcpiPsGetAmlOpcode
63*385cc6b4SJerry Jelinek *
64*385cc6b4SJerry Jelinek * PARAMETERS: WalkState - Current state
65*385cc6b4SJerry Jelinek *
66*385cc6b4SJerry Jelinek * RETURN: Status
67*385cc6b4SJerry Jelinek *
68*385cc6b4SJerry Jelinek * DESCRIPTION: Extract the next AML opcode from the input stream.
69*385cc6b4SJerry Jelinek *
70*385cc6b4SJerry Jelinek ******************************************************************************/
71*385cc6b4SJerry Jelinek
72*385cc6b4SJerry Jelinek static ACPI_STATUS
AcpiPsGetAmlOpcode(ACPI_WALK_STATE * WalkState)73*385cc6b4SJerry Jelinek AcpiPsGetAmlOpcode (
74*385cc6b4SJerry Jelinek ACPI_WALK_STATE *WalkState)
75*385cc6b4SJerry Jelinek {
76*385cc6b4SJerry Jelinek UINT32 AmlOffset;
77*385cc6b4SJerry Jelinek
78*385cc6b4SJerry Jelinek
79*385cc6b4SJerry Jelinek ACPI_FUNCTION_TRACE_PTR (PsGetAmlOpcode, WalkState);
80*385cc6b4SJerry Jelinek
81*385cc6b4SJerry Jelinek
82*385cc6b4SJerry Jelinek WalkState->Aml = WalkState->ParserState.Aml;
83*385cc6b4SJerry Jelinek WalkState->Opcode = AcpiPsPeekOpcode (&(WalkState->ParserState));
84*385cc6b4SJerry Jelinek
85*385cc6b4SJerry Jelinek /*
86*385cc6b4SJerry Jelinek * First cut to determine what we have found:
87*385cc6b4SJerry Jelinek * 1) A valid AML opcode
88*385cc6b4SJerry Jelinek * 2) A name string
89*385cc6b4SJerry Jelinek * 3) An unknown/invalid opcode
90*385cc6b4SJerry Jelinek */
91*385cc6b4SJerry Jelinek WalkState->OpInfo = AcpiPsGetOpcodeInfo (WalkState->Opcode);
92*385cc6b4SJerry Jelinek
93*385cc6b4SJerry Jelinek switch (WalkState->OpInfo->Class)
94*385cc6b4SJerry Jelinek {
95*385cc6b4SJerry Jelinek case AML_CLASS_ASCII:
96*385cc6b4SJerry Jelinek case AML_CLASS_PREFIX:
97*385cc6b4SJerry Jelinek /*
98*385cc6b4SJerry Jelinek * Starts with a valid prefix or ASCII char, this is a name
99*385cc6b4SJerry Jelinek * string. Convert the bare name string to a namepath.
100*385cc6b4SJerry Jelinek */
101*385cc6b4SJerry Jelinek WalkState->Opcode = AML_INT_NAMEPATH_OP;
102*385cc6b4SJerry Jelinek WalkState->ArgTypes = ARGP_NAMESTRING;
103*385cc6b4SJerry Jelinek break;
104*385cc6b4SJerry Jelinek
105*385cc6b4SJerry Jelinek case AML_CLASS_UNKNOWN:
106*385cc6b4SJerry Jelinek
107*385cc6b4SJerry Jelinek /* The opcode is unrecognized. Complain and skip unknown opcodes */
108*385cc6b4SJerry Jelinek
109*385cc6b4SJerry Jelinek if (WalkState->PassNumber == 2)
110*385cc6b4SJerry Jelinek {
111*385cc6b4SJerry Jelinek AmlOffset = (UINT32) ACPI_PTR_DIFF (WalkState->Aml,
112*385cc6b4SJerry Jelinek WalkState->ParserState.AmlStart);
113*385cc6b4SJerry Jelinek
114*385cc6b4SJerry Jelinek ACPI_ERROR ((AE_INFO,
115*385cc6b4SJerry Jelinek "Unknown opcode 0x%.2X at table offset 0x%.4X, ignoring",
116*385cc6b4SJerry Jelinek WalkState->Opcode,
117*385cc6b4SJerry Jelinek (UINT32) (AmlOffset + sizeof (ACPI_TABLE_HEADER))));
118*385cc6b4SJerry Jelinek
119*385cc6b4SJerry Jelinek ACPI_DUMP_BUFFER ((WalkState->ParserState.Aml - 16), 48);
120*385cc6b4SJerry Jelinek
121*385cc6b4SJerry Jelinek #ifdef ACPI_ASL_COMPILER
122*385cc6b4SJerry Jelinek /*
123*385cc6b4SJerry Jelinek * This is executed for the disassembler only. Output goes
124*385cc6b4SJerry Jelinek * to the disassembled ASL output file.
125*385cc6b4SJerry Jelinek */
126*385cc6b4SJerry Jelinek AcpiOsPrintf (
127*385cc6b4SJerry Jelinek "/*\nError: Unknown opcode 0x%.2X at table offset 0x%.4X, context:\n",
128*385cc6b4SJerry Jelinek WalkState->Opcode,
129*385cc6b4SJerry Jelinek (UINT32) (AmlOffset + sizeof (ACPI_TABLE_HEADER)));
130*385cc6b4SJerry Jelinek
131*385cc6b4SJerry Jelinek /* Dump the context surrounding the invalid opcode */
132*385cc6b4SJerry Jelinek
133*385cc6b4SJerry Jelinek AcpiUtDumpBuffer (((UINT8 *) WalkState->ParserState.Aml - 16),
134*385cc6b4SJerry Jelinek 48, DB_BYTE_DISPLAY,
135*385cc6b4SJerry Jelinek (AmlOffset + sizeof (ACPI_TABLE_HEADER) - 16));
136*385cc6b4SJerry Jelinek AcpiOsPrintf (" */\n");
137*385cc6b4SJerry Jelinek #endif
138*385cc6b4SJerry Jelinek }
139*385cc6b4SJerry Jelinek
140*385cc6b4SJerry Jelinek /* Increment past one-byte or two-byte opcode */
141*385cc6b4SJerry Jelinek
142*385cc6b4SJerry Jelinek WalkState->ParserState.Aml++;
143*385cc6b4SJerry Jelinek if (WalkState->Opcode > 0xFF) /* Can only happen if first byte is 0x5B */
144*385cc6b4SJerry Jelinek {
145*385cc6b4SJerry Jelinek WalkState->ParserState.Aml++;
146*385cc6b4SJerry Jelinek }
147*385cc6b4SJerry Jelinek
148*385cc6b4SJerry Jelinek return_ACPI_STATUS (AE_CTRL_PARSE_CONTINUE);
149*385cc6b4SJerry Jelinek
150*385cc6b4SJerry Jelinek default:
151*385cc6b4SJerry Jelinek
152*385cc6b4SJerry Jelinek /* Found opcode info, this is a normal opcode */
153*385cc6b4SJerry Jelinek
154*385cc6b4SJerry Jelinek WalkState->ParserState.Aml +=
155*385cc6b4SJerry Jelinek AcpiPsGetOpcodeSize (WalkState->Opcode);
156*385cc6b4SJerry Jelinek WalkState->ArgTypes = WalkState->OpInfo->ParseArgs;
157*385cc6b4SJerry Jelinek break;
158*385cc6b4SJerry Jelinek }
159*385cc6b4SJerry Jelinek
160*385cc6b4SJerry Jelinek return_ACPI_STATUS (AE_OK);
161*385cc6b4SJerry Jelinek }
162*385cc6b4SJerry Jelinek
163*385cc6b4SJerry Jelinek
164*385cc6b4SJerry Jelinek /*******************************************************************************
165*385cc6b4SJerry Jelinek *
166*385cc6b4SJerry Jelinek * FUNCTION: AcpiPsBuildNamedOp
167*385cc6b4SJerry Jelinek *
168*385cc6b4SJerry Jelinek * PARAMETERS: WalkState - Current state
169*385cc6b4SJerry Jelinek * AmlOpStart - Begin of named Op in AML
170*385cc6b4SJerry Jelinek * UnnamedOp - Early Op (not a named Op)
171*385cc6b4SJerry Jelinek * Op - Returned Op
172*385cc6b4SJerry Jelinek *
173*385cc6b4SJerry Jelinek * RETURN: Status
174*385cc6b4SJerry Jelinek *
175*385cc6b4SJerry Jelinek * DESCRIPTION: Parse a named Op
176*385cc6b4SJerry Jelinek *
177*385cc6b4SJerry Jelinek ******************************************************************************/
178*385cc6b4SJerry Jelinek
179*385cc6b4SJerry Jelinek ACPI_STATUS
AcpiPsBuildNamedOp(ACPI_WALK_STATE * WalkState,UINT8 * AmlOpStart,ACPI_PARSE_OBJECT * UnnamedOp,ACPI_PARSE_OBJECT ** Op)180*385cc6b4SJerry Jelinek AcpiPsBuildNamedOp (
181*385cc6b4SJerry Jelinek ACPI_WALK_STATE *WalkState,
182*385cc6b4SJerry Jelinek UINT8 *AmlOpStart,
183*385cc6b4SJerry Jelinek ACPI_PARSE_OBJECT *UnnamedOp,
184*385cc6b4SJerry Jelinek ACPI_PARSE_OBJECT **Op)
185*385cc6b4SJerry Jelinek {
186*385cc6b4SJerry Jelinek ACPI_STATUS Status = AE_OK;
187*385cc6b4SJerry Jelinek ACPI_PARSE_OBJECT *Arg = NULL;
188*385cc6b4SJerry Jelinek
189*385cc6b4SJerry Jelinek
190*385cc6b4SJerry Jelinek ACPI_FUNCTION_TRACE_PTR (PsBuildNamedOp, WalkState);
191*385cc6b4SJerry Jelinek
192*385cc6b4SJerry Jelinek
193*385cc6b4SJerry Jelinek UnnamedOp->Common.Value.Arg = NULL;
194*385cc6b4SJerry Jelinek UnnamedOp->Common.ArgListLength = 0;
195*385cc6b4SJerry Jelinek UnnamedOp->Common.AmlOpcode = WalkState->Opcode;
196*385cc6b4SJerry Jelinek
197*385cc6b4SJerry Jelinek /*
198*385cc6b4SJerry Jelinek * Get and append arguments until we find the node that contains
199*385cc6b4SJerry Jelinek * the name (the type ARGP_NAME).
200*385cc6b4SJerry Jelinek */
201*385cc6b4SJerry Jelinek while (GET_CURRENT_ARG_TYPE (WalkState->ArgTypes) &&
202*385cc6b4SJerry Jelinek (GET_CURRENT_ARG_TYPE (WalkState->ArgTypes) != ARGP_NAME))
203*385cc6b4SJerry Jelinek {
204*385cc6b4SJerry Jelinek Status = AcpiPsGetNextArg (WalkState, &(WalkState->ParserState),
205*385cc6b4SJerry Jelinek GET_CURRENT_ARG_TYPE (WalkState->ArgTypes), &Arg);
206*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status))
207*385cc6b4SJerry Jelinek {
208*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status);
209*385cc6b4SJerry Jelinek }
210*385cc6b4SJerry Jelinek
211*385cc6b4SJerry Jelinek AcpiPsAppendArg (UnnamedOp, Arg);
212*385cc6b4SJerry Jelinek INCREMENT_ARG_LIST (WalkState->ArgTypes);
213*385cc6b4SJerry Jelinek }
214*385cc6b4SJerry Jelinek
215*385cc6b4SJerry Jelinek /*
216*385cc6b4SJerry Jelinek * Make sure that we found a NAME and didn't run out of arguments
217*385cc6b4SJerry Jelinek */
218*385cc6b4SJerry Jelinek if (!GET_CURRENT_ARG_TYPE (WalkState->ArgTypes))
219*385cc6b4SJerry Jelinek {
220*385cc6b4SJerry Jelinek return_ACPI_STATUS (AE_AML_NO_OPERAND);
221*385cc6b4SJerry Jelinek }
222*385cc6b4SJerry Jelinek
223*385cc6b4SJerry Jelinek /* We know that this arg is a name, move to next arg */
224*385cc6b4SJerry Jelinek
225*385cc6b4SJerry Jelinek INCREMENT_ARG_LIST (WalkState->ArgTypes);
226*385cc6b4SJerry Jelinek
227*385cc6b4SJerry Jelinek /*
228*385cc6b4SJerry Jelinek * Find the object. This will either insert the object into
229*385cc6b4SJerry Jelinek * the namespace or simply look it up
230*385cc6b4SJerry Jelinek */
231*385cc6b4SJerry Jelinek WalkState->Op = NULL;
232*385cc6b4SJerry Jelinek
233*385cc6b4SJerry Jelinek Status = WalkState->DescendingCallback (WalkState, Op);
234*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status))
235*385cc6b4SJerry Jelinek {
236*385cc6b4SJerry Jelinek if (Status != AE_CTRL_TERMINATE)
237*385cc6b4SJerry Jelinek {
238*385cc6b4SJerry Jelinek ACPI_EXCEPTION ((AE_INFO, Status, "During name lookup/catalog"));
239*385cc6b4SJerry Jelinek }
240*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status);
241*385cc6b4SJerry Jelinek }
242*385cc6b4SJerry Jelinek
243*385cc6b4SJerry Jelinek if (!*Op)
244*385cc6b4SJerry Jelinek {
245*385cc6b4SJerry Jelinek return_ACPI_STATUS (AE_CTRL_PARSE_CONTINUE);
246*385cc6b4SJerry Jelinek }
247*385cc6b4SJerry Jelinek
248*385cc6b4SJerry Jelinek Status = AcpiPsNextParseState (WalkState, *Op, Status);
249*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status))
250*385cc6b4SJerry Jelinek {
251*385cc6b4SJerry Jelinek if (Status == AE_CTRL_PENDING)
252*385cc6b4SJerry Jelinek {
253*385cc6b4SJerry Jelinek Status = AE_CTRL_PARSE_PENDING;
254*385cc6b4SJerry Jelinek }
255*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status);
256*385cc6b4SJerry Jelinek }
257*385cc6b4SJerry Jelinek
258*385cc6b4SJerry Jelinek AcpiPsAppendArg (*Op, UnnamedOp->Common.Value.Arg);
259*385cc6b4SJerry Jelinek
260*385cc6b4SJerry Jelinek if ((*Op)->Common.AmlOpcode == AML_REGION_OP ||
261*385cc6b4SJerry Jelinek (*Op)->Common.AmlOpcode == AML_DATA_REGION_OP)
262*385cc6b4SJerry Jelinek {
263*385cc6b4SJerry Jelinek /*
264*385cc6b4SJerry Jelinek * Defer final parsing of an OperationRegion body, because we don't
265*385cc6b4SJerry Jelinek * have enough info in the first pass to parse it correctly (i.e.,
266*385cc6b4SJerry Jelinek * there may be method calls within the TermArg elements of the body.)
267*385cc6b4SJerry Jelinek *
268*385cc6b4SJerry Jelinek * However, we must continue parsing because the opregion is not a
269*385cc6b4SJerry Jelinek * standalone package -- we don't know where the end is at this point.
270*385cc6b4SJerry Jelinek *
271*385cc6b4SJerry Jelinek * (Length is unknown until parse of the body complete)
272*385cc6b4SJerry Jelinek */
273*385cc6b4SJerry Jelinek (*Op)->Named.Data = AmlOpStart;
274*385cc6b4SJerry Jelinek (*Op)->Named.Length = 0;
275*385cc6b4SJerry Jelinek }
276*385cc6b4SJerry Jelinek
277*385cc6b4SJerry Jelinek return_ACPI_STATUS (AE_OK);
278*385cc6b4SJerry Jelinek }
279*385cc6b4SJerry Jelinek
280*385cc6b4SJerry Jelinek
281*385cc6b4SJerry Jelinek /*******************************************************************************
282*385cc6b4SJerry Jelinek *
283*385cc6b4SJerry Jelinek * FUNCTION: AcpiPsCreateOp
284*385cc6b4SJerry Jelinek *
285*385cc6b4SJerry Jelinek * PARAMETERS: WalkState - Current state
286*385cc6b4SJerry Jelinek * AmlOpStart - Op start in AML
287*385cc6b4SJerry Jelinek * NewOp - Returned Op
288*385cc6b4SJerry Jelinek *
289*385cc6b4SJerry Jelinek * RETURN: Status
290*385cc6b4SJerry Jelinek *
291*385cc6b4SJerry Jelinek * DESCRIPTION: Get Op from AML
292*385cc6b4SJerry Jelinek *
293*385cc6b4SJerry Jelinek ******************************************************************************/
294*385cc6b4SJerry Jelinek
295*385cc6b4SJerry Jelinek ACPI_STATUS
AcpiPsCreateOp(ACPI_WALK_STATE * WalkState,UINT8 * AmlOpStart,ACPI_PARSE_OBJECT ** NewOp)296*385cc6b4SJerry Jelinek AcpiPsCreateOp (
297*385cc6b4SJerry Jelinek ACPI_WALK_STATE *WalkState,
298*385cc6b4SJerry Jelinek UINT8 *AmlOpStart,
299*385cc6b4SJerry Jelinek ACPI_PARSE_OBJECT **NewOp)
300*385cc6b4SJerry Jelinek {
301*385cc6b4SJerry Jelinek ACPI_STATUS Status = AE_OK;
302*385cc6b4SJerry Jelinek ACPI_PARSE_OBJECT *Op;
303*385cc6b4SJerry Jelinek ACPI_PARSE_OBJECT *NamedOp = NULL;
304*385cc6b4SJerry Jelinek ACPI_PARSE_OBJECT *ParentScope;
305*385cc6b4SJerry Jelinek UINT8 ArgumentCount;
306*385cc6b4SJerry Jelinek const ACPI_OPCODE_INFO *OpInfo;
307*385cc6b4SJerry Jelinek
308*385cc6b4SJerry Jelinek
309*385cc6b4SJerry Jelinek ACPI_FUNCTION_TRACE_PTR (PsCreateOp, WalkState);
310*385cc6b4SJerry Jelinek
311*385cc6b4SJerry Jelinek
312*385cc6b4SJerry Jelinek Status = AcpiPsGetAmlOpcode (WalkState);
313*385cc6b4SJerry Jelinek if (Status == AE_CTRL_PARSE_CONTINUE)
314*385cc6b4SJerry Jelinek {
315*385cc6b4SJerry Jelinek return_ACPI_STATUS (AE_CTRL_PARSE_CONTINUE);
316*385cc6b4SJerry Jelinek }
317*385cc6b4SJerry Jelinek
318*385cc6b4SJerry Jelinek /* Create Op structure and append to parent's argument list */
319*385cc6b4SJerry Jelinek
320*385cc6b4SJerry Jelinek WalkState->OpInfo = AcpiPsGetOpcodeInfo (WalkState->Opcode);
321*385cc6b4SJerry Jelinek Op = AcpiPsAllocOp (WalkState->Opcode, AmlOpStart);
322*385cc6b4SJerry Jelinek if (!Op)
323*385cc6b4SJerry Jelinek {
324*385cc6b4SJerry Jelinek return_ACPI_STATUS (AE_NO_MEMORY);
325*385cc6b4SJerry Jelinek }
326*385cc6b4SJerry Jelinek
327*385cc6b4SJerry Jelinek if (WalkState->OpInfo->Flags & AML_NAMED)
328*385cc6b4SJerry Jelinek {
329*385cc6b4SJerry Jelinek Status = AcpiPsBuildNamedOp (WalkState, AmlOpStart, Op, &NamedOp);
330*385cc6b4SJerry Jelinek AcpiPsFreeOp (Op);
331*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status))
332*385cc6b4SJerry Jelinek {
333*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status);
334*385cc6b4SJerry Jelinek }
335*385cc6b4SJerry Jelinek
336*385cc6b4SJerry Jelinek *NewOp = NamedOp;
337*385cc6b4SJerry Jelinek return_ACPI_STATUS (AE_OK);
338*385cc6b4SJerry Jelinek }
339*385cc6b4SJerry Jelinek
340*385cc6b4SJerry Jelinek /* Not a named opcode, just allocate Op and append to parent */
341*385cc6b4SJerry Jelinek
342*385cc6b4SJerry Jelinek if (WalkState->OpInfo->Flags & AML_CREATE)
343*385cc6b4SJerry Jelinek {
344*385cc6b4SJerry Jelinek /*
345*385cc6b4SJerry Jelinek * Backup to beginning of CreateXXXfield declaration
346*385cc6b4SJerry Jelinek * BodyLength is unknown until we parse the body
347*385cc6b4SJerry Jelinek */
348*385cc6b4SJerry Jelinek Op->Named.Data = AmlOpStart;
349*385cc6b4SJerry Jelinek Op->Named.Length = 0;
350*385cc6b4SJerry Jelinek }
351*385cc6b4SJerry Jelinek
352*385cc6b4SJerry Jelinek if (WalkState->Opcode == AML_BANK_FIELD_OP)
353*385cc6b4SJerry Jelinek {
354*385cc6b4SJerry Jelinek /*
355*385cc6b4SJerry Jelinek * Backup to beginning of BankField declaration
356*385cc6b4SJerry Jelinek * BodyLength is unknown until we parse the body
357*385cc6b4SJerry Jelinek */
358*385cc6b4SJerry Jelinek Op->Named.Data = AmlOpStart;
359*385cc6b4SJerry Jelinek Op->Named.Length = 0;
360*385cc6b4SJerry Jelinek }
361*385cc6b4SJerry Jelinek
362*385cc6b4SJerry Jelinek ParentScope = AcpiPsGetParentScope (&(WalkState->ParserState));
363*385cc6b4SJerry Jelinek AcpiPsAppendArg (ParentScope, Op);
364*385cc6b4SJerry Jelinek
365*385cc6b4SJerry Jelinek if (ParentScope)
366*385cc6b4SJerry Jelinek {
367*385cc6b4SJerry Jelinek OpInfo = AcpiPsGetOpcodeInfo (ParentScope->Common.AmlOpcode);
368*385cc6b4SJerry Jelinek if (OpInfo->Flags & AML_HAS_TARGET)
369*385cc6b4SJerry Jelinek {
370*385cc6b4SJerry Jelinek ArgumentCount = AcpiPsGetArgumentCount (OpInfo->Type);
371*385cc6b4SJerry Jelinek if (ParentScope->Common.ArgListLength > ArgumentCount)
372*385cc6b4SJerry Jelinek {
373*385cc6b4SJerry Jelinek Op->Common.Flags |= ACPI_PARSEOP_TARGET;
374*385cc6b4SJerry Jelinek }
375*385cc6b4SJerry Jelinek }
376*385cc6b4SJerry Jelinek else if (ParentScope->Common.AmlOpcode == AML_INCREMENT_OP)
377*385cc6b4SJerry Jelinek {
378*385cc6b4SJerry Jelinek Op->Common.Flags |= ACPI_PARSEOP_TARGET;
379*385cc6b4SJerry Jelinek }
380*385cc6b4SJerry Jelinek }
381*385cc6b4SJerry Jelinek
382*385cc6b4SJerry Jelinek if (WalkState->DescendingCallback != NULL)
383*385cc6b4SJerry Jelinek {
384*385cc6b4SJerry Jelinek /*
385*385cc6b4SJerry Jelinek * Find the object. This will either insert the object into
386*385cc6b4SJerry Jelinek * the namespace or simply look it up
387*385cc6b4SJerry Jelinek */
388*385cc6b4SJerry Jelinek WalkState->Op = *NewOp = Op;
389*385cc6b4SJerry Jelinek
390*385cc6b4SJerry Jelinek Status = WalkState->DescendingCallback (WalkState, &Op);
391*385cc6b4SJerry Jelinek Status = AcpiPsNextParseState (WalkState, Op, Status);
392*385cc6b4SJerry Jelinek if (Status == AE_CTRL_PENDING)
393*385cc6b4SJerry Jelinek {
394*385cc6b4SJerry Jelinek Status = AE_CTRL_PARSE_PENDING;
395*385cc6b4SJerry Jelinek }
396*385cc6b4SJerry Jelinek }
397*385cc6b4SJerry Jelinek
398*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status);
399*385cc6b4SJerry Jelinek }
400*385cc6b4SJerry Jelinek
401*385cc6b4SJerry Jelinek
402*385cc6b4SJerry Jelinek /*******************************************************************************
403*385cc6b4SJerry Jelinek *
404*385cc6b4SJerry Jelinek * FUNCTION: AcpiPsCompleteOp
405*385cc6b4SJerry Jelinek *
406*385cc6b4SJerry Jelinek * PARAMETERS: WalkState - Current state
407*385cc6b4SJerry Jelinek * Op - Returned Op
408*385cc6b4SJerry Jelinek * Status - Parse status before complete Op
409*385cc6b4SJerry Jelinek *
410*385cc6b4SJerry Jelinek * RETURN: Status
411*385cc6b4SJerry Jelinek *
412*385cc6b4SJerry Jelinek * DESCRIPTION: Complete Op
413*385cc6b4SJerry Jelinek *
414*385cc6b4SJerry Jelinek ******************************************************************************/
415*385cc6b4SJerry Jelinek
416*385cc6b4SJerry Jelinek ACPI_STATUS
AcpiPsCompleteOp(ACPI_WALK_STATE * WalkState,ACPI_PARSE_OBJECT ** Op,ACPI_STATUS Status)417*385cc6b4SJerry Jelinek AcpiPsCompleteOp (
418*385cc6b4SJerry Jelinek ACPI_WALK_STATE *WalkState,
419*385cc6b4SJerry Jelinek ACPI_PARSE_OBJECT **Op,
420*385cc6b4SJerry Jelinek ACPI_STATUS Status)
421*385cc6b4SJerry Jelinek {
422*385cc6b4SJerry Jelinek ACPI_STATUS Status2;
423*385cc6b4SJerry Jelinek
424*385cc6b4SJerry Jelinek
425*385cc6b4SJerry Jelinek ACPI_FUNCTION_TRACE_PTR (PsCompleteOp, WalkState);
426*385cc6b4SJerry Jelinek
427*385cc6b4SJerry Jelinek
428*385cc6b4SJerry Jelinek /*
429*385cc6b4SJerry Jelinek * Finished one argument of the containing scope
430*385cc6b4SJerry Jelinek */
431*385cc6b4SJerry Jelinek WalkState->ParserState.Scope->ParseScope.ArgCount--;
432*385cc6b4SJerry Jelinek
433*385cc6b4SJerry Jelinek /* Close this Op (will result in parse subtree deletion) */
434*385cc6b4SJerry Jelinek
435*385cc6b4SJerry Jelinek Status2 = AcpiPsCompleteThisOp (WalkState, *Op);
436*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status2))
437*385cc6b4SJerry Jelinek {
438*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status2);
439*385cc6b4SJerry Jelinek }
440*385cc6b4SJerry Jelinek
441*385cc6b4SJerry Jelinek *Op = NULL;
442*385cc6b4SJerry Jelinek
443*385cc6b4SJerry Jelinek switch (Status)
444*385cc6b4SJerry Jelinek {
445*385cc6b4SJerry Jelinek case AE_OK:
446*385cc6b4SJerry Jelinek
447*385cc6b4SJerry Jelinek break;
448*385cc6b4SJerry Jelinek
449*385cc6b4SJerry Jelinek case AE_CTRL_TRANSFER:
450*385cc6b4SJerry Jelinek
451*385cc6b4SJerry Jelinek /* We are about to transfer to a called method */
452*385cc6b4SJerry Jelinek
453*385cc6b4SJerry Jelinek WalkState->PrevOp = NULL;
454*385cc6b4SJerry Jelinek WalkState->PrevArgTypes = WalkState->ArgTypes;
455*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status);
456*385cc6b4SJerry Jelinek
457*385cc6b4SJerry Jelinek case AE_CTRL_END:
458*385cc6b4SJerry Jelinek
459*385cc6b4SJerry Jelinek AcpiPsPopScope (&(WalkState->ParserState), Op,
460*385cc6b4SJerry Jelinek &WalkState->ArgTypes, &WalkState->ArgCount);
461*385cc6b4SJerry Jelinek
462*385cc6b4SJerry Jelinek if (*Op)
463*385cc6b4SJerry Jelinek {
464*385cc6b4SJerry Jelinek WalkState->Op = *Op;
465*385cc6b4SJerry Jelinek WalkState->OpInfo = AcpiPsGetOpcodeInfo ((*Op)->Common.AmlOpcode);
466*385cc6b4SJerry Jelinek WalkState->Opcode = (*Op)->Common.AmlOpcode;
467*385cc6b4SJerry Jelinek
468*385cc6b4SJerry Jelinek Status = WalkState->AscendingCallback (WalkState);
469*385cc6b4SJerry Jelinek Status = AcpiPsNextParseState (WalkState, *Op, Status);
470*385cc6b4SJerry Jelinek
471*385cc6b4SJerry Jelinek Status2 = AcpiPsCompleteThisOp (WalkState, *Op);
472*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status2))
473*385cc6b4SJerry Jelinek {
474*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status2);
475*385cc6b4SJerry Jelinek }
476*385cc6b4SJerry Jelinek }
477*385cc6b4SJerry Jelinek
478*385cc6b4SJerry Jelinek Status = AE_OK;
479*385cc6b4SJerry Jelinek break;
480*385cc6b4SJerry Jelinek
481*385cc6b4SJerry Jelinek case AE_CTRL_BREAK:
482*385cc6b4SJerry Jelinek case AE_CTRL_CONTINUE:
483*385cc6b4SJerry Jelinek
484*385cc6b4SJerry Jelinek /* Pop off scopes until we find the While */
485*385cc6b4SJerry Jelinek
486*385cc6b4SJerry Jelinek while (!(*Op) || ((*Op)->Common.AmlOpcode != AML_WHILE_OP))
487*385cc6b4SJerry Jelinek {
488*385cc6b4SJerry Jelinek AcpiPsPopScope (&(WalkState->ParserState), Op,
489*385cc6b4SJerry Jelinek &WalkState->ArgTypes, &WalkState->ArgCount);
490*385cc6b4SJerry Jelinek }
491*385cc6b4SJerry Jelinek
492*385cc6b4SJerry Jelinek /* Close this iteration of the While loop */
493*385cc6b4SJerry Jelinek
494*385cc6b4SJerry Jelinek WalkState->Op = *Op;
495*385cc6b4SJerry Jelinek WalkState->OpInfo = AcpiPsGetOpcodeInfo ((*Op)->Common.AmlOpcode);
496*385cc6b4SJerry Jelinek WalkState->Opcode = (*Op)->Common.AmlOpcode;
497*385cc6b4SJerry Jelinek
498*385cc6b4SJerry Jelinek Status = WalkState->AscendingCallback (WalkState);
499*385cc6b4SJerry Jelinek Status = AcpiPsNextParseState (WalkState, *Op, Status);
500*385cc6b4SJerry Jelinek
501*385cc6b4SJerry Jelinek Status2 = AcpiPsCompleteThisOp (WalkState, *Op);
502*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status2))
503*385cc6b4SJerry Jelinek {
504*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status2);
505*385cc6b4SJerry Jelinek }
506*385cc6b4SJerry Jelinek
507*385cc6b4SJerry Jelinek Status = AE_OK;
508*385cc6b4SJerry Jelinek break;
509*385cc6b4SJerry Jelinek
510*385cc6b4SJerry Jelinek case AE_CTRL_TERMINATE:
511*385cc6b4SJerry Jelinek
512*385cc6b4SJerry Jelinek /* Clean up */
513*385cc6b4SJerry Jelinek do
514*385cc6b4SJerry Jelinek {
515*385cc6b4SJerry Jelinek if (*Op)
516*385cc6b4SJerry Jelinek {
517*385cc6b4SJerry Jelinek Status2 = AcpiPsCompleteThisOp (WalkState, *Op);
518*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status2))
519*385cc6b4SJerry Jelinek {
520*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status2);
521*385cc6b4SJerry Jelinek }
522*385cc6b4SJerry Jelinek
523*385cc6b4SJerry Jelinek AcpiUtDeleteGenericState (
524*385cc6b4SJerry Jelinek AcpiUtPopGenericState (&WalkState->ControlState));
525*385cc6b4SJerry Jelinek }
526*385cc6b4SJerry Jelinek
527*385cc6b4SJerry Jelinek AcpiPsPopScope (&(WalkState->ParserState), Op,
528*385cc6b4SJerry Jelinek &WalkState->ArgTypes, &WalkState->ArgCount);
529*385cc6b4SJerry Jelinek
530*385cc6b4SJerry Jelinek } while (*Op);
531*385cc6b4SJerry Jelinek
532*385cc6b4SJerry Jelinek return_ACPI_STATUS (AE_OK);
533*385cc6b4SJerry Jelinek
534*385cc6b4SJerry Jelinek default: /* All other non-AE_OK status */
535*385cc6b4SJerry Jelinek
536*385cc6b4SJerry Jelinek do
537*385cc6b4SJerry Jelinek {
538*385cc6b4SJerry Jelinek if (*Op)
539*385cc6b4SJerry Jelinek {
540*385cc6b4SJerry Jelinek Status2 = AcpiPsCompleteThisOp (WalkState, *Op);
541*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status2))
542*385cc6b4SJerry Jelinek {
543*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status2);
544*385cc6b4SJerry Jelinek }
545*385cc6b4SJerry Jelinek }
546*385cc6b4SJerry Jelinek
547*385cc6b4SJerry Jelinek AcpiPsPopScope (&(WalkState->ParserState), Op,
548*385cc6b4SJerry Jelinek &WalkState->ArgTypes, &WalkState->ArgCount);
549*385cc6b4SJerry Jelinek
550*385cc6b4SJerry Jelinek } while (*Op);
551*385cc6b4SJerry Jelinek
552*385cc6b4SJerry Jelinek
553*385cc6b4SJerry Jelinek #if 0
554*385cc6b4SJerry Jelinek /*
555*385cc6b4SJerry Jelinek * TBD: Cleanup parse ops on error
556*385cc6b4SJerry Jelinek */
557*385cc6b4SJerry Jelinek if (*Op == NULL)
558*385cc6b4SJerry Jelinek {
559*385cc6b4SJerry Jelinek AcpiPsPopScope (ParserState, Op,
560*385cc6b4SJerry Jelinek &WalkState->ArgTypes, &WalkState->ArgCount);
561*385cc6b4SJerry Jelinek }
562*385cc6b4SJerry Jelinek #endif
563*385cc6b4SJerry Jelinek WalkState->PrevOp = NULL;
564*385cc6b4SJerry Jelinek WalkState->PrevArgTypes = WalkState->ArgTypes;
565*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status);
566*385cc6b4SJerry Jelinek }
567*385cc6b4SJerry Jelinek
568*385cc6b4SJerry Jelinek /* This scope complete? */
569*385cc6b4SJerry Jelinek
570*385cc6b4SJerry Jelinek if (AcpiPsHasCompletedScope (&(WalkState->ParserState)))
571*385cc6b4SJerry Jelinek {
572*385cc6b4SJerry Jelinek AcpiPsPopScope (&(WalkState->ParserState), Op,
573*385cc6b4SJerry Jelinek &WalkState->ArgTypes, &WalkState->ArgCount);
574*385cc6b4SJerry Jelinek ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Popped scope, Op=%p\n", *Op));
575*385cc6b4SJerry Jelinek }
576*385cc6b4SJerry Jelinek else
577*385cc6b4SJerry Jelinek {
578*385cc6b4SJerry Jelinek *Op = NULL;
579*385cc6b4SJerry Jelinek }
580*385cc6b4SJerry Jelinek
581*385cc6b4SJerry Jelinek return_ACPI_STATUS (AE_OK);
582*385cc6b4SJerry Jelinek }
583*385cc6b4SJerry Jelinek
584*385cc6b4SJerry Jelinek
585*385cc6b4SJerry Jelinek /*******************************************************************************
586*385cc6b4SJerry Jelinek *
587*385cc6b4SJerry Jelinek * FUNCTION: AcpiPsCompleteFinalOp
588*385cc6b4SJerry Jelinek *
589*385cc6b4SJerry Jelinek * PARAMETERS: WalkState - Current state
590*385cc6b4SJerry Jelinek * Op - Current Op
591*385cc6b4SJerry Jelinek * Status - Current parse status before complete last
592*385cc6b4SJerry Jelinek * Op
593*385cc6b4SJerry Jelinek *
594*385cc6b4SJerry Jelinek * RETURN: Status
595*385cc6b4SJerry Jelinek *
596*385cc6b4SJerry Jelinek * DESCRIPTION: Complete last Op.
597*385cc6b4SJerry Jelinek *
598*385cc6b4SJerry Jelinek ******************************************************************************/
599*385cc6b4SJerry Jelinek
600*385cc6b4SJerry Jelinek ACPI_STATUS
AcpiPsCompleteFinalOp(ACPI_WALK_STATE * WalkState,ACPI_PARSE_OBJECT * Op,ACPI_STATUS Status)601*385cc6b4SJerry Jelinek AcpiPsCompleteFinalOp (
602*385cc6b4SJerry Jelinek ACPI_WALK_STATE *WalkState,
603*385cc6b4SJerry Jelinek ACPI_PARSE_OBJECT *Op,
604*385cc6b4SJerry Jelinek ACPI_STATUS Status)
605*385cc6b4SJerry Jelinek {
606*385cc6b4SJerry Jelinek ACPI_STATUS Status2;
607*385cc6b4SJerry Jelinek
608*385cc6b4SJerry Jelinek
609*385cc6b4SJerry Jelinek ACPI_FUNCTION_TRACE_PTR (PsCompleteFinalOp, WalkState);
610*385cc6b4SJerry Jelinek
611*385cc6b4SJerry Jelinek
612*385cc6b4SJerry Jelinek /*
613*385cc6b4SJerry Jelinek * Complete the last Op (if not completed), and clear the scope stack.
614*385cc6b4SJerry Jelinek * It is easily possible to end an AML "package" with an unbounded number
615*385cc6b4SJerry Jelinek * of open scopes (such as when several ASL blocks are closed with
616*385cc6b4SJerry Jelinek * sequential closing braces). We want to terminate each one cleanly.
617*385cc6b4SJerry Jelinek */
618*385cc6b4SJerry Jelinek ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "AML package complete at Op %p\n", Op));
619*385cc6b4SJerry Jelinek do
620*385cc6b4SJerry Jelinek {
621*385cc6b4SJerry Jelinek if (Op)
622*385cc6b4SJerry Jelinek {
623*385cc6b4SJerry Jelinek if (WalkState->AscendingCallback != NULL)
624*385cc6b4SJerry Jelinek {
625*385cc6b4SJerry Jelinek WalkState->Op = Op;
626*385cc6b4SJerry Jelinek WalkState->OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
627*385cc6b4SJerry Jelinek WalkState->Opcode = Op->Common.AmlOpcode;
628*385cc6b4SJerry Jelinek
629*385cc6b4SJerry Jelinek Status = WalkState->AscendingCallback (WalkState);
630*385cc6b4SJerry Jelinek Status = AcpiPsNextParseState (WalkState, Op, Status);
631*385cc6b4SJerry Jelinek if (Status == AE_CTRL_PENDING)
632*385cc6b4SJerry Jelinek {
633*385cc6b4SJerry Jelinek Status = AcpiPsCompleteOp (WalkState, &Op, AE_OK);
634*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status))
635*385cc6b4SJerry Jelinek {
636*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status);
637*385cc6b4SJerry Jelinek }
638*385cc6b4SJerry Jelinek }
639*385cc6b4SJerry Jelinek
640*385cc6b4SJerry Jelinek if (Status == AE_CTRL_TERMINATE)
641*385cc6b4SJerry Jelinek {
642*385cc6b4SJerry Jelinek Status = AE_OK;
643*385cc6b4SJerry Jelinek
644*385cc6b4SJerry Jelinek /* Clean up */
645*385cc6b4SJerry Jelinek do
646*385cc6b4SJerry Jelinek {
647*385cc6b4SJerry Jelinek if (Op)
648*385cc6b4SJerry Jelinek {
649*385cc6b4SJerry Jelinek Status2 = AcpiPsCompleteThisOp (WalkState, Op);
650*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status2))
651*385cc6b4SJerry Jelinek {
652*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status2);
653*385cc6b4SJerry Jelinek }
654*385cc6b4SJerry Jelinek }
655*385cc6b4SJerry Jelinek
656*385cc6b4SJerry Jelinek AcpiPsPopScope (&(WalkState->ParserState), &Op,
657*385cc6b4SJerry Jelinek &WalkState->ArgTypes, &WalkState->ArgCount);
658*385cc6b4SJerry Jelinek
659*385cc6b4SJerry Jelinek } while (Op);
660*385cc6b4SJerry Jelinek
661*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status);
662*385cc6b4SJerry Jelinek }
663*385cc6b4SJerry Jelinek
664*385cc6b4SJerry Jelinek else if (ACPI_FAILURE (Status))
665*385cc6b4SJerry Jelinek {
666*385cc6b4SJerry Jelinek /* First error is most important */
667*385cc6b4SJerry Jelinek
668*385cc6b4SJerry Jelinek (void) AcpiPsCompleteThisOp (WalkState, Op);
669*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status);
670*385cc6b4SJerry Jelinek }
671*385cc6b4SJerry Jelinek }
672*385cc6b4SJerry Jelinek
673*385cc6b4SJerry Jelinek Status2 = AcpiPsCompleteThisOp (WalkState, Op);
674*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status2))
675*385cc6b4SJerry Jelinek {
676*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status2);
677*385cc6b4SJerry Jelinek }
678*385cc6b4SJerry Jelinek }
679*385cc6b4SJerry Jelinek
680*385cc6b4SJerry Jelinek AcpiPsPopScope (&(WalkState->ParserState), &Op, &WalkState->ArgTypes,
681*385cc6b4SJerry Jelinek &WalkState->ArgCount);
682*385cc6b4SJerry Jelinek
683*385cc6b4SJerry Jelinek } while (Op);
684*385cc6b4SJerry Jelinek
685*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status);
686*385cc6b4SJerry Jelinek }
687