at v2.6.12 7.9 kB view raw
1/****************************************************************************** 2 * 3 * Module Name: psutils - Parser miscellaneous utilities (Parser only) 4 * 5 *****************************************************************************/ 6 7/* 8 * Copyright (C) 2000 - 2005, R. Byron Moore 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 45#include <acpi/acpi.h> 46#include <acpi/acparser.h> 47#include <acpi/amlcode.h> 48#include <acpi/acnamesp.h> 49 50#define _COMPONENT ACPI_PARSER 51 ACPI_MODULE_NAME ("psutils") 52 53 54/******************************************************************************* 55 * 56 * FUNCTION: acpi_ps_create_scope_op 57 * 58 * PARAMETERS: None 59 * 60 * RETURN: scope_op 61 * 62 * DESCRIPTION: Create a Scope and associated namepath op with the root name 63 * 64 ******************************************************************************/ 65 66union acpi_parse_object * 67acpi_ps_create_scope_op ( 68 void) 69{ 70 union acpi_parse_object *scope_op; 71 72 73 scope_op = acpi_ps_alloc_op (AML_SCOPE_OP); 74 if (!scope_op) { 75 return (NULL); 76 } 77 78 79 scope_op->named.name = ACPI_ROOT_NAME; 80 return (scope_op); 81} 82 83 84/******************************************************************************* 85 * 86 * FUNCTION: acpi_ps_init_op 87 * 88 * PARAMETERS: Op - A newly allocated Op object 89 * Opcode - Opcode to store in the Op 90 * 91 * RETURN: Status 92 * 93 * DESCRIPTION: Allocate an acpi_op, choose op type (and thus size) based on 94 * opcode 95 * 96 ******************************************************************************/ 97 98void 99acpi_ps_init_op ( 100 union acpi_parse_object *op, 101 u16 opcode) 102{ 103 ACPI_FUNCTION_ENTRY (); 104 105 106 op->common.data_type = ACPI_DESC_TYPE_PARSER; 107 op->common.aml_opcode = opcode; 108 109 ACPI_DISASM_ONLY_MEMBERS (ACPI_STRNCPY (op->common.aml_op_name, 110 (acpi_ps_get_opcode_info (opcode))->name, sizeof (op->common.aml_op_name))); 111} 112 113 114/******************************************************************************* 115 * 116 * FUNCTION: acpi_ps_alloc_op 117 * 118 * PARAMETERS: Opcode - Opcode that will be stored in the new Op 119 * 120 * RETURN: Pointer to the new Op. 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 128union acpi_parse_object* 129acpi_ps_alloc_op ( 130 u16 opcode) 131{ 132 union acpi_parse_object *op; 133 const struct acpi_opcode_info *op_info; 134 u8 flags = ACPI_PARSEOP_GENERIC; 135 136 137 ACPI_FUNCTION_ENTRY (); 138 139 140 op_info = acpi_ps_get_opcode_info (opcode); 141 142 /* Determine type of parse_op required */ 143 144 if (op_info->flags & AML_DEFER) { 145 flags = ACPI_PARSEOP_DEFERRED; 146 } 147 else if (op_info->flags & AML_NAMED) { 148 flags = ACPI_PARSEOP_NAMED; 149 } 150 else if (opcode == AML_INT_BYTELIST_OP) { 151 flags = ACPI_PARSEOP_BYTELIST; 152 } 153 154 /* Allocate the minimum required size object */ 155 156 if (flags == ACPI_PARSEOP_GENERIC) { 157 /* The generic op (default) is by far the most common (16 to 1) */ 158 159 op = acpi_ut_acquire_from_cache (ACPI_MEM_LIST_PSNODE); 160 } 161 else { 162 /* Extended parseop */ 163 164 op = acpi_ut_acquire_from_cache (ACPI_MEM_LIST_PSNODE_EXT); 165 } 166 167 /* Initialize the Op */ 168 169 if (op) { 170 acpi_ps_init_op (op, opcode); 171 op->common.flags = flags; 172 } 173 174 return (op); 175} 176 177 178/******************************************************************************* 179 * 180 * FUNCTION: acpi_ps_free_op 181 * 182 * PARAMETERS: Op - Op to be freed 183 * 184 * RETURN: None. 185 * 186 * DESCRIPTION: Free an Op object. Either put it on the GENERIC_OP cache list 187 * or actually free it. 188 * 189 ******************************************************************************/ 190 191void 192acpi_ps_free_op ( 193 union acpi_parse_object *op) 194{ 195 ACPI_FUNCTION_NAME ("ps_free_op"); 196 197 198 if (op->common.aml_opcode == AML_INT_RETURN_VALUE_OP) { 199 ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "Free retval op: %p\n", op)); 200 } 201 202 if (op->common.flags & ACPI_PARSEOP_GENERIC) { 203 acpi_ut_release_to_cache (ACPI_MEM_LIST_PSNODE, op); 204 } 205 else { 206 acpi_ut_release_to_cache (ACPI_MEM_LIST_PSNODE_EXT, op); 207 } 208} 209 210 211#ifdef ACPI_ENABLE_OBJECT_CACHE 212/******************************************************************************* 213 * 214 * FUNCTION: acpi_ps_delete_parse_cache 215 * 216 * PARAMETERS: None 217 * 218 * RETURN: None 219 * 220 * DESCRIPTION: Free all objects that are on the parse cache list. 221 * 222 ******************************************************************************/ 223 224void 225acpi_ps_delete_parse_cache ( 226 void) 227{ 228 ACPI_FUNCTION_TRACE ("ps_delete_parse_cache"); 229 230 231 acpi_ut_delete_generic_cache (ACPI_MEM_LIST_PSNODE); 232 acpi_ut_delete_generic_cache (ACPI_MEM_LIST_PSNODE_EXT); 233 return_VOID; 234} 235#endif 236 237 238/******************************************************************************* 239 * 240 * FUNCTION: Utility functions 241 * 242 * DESCRIPTION: Low level character and object functions 243 * 244 ******************************************************************************/ 245 246 247/* 248 * Is "c" a namestring lead character? 249 */ 250u8 251acpi_ps_is_leading_char ( 252 u32 c) 253{ 254 return ((u8) (c == '_' || (c >= 'A' && c <= 'Z'))); 255} 256 257 258/* 259 * Is "c" a namestring prefix character? 260 */ 261u8 262acpi_ps_is_prefix_char ( 263 u32 c) 264{ 265 return ((u8) (c == '\\' || c == '^')); 266} 267 268 269/* 270 * Get op's name (4-byte name segment) or 0 if unnamed 271 */ 272#ifdef ACPI_FUTURE_USAGE 273u32 274acpi_ps_get_name ( 275 union acpi_parse_object *op) 276{ 277 278 279 /* The "generic" object has no name associated with it */ 280 281 if (op->common.flags & ACPI_PARSEOP_GENERIC) { 282 return (0); 283 } 284 285 /* Only the "Extended" parse objects have a name */ 286 287 return (op->named.name); 288} 289#endif /* ACPI_FUTURE_USAGE */ 290 291 292/* 293 * Set op's name 294 */ 295void 296acpi_ps_set_name ( 297 union acpi_parse_object *op, 298 u32 name) 299{ 300 301 /* The "generic" object has no name associated with it */ 302 303 if (op->common.flags & ACPI_PARSEOP_GENERIC) { 304 return; 305 } 306 307 op->named.name = name; 308} 309