1149703c7Sjruoho /****************************************************************************** 2149703c7Sjruoho * 3149703c7Sjruoho * Module Name: psutils - Parser miscellaneous utilities (Parser only) 4149703c7Sjruoho * 5149703c7Sjruoho *****************************************************************************/ 6149703c7Sjruoho 768471b32Sjruoho /* 8*5fe1040dSchristos * Copyright (C) 2000 - 2016, 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 3368471b32Sjruoho * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY 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 #include "amlcode.h" 48149703c7Sjruoho 49149703c7Sjruoho #define _COMPONENT ACPI_PARSER 50149703c7Sjruoho ACPI_MODULE_NAME ("psutils") 51149703c7Sjruoho 52149703c7Sjruoho 53149703c7Sjruoho /******************************************************************************* 54149703c7Sjruoho * 55149703c7Sjruoho * FUNCTION: AcpiPsCreateScopeOp 56149703c7Sjruoho * 57149703c7Sjruoho * PARAMETERS: None 58149703c7Sjruoho * 59149703c7Sjruoho * RETURN: A new Scope object, null on failure 60149703c7Sjruoho * 61149703c7Sjruoho * DESCRIPTION: Create a Scope and associated namepath op with the root name 62149703c7Sjruoho * 63149703c7Sjruoho ******************************************************************************/ 64149703c7Sjruoho 65149703c7Sjruoho ACPI_PARSE_OBJECT * 66149703c7Sjruoho AcpiPsCreateScopeOp ( 67db5c6ae1Schristos UINT8 *Aml) 68149703c7Sjruoho { 69149703c7Sjruoho ACPI_PARSE_OBJECT *ScopeOp; 70149703c7Sjruoho 71149703c7Sjruoho 72db5c6ae1Schristos ScopeOp = AcpiPsAllocOp (AML_SCOPE_OP, Aml); 73149703c7Sjruoho if (!ScopeOp) 74149703c7Sjruoho { 75149703c7Sjruoho return (NULL); 76149703c7Sjruoho } 77149703c7Sjruoho 78149703c7Sjruoho ScopeOp->Named.Name = ACPI_ROOT_NAME; 79149703c7Sjruoho return (ScopeOp); 80149703c7Sjruoho } 81149703c7Sjruoho 82149703c7Sjruoho 83149703c7Sjruoho /******************************************************************************* 84149703c7Sjruoho * 85149703c7Sjruoho * FUNCTION: AcpiPsInitOp 86149703c7Sjruoho * 87149703c7Sjruoho * PARAMETERS: Op - A newly allocated Op object 88149703c7Sjruoho * Opcode - Opcode to store in the Op 89149703c7Sjruoho * 90149703c7Sjruoho * RETURN: None 91149703c7Sjruoho * 92149703c7Sjruoho * DESCRIPTION: Initialize a parse (Op) object 93149703c7Sjruoho * 94149703c7Sjruoho ******************************************************************************/ 95149703c7Sjruoho 96149703c7Sjruoho void 97149703c7Sjruoho AcpiPsInitOp ( 98149703c7Sjruoho ACPI_PARSE_OBJECT *Op, 99149703c7Sjruoho UINT16 Opcode) 100149703c7Sjruoho { 101149703c7Sjruoho ACPI_FUNCTION_ENTRY (); 102149703c7Sjruoho 103149703c7Sjruoho 104149703c7Sjruoho Op->Common.DescriptorType = ACPI_DESC_TYPE_PARSER; 105149703c7Sjruoho Op->Common.AmlOpcode = Opcode; 106149703c7Sjruoho 107db5c6ae1Schristos ACPI_DISASM_ONLY_MEMBERS (strncpy (Op->Common.AmlOpName, 108149703c7Sjruoho (AcpiPsGetOpcodeInfo (Opcode))->Name, 109149703c7Sjruoho sizeof (Op->Common.AmlOpName))); 110149703c7Sjruoho } 111149703c7Sjruoho 112149703c7Sjruoho 113149703c7Sjruoho /******************************************************************************* 114149703c7Sjruoho * 115149703c7Sjruoho * FUNCTION: AcpiPsAllocOp 116149703c7Sjruoho * 117149703c7Sjruoho * PARAMETERS: Opcode - Opcode that will be stored in the new Op 118db5c6ae1Schristos * Aml - Address of the opcode 119149703c7Sjruoho * 120149703c7Sjruoho * RETURN: Pointer to the new Op, null on failure 121149703c7Sjruoho * 122149703c7Sjruoho * DESCRIPTION: Allocate an acpi_op, choose op type (and thus size) based on 123149703c7Sjruoho * opcode. A cache of opcodes is available for the pure 124149703c7Sjruoho * GENERIC_OP, since this is by far the most commonly used. 125149703c7Sjruoho * 126149703c7Sjruoho ******************************************************************************/ 127149703c7Sjruoho 128149703c7Sjruoho ACPI_PARSE_OBJECT* 129149703c7Sjruoho AcpiPsAllocOp ( 130db5c6ae1Schristos UINT16 Opcode, 131db5c6ae1Schristos UINT8 *Aml) 132149703c7Sjruoho { 133149703c7Sjruoho ACPI_PARSE_OBJECT *Op; 134149703c7Sjruoho const ACPI_OPCODE_INFO *OpInfo; 135149703c7Sjruoho UINT8 Flags = ACPI_PARSEOP_GENERIC; 136149703c7Sjruoho 137149703c7Sjruoho 138149703c7Sjruoho ACPI_FUNCTION_ENTRY (); 139149703c7Sjruoho 140149703c7Sjruoho 141149703c7Sjruoho OpInfo = AcpiPsGetOpcodeInfo (Opcode); 142149703c7Sjruoho 143149703c7Sjruoho /* Determine type of ParseOp required */ 144149703c7Sjruoho 145149703c7Sjruoho if (OpInfo->Flags & AML_DEFER) 146149703c7Sjruoho { 147149703c7Sjruoho Flags = ACPI_PARSEOP_DEFERRED; 148149703c7Sjruoho } 149149703c7Sjruoho else if (OpInfo->Flags & AML_NAMED) 150149703c7Sjruoho { 151149703c7Sjruoho Flags = ACPI_PARSEOP_NAMED; 152149703c7Sjruoho } 153149703c7Sjruoho else if (Opcode == AML_INT_BYTELIST_OP) 154149703c7Sjruoho { 155149703c7Sjruoho Flags = ACPI_PARSEOP_BYTELIST; 156149703c7Sjruoho } 157149703c7Sjruoho 158149703c7Sjruoho /* Allocate the minimum required size object */ 159149703c7Sjruoho 160149703c7Sjruoho if (Flags == ACPI_PARSEOP_GENERIC) 161149703c7Sjruoho { 162149703c7Sjruoho /* The generic op (default) is by far the most common (16 to 1) */ 163149703c7Sjruoho 164149703c7Sjruoho Op = AcpiOsAcquireObject (AcpiGbl_PsNodeCache); 165149703c7Sjruoho } 166149703c7Sjruoho else 167149703c7Sjruoho { 168149703c7Sjruoho /* Extended parseop */ 169149703c7Sjruoho 170149703c7Sjruoho Op = AcpiOsAcquireObject (AcpiGbl_PsNodeExtCache); 171149703c7Sjruoho } 172149703c7Sjruoho 173149703c7Sjruoho /* Initialize the Op */ 174149703c7Sjruoho 175149703c7Sjruoho if (Op) 176149703c7Sjruoho { 177149703c7Sjruoho AcpiPsInitOp (Op, Opcode); 178db5c6ae1Schristos Op->Common.Aml = Aml; 179149703c7Sjruoho Op->Common.Flags = Flags; 180149703c7Sjruoho } 181149703c7Sjruoho 182149703c7Sjruoho return (Op); 183149703c7Sjruoho } 184149703c7Sjruoho 185149703c7Sjruoho 186149703c7Sjruoho /******************************************************************************* 187149703c7Sjruoho * 188149703c7Sjruoho * FUNCTION: AcpiPsFreeOp 189149703c7Sjruoho * 190149703c7Sjruoho * PARAMETERS: Op - Op to be freed 191149703c7Sjruoho * 192149703c7Sjruoho * RETURN: None. 193149703c7Sjruoho * 194149703c7Sjruoho * DESCRIPTION: Free an Op object. Either put it on the GENERIC_OP cache list 195149703c7Sjruoho * or actually free it. 196149703c7Sjruoho * 197149703c7Sjruoho ******************************************************************************/ 198149703c7Sjruoho 199149703c7Sjruoho void 200149703c7Sjruoho AcpiPsFreeOp ( 201149703c7Sjruoho ACPI_PARSE_OBJECT *Op) 202149703c7Sjruoho { 203149703c7Sjruoho ACPI_FUNCTION_NAME (PsFreeOp); 204149703c7Sjruoho 205149703c7Sjruoho 206149703c7Sjruoho if (Op->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP) 207149703c7Sjruoho { 208*5fe1040dSchristos ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, 209*5fe1040dSchristos "Free retval op: %p\n", Op)); 210149703c7Sjruoho } 211149703c7Sjruoho 212149703c7Sjruoho if (Op->Common.Flags & ACPI_PARSEOP_GENERIC) 213149703c7Sjruoho { 214149703c7Sjruoho (void) AcpiOsReleaseObject (AcpiGbl_PsNodeCache, Op); 215149703c7Sjruoho } 216149703c7Sjruoho else 217149703c7Sjruoho { 218149703c7Sjruoho (void) AcpiOsReleaseObject (AcpiGbl_PsNodeExtCache, Op); 219149703c7Sjruoho } 220149703c7Sjruoho } 221149703c7Sjruoho 222149703c7Sjruoho 223149703c7Sjruoho /******************************************************************************* 224149703c7Sjruoho * 225149703c7Sjruoho * FUNCTION: Utility functions 226149703c7Sjruoho * 227149703c7Sjruoho * DESCRIPTION: Low level character and object functions 228149703c7Sjruoho * 229149703c7Sjruoho ******************************************************************************/ 230149703c7Sjruoho 231149703c7Sjruoho 232149703c7Sjruoho /* 233149703c7Sjruoho * Is "c" a namestring lead character? 234149703c7Sjruoho */ 235149703c7Sjruoho BOOLEAN 236149703c7Sjruoho AcpiPsIsLeadingChar ( 237149703c7Sjruoho UINT32 c) 238149703c7Sjruoho { 239149703c7Sjruoho return ((BOOLEAN) (c == '_' || (c >= 'A' && c <= 'Z'))); 240149703c7Sjruoho } 241149703c7Sjruoho 242149703c7Sjruoho 243149703c7Sjruoho /* 244149703c7Sjruoho * Get op's name (4-byte name segment) or 0 if unnamed 245149703c7Sjruoho */ 246149703c7Sjruoho UINT32 247149703c7Sjruoho AcpiPsGetName ( 248149703c7Sjruoho ACPI_PARSE_OBJECT *Op) 249149703c7Sjruoho { 250149703c7Sjruoho 251149703c7Sjruoho /* The "generic" object has no name associated with it */ 252149703c7Sjruoho 253149703c7Sjruoho if (Op->Common.Flags & ACPI_PARSEOP_GENERIC) 254149703c7Sjruoho { 255149703c7Sjruoho return (0); 256149703c7Sjruoho } 257149703c7Sjruoho 258149703c7Sjruoho /* Only the "Extended" parse objects have a name */ 259149703c7Sjruoho 260149703c7Sjruoho return (Op->Named.Name); 261149703c7Sjruoho } 262149703c7Sjruoho 263149703c7Sjruoho 264149703c7Sjruoho /* 265149703c7Sjruoho * Set op's name 266149703c7Sjruoho */ 267149703c7Sjruoho void 268149703c7Sjruoho AcpiPsSetName ( 269149703c7Sjruoho ACPI_PARSE_OBJECT *Op, 270149703c7Sjruoho UINT32 name) 271149703c7Sjruoho { 272149703c7Sjruoho 273149703c7Sjruoho /* The "generic" object has no name associated with it */ 274149703c7Sjruoho 275149703c7Sjruoho if (Op->Common.Flags & ACPI_PARSEOP_GENERIC) 276149703c7Sjruoho { 277149703c7Sjruoho return; 278149703c7Sjruoho } 279149703c7Sjruoho 280149703c7Sjruoho Op->Named.Name = name; 281149703c7Sjruoho } 282