1 /****************************************************************************** 2 * 3 * Module Name: psutils - Parser miscellaneous utilities (Parser only) 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2014, 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 <contrib/dev/acpica/include/acpi.h> 45 #include <contrib/dev/acpica/include/accommon.h> 46 #include <contrib/dev/acpica/include/acparser.h> 47 #include <contrib/dev/acpica/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 void) 68 { 69 ACPI_PARSE_OBJECT *ScopeOp; 70 71 72 ScopeOp = AcpiPsAllocOp (AML_SCOPE_OP); 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 (ACPI_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 * 119 * RETURN: Pointer to the new Op, null on failure 120 * 121 * DESCRIPTION: Allocate an acpi_op, choose op type (and thus size) based on 122 * opcode. A cache of opcodes is available for the pure 123 * GENERIC_OP, since this is by far the most commonly used. 124 * 125 ******************************************************************************/ 126 127 ACPI_PARSE_OBJECT* 128 AcpiPsAllocOp ( 129 UINT16 Opcode) 130 { 131 ACPI_PARSE_OBJECT *Op; 132 const ACPI_OPCODE_INFO *OpInfo; 133 UINT8 Flags = ACPI_PARSEOP_GENERIC; 134 135 136 ACPI_FUNCTION_ENTRY (); 137 138 139 OpInfo = AcpiPsGetOpcodeInfo (Opcode); 140 141 /* Determine type of ParseOp required */ 142 143 if (OpInfo->Flags & AML_DEFER) 144 { 145 Flags = ACPI_PARSEOP_DEFERRED; 146 } 147 else if (OpInfo->Flags & AML_NAMED) 148 { 149 Flags = ACPI_PARSEOP_NAMED; 150 } 151 else if (Opcode == AML_INT_BYTELIST_OP) 152 { 153 Flags = ACPI_PARSEOP_BYTELIST; 154 } 155 156 /* Allocate the minimum required size object */ 157 158 if (Flags == ACPI_PARSEOP_GENERIC) 159 { 160 /* The generic op (default) is by far the most common (16 to 1) */ 161 162 Op = AcpiOsAcquireObject (AcpiGbl_PsNodeCache); 163 } 164 else 165 { 166 /* Extended parseop */ 167 168 Op = AcpiOsAcquireObject (AcpiGbl_PsNodeExtCache); 169 } 170 171 /* Initialize the Op */ 172 173 if (Op) 174 { 175 AcpiPsInitOp (Op, Opcode); 176 Op->Common.Flags = Flags; 177 } 178 179 return (Op); 180 } 181 182 183 /******************************************************************************* 184 * 185 * FUNCTION: AcpiPsFreeOp 186 * 187 * PARAMETERS: Op - Op to be freed 188 * 189 * RETURN: None. 190 * 191 * DESCRIPTION: Free an Op object. Either put it on the GENERIC_OP cache list 192 * or actually free it. 193 * 194 ******************************************************************************/ 195 196 void 197 AcpiPsFreeOp ( 198 ACPI_PARSE_OBJECT *Op) 199 { 200 ACPI_FUNCTION_NAME (PsFreeOp); 201 202 203 if (Op->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP) 204 { 205 ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "Free retval op: %p\n", Op)); 206 } 207 208 if (Op->Common.Flags & ACPI_PARSEOP_GENERIC) 209 { 210 (void) AcpiOsReleaseObject (AcpiGbl_PsNodeCache, Op); 211 } 212 else 213 { 214 (void) AcpiOsReleaseObject (AcpiGbl_PsNodeExtCache, Op); 215 } 216 } 217 218 219 /******************************************************************************* 220 * 221 * FUNCTION: Utility functions 222 * 223 * DESCRIPTION: Low level character and object functions 224 * 225 ******************************************************************************/ 226 227 228 /* 229 * Is "c" a namestring lead character? 230 */ 231 BOOLEAN 232 AcpiPsIsLeadingChar ( 233 UINT32 c) 234 { 235 return ((BOOLEAN) (c == '_' || (c >= 'A' && c <= 'Z'))); 236 } 237 238 239 /* 240 * Get op's name (4-byte name segment) or 0 if unnamed 241 */ 242 UINT32 243 AcpiPsGetName ( 244 ACPI_PARSE_OBJECT *Op) 245 { 246 247 /* The "generic" object has no name associated with it */ 248 249 if (Op->Common.Flags & ACPI_PARSEOP_GENERIC) 250 { 251 return (0); 252 } 253 254 /* Only the "Extended" parse objects have a name */ 255 256 return (Op->Named.Name); 257 } 258 259 260 /* 261 * Set op's name 262 */ 263 void 264 AcpiPsSetName ( 265 ACPI_PARSE_OBJECT *Op, 266 UINT32 name) 267 { 268 269 /* The "generic" object has no name associated with it */ 270 271 if (Op->Common.Flags & ACPI_PARSEOP_GENERIC) 272 { 273 return; 274 } 275 276 Op->Named.Name = name; 277 } 278