1db2bae30SDana Myers /****************************************************************************** 2db2bae30SDana Myers * 3db2bae30SDana Myers * Module Name: psscope - Parser scope stack management routines 4db2bae30SDana Myers * 5db2bae30SDana Myers *****************************************************************************/ 6db2bae30SDana Myers 726f3cdf0SGordon Ross /* 8*385cc6b4SJerry Jelinek * Copyright (C) 2000 - 2016, Intel Corp. 9db2bae30SDana Myers * All rights reserved. 10db2bae30SDana Myers * 1126f3cdf0SGordon Ross * Redistribution and use in source and binary forms, with or without 1226f3cdf0SGordon Ross * modification, are permitted provided that the following conditions 1326f3cdf0SGordon Ross * are met: 1426f3cdf0SGordon Ross * 1. Redistributions of source code must retain the above copyright 1526f3cdf0SGordon Ross * notice, this list of conditions, and the following disclaimer, 1626f3cdf0SGordon Ross * without modification. 1726f3cdf0SGordon Ross * 2. Redistributions in binary form must reproduce at minimum a disclaimer 1826f3cdf0SGordon Ross * substantially similar to the "NO WARRANTY" disclaimer below 1926f3cdf0SGordon Ross * ("Disclaimer") and any redistribution must be conditioned upon 2026f3cdf0SGordon Ross * including a substantially similar Disclaimer requirement for further 2126f3cdf0SGordon Ross * binary redistribution. 2226f3cdf0SGordon Ross * 3. Neither the names of the above-listed copyright holders nor the names 2326f3cdf0SGordon Ross * of any contributors may be used to endorse or promote products derived 2426f3cdf0SGordon Ross * from this software without specific prior written permission. 25db2bae30SDana Myers * 2626f3cdf0SGordon Ross * Alternatively, this software may be distributed under the terms of the 2726f3cdf0SGordon Ross * GNU General Public License ("GPL") version 2 as published by the Free 2826f3cdf0SGordon Ross * Software Foundation. 29db2bae30SDana Myers * 3026f3cdf0SGordon Ross * NO WARRANTY 3126f3cdf0SGordon Ross * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 3226f3cdf0SGordon Ross * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 3326f3cdf0SGordon Ross * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 3426f3cdf0SGordon Ross * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3526f3cdf0SGordon Ross * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 3626f3cdf0SGordon Ross * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 3726f3cdf0SGordon Ross * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3826f3cdf0SGordon Ross * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 3926f3cdf0SGordon Ross * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 4026f3cdf0SGordon Ross * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 4126f3cdf0SGordon Ross * POSSIBILITY OF SUCH DAMAGES. 4226f3cdf0SGordon Ross */ 43db2bae30SDana Myers 44db2bae30SDana Myers #include "acpi.h" 45aa2aa9a6SDana Myers #include "accommon.h" 46db2bae30SDana Myers #include "acparser.h" 47db2bae30SDana Myers 48db2bae30SDana Myers #define _COMPONENT ACPI_PARSER 49db2bae30SDana Myers ACPI_MODULE_NAME ("psscope") 50db2bae30SDana Myers 51db2bae30SDana Myers 52db2bae30SDana Myers /******************************************************************************* 53db2bae30SDana Myers * 54db2bae30SDana Myers * FUNCTION: AcpiPsGetParentScope 55db2bae30SDana Myers * 56db2bae30SDana Myers * PARAMETERS: ParserState - Current parser state object 57db2bae30SDana Myers * 58db2bae30SDana Myers * RETURN: Pointer to an Op object 59db2bae30SDana Myers * 60db2bae30SDana Myers * DESCRIPTION: Get parent of current op being parsed 61db2bae30SDana Myers * 62db2bae30SDana Myers ******************************************************************************/ 63db2bae30SDana Myers 64db2bae30SDana Myers ACPI_PARSE_OBJECT * 65db2bae30SDana Myers AcpiPsGetParentScope ( 66db2bae30SDana Myers ACPI_PARSE_STATE *ParserState) 67db2bae30SDana Myers { 68db2bae30SDana Myers 69db2bae30SDana Myers return (ParserState->Scope->ParseScope.Op); 70db2bae30SDana Myers } 71db2bae30SDana Myers 72db2bae30SDana Myers 73db2bae30SDana Myers /******************************************************************************* 74db2bae30SDana Myers * 75db2bae30SDana Myers * FUNCTION: AcpiPsHasCompletedScope 76db2bae30SDana Myers * 77db2bae30SDana Myers * PARAMETERS: ParserState - Current parser state object 78db2bae30SDana Myers * 79db2bae30SDana Myers * RETURN: Boolean, TRUE = scope completed. 80db2bae30SDana Myers * 81db2bae30SDana Myers * DESCRIPTION: Is parsing of current argument complete? Determined by 82db2bae30SDana Myers * 1) AML pointer is at or beyond the end of the scope 83db2bae30SDana Myers * 2) The scope argument count has reached zero. 84db2bae30SDana Myers * 85db2bae30SDana Myers ******************************************************************************/ 86db2bae30SDana Myers 87db2bae30SDana Myers BOOLEAN 88db2bae30SDana Myers AcpiPsHasCompletedScope ( 89db2bae30SDana Myers ACPI_PARSE_STATE *ParserState) 90db2bae30SDana Myers { 91db2bae30SDana Myers 92db2bae30SDana Myers return ((BOOLEAN) 93db2bae30SDana Myers ((ParserState->Aml >= ParserState->Scope->ParseScope.ArgEnd || 94db2bae30SDana Myers !ParserState->Scope->ParseScope.ArgCount))); 95db2bae30SDana Myers } 96db2bae30SDana Myers 97db2bae30SDana Myers 98db2bae30SDana Myers /******************************************************************************* 99db2bae30SDana Myers * 100db2bae30SDana Myers * FUNCTION: AcpiPsInitScope 101db2bae30SDana Myers * 102db2bae30SDana Myers * PARAMETERS: ParserState - Current parser state object 103db2bae30SDana Myers * Root - the Root Node of this new scope 104db2bae30SDana Myers * 105db2bae30SDana Myers * RETURN: Status 106db2bae30SDana Myers * 107db2bae30SDana Myers * DESCRIPTION: Allocate and init a new scope object 108db2bae30SDana Myers * 109db2bae30SDana Myers ******************************************************************************/ 110db2bae30SDana Myers 111db2bae30SDana Myers ACPI_STATUS 112db2bae30SDana Myers AcpiPsInitScope ( 113db2bae30SDana Myers ACPI_PARSE_STATE *ParserState, 114db2bae30SDana Myers ACPI_PARSE_OBJECT *RootOp) 115db2bae30SDana Myers { 116db2bae30SDana Myers ACPI_GENERIC_STATE *Scope; 117db2bae30SDana Myers 118db2bae30SDana Myers 119db2bae30SDana Myers ACPI_FUNCTION_TRACE_PTR (PsInitScope, RootOp); 120db2bae30SDana Myers 121db2bae30SDana Myers 122db2bae30SDana Myers Scope = AcpiUtCreateGenericState (); 123db2bae30SDana Myers if (!Scope) 124db2bae30SDana Myers { 125db2bae30SDana Myers return_ACPI_STATUS (AE_NO_MEMORY); 126db2bae30SDana Myers } 127db2bae30SDana Myers 128db2bae30SDana Myers Scope->Common.DescriptorType = ACPI_DESC_TYPE_STATE_RPSCOPE; 129db2bae30SDana Myers Scope->ParseScope.Op = RootOp; 130db2bae30SDana Myers Scope->ParseScope.ArgCount = ACPI_VAR_ARGS; 131db2bae30SDana Myers Scope->ParseScope.ArgEnd = ParserState->AmlEnd; 132db2bae30SDana Myers Scope->ParseScope.PkgEnd = ParserState->AmlEnd; 133db2bae30SDana Myers 134db2bae30SDana Myers ParserState->Scope = Scope; 135db2bae30SDana Myers ParserState->StartOp = RootOp; 136db2bae30SDana Myers 137db2bae30SDana Myers return_ACPI_STATUS (AE_OK); 138db2bae30SDana Myers } 139db2bae30SDana Myers 140db2bae30SDana Myers 141db2bae30SDana Myers /******************************************************************************* 142db2bae30SDana Myers * 143db2bae30SDana Myers * FUNCTION: AcpiPsPushScope 144db2bae30SDana Myers * 145db2bae30SDana Myers * PARAMETERS: ParserState - Current parser state object 146db2bae30SDana Myers * Op - Current op to be pushed 147db2bae30SDana Myers * RemainingArgs - List of args remaining 148db2bae30SDana Myers * ArgCount - Fixed or variable number of args 149db2bae30SDana Myers * 150db2bae30SDana Myers * RETURN: Status 151db2bae30SDana Myers * 152db2bae30SDana Myers * DESCRIPTION: Push current op to begin parsing its argument 153db2bae30SDana Myers * 154db2bae30SDana Myers ******************************************************************************/ 155db2bae30SDana Myers 156db2bae30SDana Myers ACPI_STATUS 157db2bae30SDana Myers AcpiPsPushScope ( 158db2bae30SDana Myers ACPI_PARSE_STATE *ParserState, 159db2bae30SDana Myers ACPI_PARSE_OBJECT *Op, 160db2bae30SDana Myers UINT32 RemainingArgs, 161db2bae30SDana Myers UINT32 ArgCount) 162db2bae30SDana Myers { 163db2bae30SDana Myers ACPI_GENERIC_STATE *Scope; 164db2bae30SDana Myers 165db2bae30SDana Myers 166db2bae30SDana Myers ACPI_FUNCTION_TRACE_PTR (PsPushScope, Op); 167db2bae30SDana Myers 168db2bae30SDana Myers 169db2bae30SDana Myers Scope = AcpiUtCreateGenericState (); 170db2bae30SDana Myers if (!Scope) 171db2bae30SDana Myers { 172db2bae30SDana Myers return_ACPI_STATUS (AE_NO_MEMORY); 173db2bae30SDana Myers } 174db2bae30SDana Myers 175db2bae30SDana Myers Scope->Common.DescriptorType = ACPI_DESC_TYPE_STATE_PSCOPE; 176db2bae30SDana Myers Scope->ParseScope.Op = Op; 177db2bae30SDana Myers Scope->ParseScope.ArgList = RemainingArgs; 178db2bae30SDana Myers Scope->ParseScope.ArgCount = ArgCount; 179db2bae30SDana Myers Scope->ParseScope.PkgEnd = ParserState->PkgEnd; 180db2bae30SDana Myers 181db2bae30SDana Myers /* Push onto scope stack */ 182db2bae30SDana Myers 183db2bae30SDana Myers AcpiUtPushGenericState (&ParserState->Scope, Scope); 184db2bae30SDana Myers 185db2bae30SDana Myers if (ArgCount == ACPI_VAR_ARGS) 186db2bae30SDana Myers { 187db2bae30SDana Myers /* Multiple arguments */ 188db2bae30SDana Myers 189db2bae30SDana Myers Scope->ParseScope.ArgEnd = ParserState->PkgEnd; 190db2bae30SDana Myers } 191db2bae30SDana Myers else 192db2bae30SDana Myers { 193db2bae30SDana Myers /* Single argument */ 194db2bae30SDana Myers 195db2bae30SDana Myers Scope->ParseScope.ArgEnd = ACPI_TO_POINTER (ACPI_MAX_PTR); 196db2bae30SDana Myers } 197db2bae30SDana Myers 198db2bae30SDana Myers return_ACPI_STATUS (AE_OK); 199db2bae30SDana Myers } 200db2bae30SDana Myers 201db2bae30SDana Myers 202db2bae30SDana Myers /******************************************************************************* 203db2bae30SDana Myers * 204db2bae30SDana Myers * FUNCTION: AcpiPsPopScope 205db2bae30SDana Myers * 206db2bae30SDana Myers * PARAMETERS: ParserState - Current parser state object 207db2bae30SDana Myers * Op - Where the popped op is returned 208db2bae30SDana Myers * ArgList - Where the popped "next argument" is 209db2bae30SDana Myers * returned 210db2bae30SDana Myers * ArgCount - Count of objects in ArgList 211db2bae30SDana Myers * 212db2bae30SDana Myers * RETURN: Status 213db2bae30SDana Myers * 214db2bae30SDana Myers * DESCRIPTION: Return to parsing a previous op 215db2bae30SDana Myers * 216db2bae30SDana Myers ******************************************************************************/ 217db2bae30SDana Myers 218db2bae30SDana Myers void 219db2bae30SDana Myers AcpiPsPopScope ( 220db2bae30SDana Myers ACPI_PARSE_STATE *ParserState, 221db2bae30SDana Myers ACPI_PARSE_OBJECT **Op, 222db2bae30SDana Myers UINT32 *ArgList, 223db2bae30SDana Myers UINT32 *ArgCount) 224db2bae30SDana Myers { 225db2bae30SDana Myers ACPI_GENERIC_STATE *Scope = ParserState->Scope; 226db2bae30SDana Myers 227db2bae30SDana Myers 228db2bae30SDana Myers ACPI_FUNCTION_TRACE (PsPopScope); 229db2bae30SDana Myers 230db2bae30SDana Myers 231db2bae30SDana Myers /* Only pop the scope if there is in fact a next scope */ 232db2bae30SDana Myers 233db2bae30SDana Myers if (Scope->Common.Next) 234db2bae30SDana Myers { 235db2bae30SDana Myers Scope = AcpiUtPopGenericState (&ParserState->Scope); 236db2bae30SDana Myers 237db2bae30SDana Myers /* Return to parsing previous op */ 238db2bae30SDana Myers 239db2bae30SDana Myers *Op = Scope->ParseScope.Op; 240db2bae30SDana Myers *ArgList = Scope->ParseScope.ArgList; 241db2bae30SDana Myers *ArgCount = Scope->ParseScope.ArgCount; 242db2bae30SDana Myers ParserState->PkgEnd = Scope->ParseScope.PkgEnd; 243db2bae30SDana Myers 244db2bae30SDana Myers /* All done with this scope state structure */ 245db2bae30SDana Myers 246db2bae30SDana Myers AcpiUtDeleteGenericState (Scope); 247db2bae30SDana Myers } 248db2bae30SDana Myers else 249db2bae30SDana Myers { 250db2bae30SDana Myers /* Empty parse stack, prepare to fetch next opcode */ 251db2bae30SDana Myers 252db2bae30SDana Myers *Op = NULL; 253db2bae30SDana Myers *ArgList = 0; 254db2bae30SDana Myers *ArgCount = 0; 255db2bae30SDana Myers } 256db2bae30SDana Myers 257db2bae30SDana Myers ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, 258db2bae30SDana Myers "Popped Op %p Args %X\n", *Op, *ArgCount)); 259db2bae30SDana Myers return_VOID; 260db2bae30SDana Myers } 261db2bae30SDana Myers 262db2bae30SDana Myers 263db2bae30SDana Myers /******************************************************************************* 264db2bae30SDana Myers * 265db2bae30SDana Myers * FUNCTION: AcpiPsCleanupScope 266db2bae30SDana Myers * 267db2bae30SDana Myers * PARAMETERS: ParserState - Current parser state object 268db2bae30SDana Myers * 269db2bae30SDana Myers * RETURN: None 270db2bae30SDana Myers * 271db2bae30SDana Myers * DESCRIPTION: Destroy available list, remaining stack levels, and return 272db2bae30SDana Myers * root scope 273db2bae30SDana Myers * 274db2bae30SDana Myers ******************************************************************************/ 275db2bae30SDana Myers 276db2bae30SDana Myers void 277db2bae30SDana Myers AcpiPsCleanupScope ( 278db2bae30SDana Myers ACPI_PARSE_STATE *ParserState) 279db2bae30SDana Myers { 280db2bae30SDana Myers ACPI_GENERIC_STATE *Scope; 281db2bae30SDana Myers 282db2bae30SDana Myers 283db2bae30SDana Myers ACPI_FUNCTION_TRACE_PTR (PsCleanupScope, ParserState); 284db2bae30SDana Myers 285db2bae30SDana Myers 286db2bae30SDana Myers if (!ParserState) 287db2bae30SDana Myers { 288db2bae30SDana Myers return_VOID; 289db2bae30SDana Myers } 290db2bae30SDana Myers 291db2bae30SDana Myers /* Delete anything on the scope stack */ 292db2bae30SDana Myers 293db2bae30SDana Myers while (ParserState->Scope) 294db2bae30SDana Myers { 295db2bae30SDana Myers Scope = AcpiUtPopGenericState (&ParserState->Scope); 296db2bae30SDana Myers AcpiUtDeleteGenericState (Scope); 297db2bae30SDana Myers } 298db2bae30SDana Myers 299db2bae30SDana Myers return_VOID; 300db2bae30SDana Myers } 301