1 /****************************************************************************** 2 * 3 * Module Name: psutils - Parser miscellaneous utilities (Parser only) 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2016, Intel Corp. 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions, and the following disclaimer, 16 * without modification. 17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18 * substantially similar to the "NO WARRANTY" disclaimer below 19 * ("Disclaimer") and any redistribution must be conditioned upon 20 * including a substantially similar Disclaimer requirement for further 21 * binary redistribution. 22 * 3. Neither the names of the above-listed copyright holders nor the names 23 * of any contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * Alternatively, this software may be distributed under the terms of the 27 * GNU General Public License ("GPL") version 2 as published by the Free 28 * Software Foundation. 29 * 30 * NO WARRANTY 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41 * POSSIBILITY OF SUCH DAMAGES. 42 */ 43 44 #include "acpi.h" 45 #include "accommon.h" 46 #include "acparser.h" 47 #include "amlcode.h" 48 49 #define _COMPONENT ACPI_PARSER 50 ACPI_MODULE_NAME ("psutils") 51 52 53 /******************************************************************************* 54 * 55 * FUNCTION: AcpiPsCreateScopeOp 56 * 57 * PARAMETERS: None 58 * 59 * RETURN: A new Scope object, null on failure 60 * 61 * DESCRIPTION: Create a Scope and associated namepath op with the root name 62 * 63 ******************************************************************************/ 64 65 ACPI_PARSE_OBJECT * 66 AcpiPsCreateScopeOp ( 67 UINT8 *Aml) 68 { 69 ACPI_PARSE_OBJECT *ScopeOp; 70 71 72 ScopeOp = AcpiPsAllocOp (AML_SCOPE_OP, Aml); 73 if (!ScopeOp) 74 { 75 return (NULL); 76 } 77 78 ScopeOp->Named.Name = ACPI_ROOT_NAME; 79 return (ScopeOp); 80 } 81 82 83 /******************************************************************************* 84 * 85 * FUNCTION: AcpiPsInitOp 86 * 87 * PARAMETERS: Op - A newly allocated Op object 88 * Opcode - Opcode to store in the Op 89 * 90 * RETURN: None 91 * 92 * DESCRIPTION: Initialize a parse (Op) object 93 * 94 ******************************************************************************/ 95 96 void 97 AcpiPsInitOp ( 98 ACPI_PARSE_OBJECT *Op, 99 UINT16 Opcode) 100 { 101 ACPI_FUNCTION_ENTRY (); 102 103 104 Op->Common.DescriptorType = ACPI_DESC_TYPE_PARSER; 105 Op->Common.AmlOpcode = Opcode; 106 107 ACPI_DISASM_ONLY_MEMBERS (strncpy (Op->Common.AmlOpName, 108 (AcpiPsGetOpcodeInfo (Opcode))->Name, 109 sizeof (Op->Common.AmlOpName))); 110 } 111 112 113 /******************************************************************************* 114 * 115 * FUNCTION: AcpiPsAllocOp 116 * 117 * PARAMETERS: Opcode - Opcode that will be stored in the new Op 118 * Aml - Address of the opcode 119 * 120 * RETURN: Pointer to the new Op, null on failure 121 * 122 * DESCRIPTION: Allocate an acpi_op, choose op type (and thus size) based on 123 * opcode. A cache of opcodes is available for the pure 124 * GENERIC_OP, since this is by far the most commonly used. 125 * 126 ******************************************************************************/ 127 128 ACPI_PARSE_OBJECT* 129 AcpiPsAllocOp ( 130 UINT16 Opcode, 131 UINT8 *Aml) 132 { 133 ACPI_PARSE_OBJECT *Op; 134 const ACPI_OPCODE_INFO *OpInfo; 135 UINT8 Flags = ACPI_PARSEOP_GENERIC; 136 137 138 ACPI_FUNCTION_ENTRY (); 139 140 141 OpInfo = AcpiPsGetOpcodeInfo (Opcode); 142 143 /* Determine type of ParseOp required */ 144 145 if (OpInfo->Flags & AML_DEFER) 146 { 147 Flags = ACPI_PARSEOP_DEFERRED; 148 } 149 else if (OpInfo->Flags & AML_NAMED) 150 { 151 Flags = ACPI_PARSEOP_NAMED_OBJECT; 152 } 153 else if (Opcode == AML_INT_BYTELIST_OP) 154 { 155 Flags = ACPI_PARSEOP_BYTELIST; 156 } 157 158 /* Allocate the minimum required size object */ 159 160 if (Flags == ACPI_PARSEOP_GENERIC) 161 { 162 /* The generic op (default) is by far the most common (16 to 1) */ 163 164 Op = AcpiOsAcquireObject (AcpiGbl_PsNodeCache); 165 } 166 else 167 { 168 /* Extended parseop */ 169 170 Op = AcpiOsAcquireObject (AcpiGbl_PsNodeExtCache); 171 } 172 173 /* Initialize the Op */ 174 175 if (Op) 176 { 177 AcpiPsInitOp (Op, Opcode); 178 Op->Common.Aml = Aml; 179 Op->Common.Flags = Flags; 180 } 181 182 return (Op); 183 } 184 185 186 /******************************************************************************* 187 * 188 * FUNCTION: AcpiPsFreeOp 189 * 190 * PARAMETERS: Op - Op to be freed 191 * 192 * RETURN: None. 193 * 194 * DESCRIPTION: Free an Op object. Either put it on the GENERIC_OP cache list 195 * or actually free it. 196 * 197 ******************************************************************************/ 198 199 void 200 AcpiPsFreeOp ( 201 ACPI_PARSE_OBJECT *Op) 202 { 203 ACPI_FUNCTION_NAME (PsFreeOp); 204 205 206 if (Op->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP) 207 { 208 ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, 209 "Free retval op: %p\n", Op)); 210 } 211 212 if (Op->Common.Flags & ACPI_PARSEOP_GENERIC) 213 { 214 (void) AcpiOsReleaseObject (AcpiGbl_PsNodeCache, Op); 215 } 216 else 217 { 218 (void) AcpiOsReleaseObject (AcpiGbl_PsNodeExtCache, Op); 219 } 220 } 221 222 223 /******************************************************************************* 224 * 225 * FUNCTION: Utility functions 226 * 227 * DESCRIPTION: Low level character and object functions 228 * 229 ******************************************************************************/ 230 231 232 /* 233 * Is "c" a namestring lead character? 234 */ 235 BOOLEAN 236 AcpiPsIsLeadingChar ( 237 UINT32 c) 238 { 239 return ((BOOLEAN) (c == '_' || (c >= 'A' && c <= 'Z'))); 240 } 241 242 243 /* 244 * Get op's name (4-byte name segment) or 0 if unnamed 245 */ 246 UINT32 247 AcpiPsGetName ( 248 ACPI_PARSE_OBJECT *Op) 249 { 250 251 /* The "generic" object has no name associated with it */ 252 253 if (Op->Common.Flags & ACPI_PARSEOP_GENERIC) 254 { 255 return (0); 256 } 257 258 /* Only the "Extended" parse objects have a name */ 259 260 return (Op->Named.Name); 261 } 262 263 264 /* 265 * Set op's name 266 */ 267 void 268 AcpiPsSetName ( 269 ACPI_PARSE_OBJECT *Op, 270 UINT32 name) 271 { 272 273 /* The "generic" object has no name associated with it */ 274 275 if (Op->Common.Flags & ACPI_PARSEOP_GENERIC) 276 { 277 return; 278 } 279 280 Op->Named.Name = name; 281 } 282