1149703c7Sjruoho /******************************************************************************
2149703c7Sjruoho  *
3149703c7Sjruoho  * Module Name: psscope - Parser scope stack management routines
4149703c7Sjruoho  *
5149703c7Sjruoho  *****************************************************************************/
6149703c7Sjruoho 
768471b32Sjruoho /*
8*e5631441Schristos  * Copyright (C) 2000 - 2022, Intel Corp.
9149703c7Sjruoho  * All rights reserved.
10149703c7Sjruoho  *
1168471b32Sjruoho  * Redistribution and use in source and binary forms, with or without
1268471b32Sjruoho  * modification, are permitted provided that the following conditions
1368471b32Sjruoho  * are met:
1468471b32Sjruoho  * 1. Redistributions of source code must retain the above copyright
1568471b32Sjruoho  *    notice, this list of conditions, and the following disclaimer,
1668471b32Sjruoho  *    without modification.
1768471b32Sjruoho  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
1868471b32Sjruoho  *    substantially similar to the "NO WARRANTY" disclaimer below
1968471b32Sjruoho  *    ("Disclaimer") and any redistribution must be conditioned upon
2068471b32Sjruoho  *    including a substantially similar Disclaimer requirement for further
2168471b32Sjruoho  *    binary redistribution.
2268471b32Sjruoho  * 3. Neither the names of the above-listed copyright holders nor the names
2368471b32Sjruoho  *    of any contributors may be used to endorse or promote products derived
2468471b32Sjruoho  *    from this software without specific prior written permission.
25149703c7Sjruoho  *
2668471b32Sjruoho  * Alternatively, this software may be distributed under the terms of the
2768471b32Sjruoho  * GNU General Public License ("GPL") version 2 as published by the Free
2868471b32Sjruoho  * Software Foundation.
29149703c7Sjruoho  *
3068471b32Sjruoho  * NO WARRANTY
3168471b32Sjruoho  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3268471b32Sjruoho  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33d4291bf2Schristos  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
3468471b32Sjruoho  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3568471b32Sjruoho  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
3668471b32Sjruoho  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
3768471b32Sjruoho  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3868471b32Sjruoho  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
3968471b32Sjruoho  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
4068471b32Sjruoho  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
4168471b32Sjruoho  * POSSIBILITY OF SUCH DAMAGES.
4268471b32Sjruoho  */
43149703c7Sjruoho 
44149703c7Sjruoho #include "acpi.h"
45149703c7Sjruoho #include "accommon.h"
46149703c7Sjruoho #include "acparser.h"
47149703c7Sjruoho 
48149703c7Sjruoho #define _COMPONENT          ACPI_PARSER
49149703c7Sjruoho         ACPI_MODULE_NAME    ("psscope")
50149703c7Sjruoho 
51149703c7Sjruoho 
52149703c7Sjruoho /*******************************************************************************
53149703c7Sjruoho  *
54149703c7Sjruoho  * FUNCTION:    AcpiPsGetParentScope
55149703c7Sjruoho  *
56149703c7Sjruoho  * PARAMETERS:  ParserState         - Current parser state object
57149703c7Sjruoho  *
58149703c7Sjruoho  * RETURN:      Pointer to an Op object
59149703c7Sjruoho  *
60149703c7Sjruoho  * DESCRIPTION: Get parent of current op being parsed
61149703c7Sjruoho  *
62149703c7Sjruoho  ******************************************************************************/
63149703c7Sjruoho 
64149703c7Sjruoho ACPI_PARSE_OBJECT *
AcpiPsGetParentScope(ACPI_PARSE_STATE * ParserState)65149703c7Sjruoho AcpiPsGetParentScope (
66149703c7Sjruoho     ACPI_PARSE_STATE        *ParserState)
67149703c7Sjruoho {
68149703c7Sjruoho 
69149703c7Sjruoho     return (ParserState->Scope->ParseScope.Op);
70149703c7Sjruoho }
71149703c7Sjruoho 
72149703c7Sjruoho 
73149703c7Sjruoho /*******************************************************************************
74149703c7Sjruoho  *
75149703c7Sjruoho  * FUNCTION:    AcpiPsHasCompletedScope
76149703c7Sjruoho  *
77149703c7Sjruoho  * PARAMETERS:  ParserState         - Current parser state object
78149703c7Sjruoho  *
79149703c7Sjruoho  * RETURN:      Boolean, TRUE = scope completed.
80149703c7Sjruoho  *
81149703c7Sjruoho  * DESCRIPTION: Is parsing of current argument complete?  Determined by
82149703c7Sjruoho  *              1) AML pointer is at or beyond the end of the scope
83149703c7Sjruoho  *              2) The scope argument count has reached zero.
84149703c7Sjruoho  *
85149703c7Sjruoho  ******************************************************************************/
86149703c7Sjruoho 
87149703c7Sjruoho BOOLEAN
AcpiPsHasCompletedScope(ACPI_PARSE_STATE * ParserState)88149703c7Sjruoho AcpiPsHasCompletedScope (
89149703c7Sjruoho     ACPI_PARSE_STATE        *ParserState)
90149703c7Sjruoho {
91149703c7Sjruoho 
92149703c7Sjruoho     return ((BOOLEAN)
93149703c7Sjruoho             ((ParserState->Aml >= ParserState->Scope->ParseScope.ArgEnd ||
94149703c7Sjruoho              !ParserState->Scope->ParseScope.ArgCount)));
95149703c7Sjruoho }
96149703c7Sjruoho 
97149703c7Sjruoho 
98149703c7Sjruoho /*******************************************************************************
99149703c7Sjruoho  *
100149703c7Sjruoho  * FUNCTION:    AcpiPsInitScope
101149703c7Sjruoho  *
102149703c7Sjruoho  * PARAMETERS:  ParserState         - Current parser state object
103149703c7Sjruoho  *              Root                - the Root Node of this new scope
104149703c7Sjruoho  *
105149703c7Sjruoho  * RETURN:      Status
106149703c7Sjruoho  *
107149703c7Sjruoho  * DESCRIPTION: Allocate and init a new scope object
108149703c7Sjruoho  *
109149703c7Sjruoho  ******************************************************************************/
110149703c7Sjruoho 
111149703c7Sjruoho ACPI_STATUS
AcpiPsInitScope(ACPI_PARSE_STATE * ParserState,ACPI_PARSE_OBJECT * RootOp)112149703c7Sjruoho AcpiPsInitScope (
113149703c7Sjruoho     ACPI_PARSE_STATE        *ParserState,
114149703c7Sjruoho     ACPI_PARSE_OBJECT       *RootOp)
115149703c7Sjruoho {
116149703c7Sjruoho     ACPI_GENERIC_STATE      *Scope;
117149703c7Sjruoho 
118149703c7Sjruoho 
119149703c7Sjruoho     ACPI_FUNCTION_TRACE_PTR (PsInitScope, RootOp);
120149703c7Sjruoho 
121149703c7Sjruoho 
122149703c7Sjruoho     Scope = AcpiUtCreateGenericState ();
123149703c7Sjruoho     if (!Scope)
124149703c7Sjruoho     {
125149703c7Sjruoho         return_ACPI_STATUS (AE_NO_MEMORY);
126149703c7Sjruoho     }
127149703c7Sjruoho 
128149703c7Sjruoho     Scope->Common.DescriptorType = ACPI_DESC_TYPE_STATE_RPSCOPE;
129149703c7Sjruoho     Scope->ParseScope.Op = RootOp;
130149703c7Sjruoho     Scope->ParseScope.ArgCount = ACPI_VAR_ARGS;
131149703c7Sjruoho     Scope->ParseScope.ArgEnd = ParserState->AmlEnd;
132149703c7Sjruoho     Scope->ParseScope.PkgEnd = ParserState->AmlEnd;
133149703c7Sjruoho 
134149703c7Sjruoho     ParserState->Scope = Scope;
135149703c7Sjruoho     ParserState->StartOp = RootOp;
136149703c7Sjruoho 
137149703c7Sjruoho     return_ACPI_STATUS (AE_OK);
138149703c7Sjruoho }
139149703c7Sjruoho 
140149703c7Sjruoho 
141149703c7Sjruoho /*******************************************************************************
142149703c7Sjruoho  *
143149703c7Sjruoho  * FUNCTION:    AcpiPsPushScope
144149703c7Sjruoho  *
145149703c7Sjruoho  * PARAMETERS:  ParserState         - Current parser state object
146149703c7Sjruoho  *              Op                  - Current op to be pushed
147149703c7Sjruoho  *              RemainingArgs       - List of args remaining
148149703c7Sjruoho  *              ArgCount            - Fixed or variable number of args
149149703c7Sjruoho  *
150149703c7Sjruoho  * RETURN:      Status
151149703c7Sjruoho  *
152149703c7Sjruoho  * DESCRIPTION: Push current op to begin parsing its argument
153149703c7Sjruoho  *
154149703c7Sjruoho  ******************************************************************************/
155149703c7Sjruoho 
156149703c7Sjruoho ACPI_STATUS
AcpiPsPushScope(ACPI_PARSE_STATE * ParserState,ACPI_PARSE_OBJECT * Op,UINT32 RemainingArgs,UINT32 ArgCount)157149703c7Sjruoho AcpiPsPushScope (
158149703c7Sjruoho     ACPI_PARSE_STATE        *ParserState,
159149703c7Sjruoho     ACPI_PARSE_OBJECT       *Op,
160149703c7Sjruoho     UINT32                  RemainingArgs,
161149703c7Sjruoho     UINT32                  ArgCount)
162149703c7Sjruoho {
163149703c7Sjruoho     ACPI_GENERIC_STATE      *Scope;
164149703c7Sjruoho 
165149703c7Sjruoho 
166149703c7Sjruoho     ACPI_FUNCTION_TRACE_PTR (PsPushScope, Op);
167149703c7Sjruoho 
168149703c7Sjruoho 
169149703c7Sjruoho     Scope = AcpiUtCreateGenericState ();
170149703c7Sjruoho     if (!Scope)
171149703c7Sjruoho     {
172149703c7Sjruoho         return_ACPI_STATUS (AE_NO_MEMORY);
173149703c7Sjruoho     }
174149703c7Sjruoho 
175149703c7Sjruoho     Scope->Common.DescriptorType = ACPI_DESC_TYPE_STATE_PSCOPE;
176149703c7Sjruoho     Scope->ParseScope.Op = Op;
177149703c7Sjruoho     Scope->ParseScope.ArgList = RemainingArgs;
178149703c7Sjruoho     Scope->ParseScope.ArgCount = ArgCount;
179149703c7Sjruoho     Scope->ParseScope.PkgEnd = ParserState->PkgEnd;
180149703c7Sjruoho 
181149703c7Sjruoho     /* Push onto scope stack */
182149703c7Sjruoho 
183149703c7Sjruoho     AcpiUtPushGenericState (&ParserState->Scope, Scope);
184149703c7Sjruoho 
185149703c7Sjruoho     if (ArgCount == ACPI_VAR_ARGS)
186149703c7Sjruoho     {
187149703c7Sjruoho         /* Multiple arguments */
188149703c7Sjruoho 
189149703c7Sjruoho         Scope->ParseScope.ArgEnd = ParserState->PkgEnd;
190149703c7Sjruoho     }
191149703c7Sjruoho     else
192149703c7Sjruoho     {
193149703c7Sjruoho         /* Single argument */
194149703c7Sjruoho 
195149703c7Sjruoho         Scope->ParseScope.ArgEnd = ACPI_TO_POINTER (ACPI_MAX_PTR);
196149703c7Sjruoho     }
197149703c7Sjruoho 
198149703c7Sjruoho     return_ACPI_STATUS (AE_OK);
199149703c7Sjruoho }
200149703c7Sjruoho 
201149703c7Sjruoho 
202149703c7Sjruoho /*******************************************************************************
203149703c7Sjruoho  *
204149703c7Sjruoho  * FUNCTION:    AcpiPsPopScope
205149703c7Sjruoho  *
206149703c7Sjruoho  * PARAMETERS:  ParserState         - Current parser state object
207149703c7Sjruoho  *              Op                  - Where the popped op is returned
208149703c7Sjruoho  *              ArgList             - Where the popped "next argument" is
209149703c7Sjruoho  *                                    returned
210149703c7Sjruoho  *              ArgCount            - Count of objects in ArgList
211149703c7Sjruoho  *
212149703c7Sjruoho  * RETURN:      Status
213149703c7Sjruoho  *
214149703c7Sjruoho  * DESCRIPTION: Return to parsing a previous op
215149703c7Sjruoho  *
216149703c7Sjruoho  ******************************************************************************/
217149703c7Sjruoho 
218149703c7Sjruoho void
AcpiPsPopScope(ACPI_PARSE_STATE * ParserState,ACPI_PARSE_OBJECT ** Op,UINT32 * ArgList,UINT32 * ArgCount)219149703c7Sjruoho AcpiPsPopScope (
220149703c7Sjruoho     ACPI_PARSE_STATE        *ParserState,
221149703c7Sjruoho     ACPI_PARSE_OBJECT       **Op,
222149703c7Sjruoho     UINT32                  *ArgList,
223149703c7Sjruoho     UINT32                  *ArgCount)
224149703c7Sjruoho {
225149703c7Sjruoho     ACPI_GENERIC_STATE      *Scope = ParserState->Scope;
226149703c7Sjruoho 
227149703c7Sjruoho 
228149703c7Sjruoho     ACPI_FUNCTION_TRACE (PsPopScope);
229149703c7Sjruoho 
230149703c7Sjruoho 
231149703c7Sjruoho     /* Only pop the scope if there is in fact a next scope */
232149703c7Sjruoho 
233149703c7Sjruoho     if (Scope->Common.Next)
234149703c7Sjruoho     {
235149703c7Sjruoho         Scope = AcpiUtPopGenericState (&ParserState->Scope);
236149703c7Sjruoho 
237149703c7Sjruoho         /* Return to parsing previous op */
238149703c7Sjruoho 
239149703c7Sjruoho         *Op = Scope->ParseScope.Op;
240149703c7Sjruoho         *ArgList = Scope->ParseScope.ArgList;
241149703c7Sjruoho         *ArgCount = Scope->ParseScope.ArgCount;
242149703c7Sjruoho         ParserState->PkgEnd = Scope->ParseScope.PkgEnd;
243149703c7Sjruoho 
244149703c7Sjruoho         /* All done with this scope state structure */
245149703c7Sjruoho 
246149703c7Sjruoho         AcpiUtDeleteGenericState (Scope);
247149703c7Sjruoho     }
248149703c7Sjruoho     else
249149703c7Sjruoho     {
250149703c7Sjruoho         /* Empty parse stack, prepare to fetch next opcode */
251149703c7Sjruoho 
252149703c7Sjruoho         *Op = NULL;
253149703c7Sjruoho         *ArgList = 0;
254149703c7Sjruoho         *ArgCount = 0;
255149703c7Sjruoho     }
256149703c7Sjruoho 
257149703c7Sjruoho     ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
258149703c7Sjruoho         "Popped Op %p Args %X\n", *Op, *ArgCount));
259149703c7Sjruoho     return_VOID;
260149703c7Sjruoho }
261149703c7Sjruoho 
262149703c7Sjruoho 
263149703c7Sjruoho /*******************************************************************************
264149703c7Sjruoho  *
265149703c7Sjruoho  * FUNCTION:    AcpiPsCleanupScope
266149703c7Sjruoho  *
267149703c7Sjruoho  * PARAMETERS:  ParserState         - Current parser state object
268149703c7Sjruoho  *
269149703c7Sjruoho  * RETURN:      None
270149703c7Sjruoho  *
271149703c7Sjruoho  * DESCRIPTION: Destroy available list, remaining stack levels, and return
272149703c7Sjruoho  *              root scope
273149703c7Sjruoho  *
274149703c7Sjruoho  ******************************************************************************/
275149703c7Sjruoho 
276149703c7Sjruoho void
AcpiPsCleanupScope(ACPI_PARSE_STATE * ParserState)277149703c7Sjruoho AcpiPsCleanupScope (
278149703c7Sjruoho     ACPI_PARSE_STATE        *ParserState)
279149703c7Sjruoho {
280149703c7Sjruoho     ACPI_GENERIC_STATE      *Scope;
281149703c7Sjruoho 
282149703c7Sjruoho 
283149703c7Sjruoho     ACPI_FUNCTION_TRACE_PTR (PsCleanupScope, ParserState);
284149703c7Sjruoho 
285149703c7Sjruoho 
286149703c7Sjruoho     if (!ParserState)
287149703c7Sjruoho     {
288149703c7Sjruoho         return_VOID;
289149703c7Sjruoho     }
290149703c7Sjruoho 
291149703c7Sjruoho     /* Delete anything on the scope stack */
292149703c7Sjruoho 
293149703c7Sjruoho     while (ParserState->Scope)
294149703c7Sjruoho     {
295149703c7Sjruoho         Scope = AcpiUtPopGenericState (&ParserState->Scope);
296149703c7Sjruoho         AcpiUtDeleteGenericState (Scope);
297149703c7Sjruoho     }
298149703c7Sjruoho 
299149703c7Sjruoho     return_VOID;
300149703c7Sjruoho }
301