1/****************************************************************************** 2 * 3 * Module Name: psutils - Parser miscellaneous utilities (Parser only) 4 * 5 *****************************************************************************/ 6 7/* 8 * Copyright (C) 2000 - 2004, 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 = NULL; 133 u32 size; 134 u8 flags; 135 const struct acpi_opcode_info *op_info; 136 137 138 ACPI_FUNCTION_ENTRY (); 139 140 141 op_info = acpi_ps_get_opcode_info (opcode); 142 143 /* Allocate the minimum required size object */ 144 145 if (op_info->flags & AML_DEFER) { 146 size = sizeof (struct acpi_parse_obj_named); 147 flags = ACPI_PARSEOP_DEFERRED; 148 } 149 else if (op_info->flags & AML_NAMED) { 150 size = sizeof (struct acpi_parse_obj_named); 151 flags = ACPI_PARSEOP_NAMED; 152 } 153 else if (opcode == AML_INT_BYTELIST_OP) { 154 size = sizeof (struct acpi_parse_obj_named); 155 flags = ACPI_PARSEOP_BYTELIST; 156 } 157 else { 158 size = sizeof (struct acpi_parse_obj_common); 159 flags = ACPI_PARSEOP_GENERIC; 160 } 161 162 if (size == sizeof (struct acpi_parse_obj_common)) { 163 /* 164 * The generic op is by far the most common (16 to 1) 165 */ 166 op = acpi_ut_acquire_from_cache (ACPI_MEM_LIST_PSNODE); 167 } 168 else { 169 op = acpi_ut_acquire_from_cache (ACPI_MEM_LIST_PSNODE_EXT); 170 } 171 172 /* Initialize the Op */ 173 174 if (op) { 175 acpi_ps_init_op (op, opcode); 176 op->common.flags = flags; 177 } 178 179 return (op); 180} 181 182 183/******************************************************************************* 184 * 185 * FUNCTION: acpi_ps_free_op 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 196void 197acpi_ps_free_op ( 198 union acpi_parse_object *op) 199{ 200 ACPI_FUNCTION_NAME ("ps_free_op"); 201 202 203 if (op->common.aml_opcode == AML_INT_RETURN_VALUE_OP) { 204 ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "Free retval op: %p\n", op)); 205 } 206 207 if (op->common.flags & ACPI_PARSEOP_GENERIC) { 208 acpi_ut_release_to_cache (ACPI_MEM_LIST_PSNODE, op); 209 } 210 else { 211 acpi_ut_release_to_cache (ACPI_MEM_LIST_PSNODE_EXT, op); 212 } 213} 214 215 216/******************************************************************************* 217 * 218 * FUNCTION: acpi_ps_delete_parse_cache 219 * 220 * PARAMETERS: None 221 * 222 * RETURN: None 223 * 224 * DESCRIPTION: Free all objects that are on the parse cache list. 225 * 226 ******************************************************************************/ 227 228void 229acpi_ps_delete_parse_cache ( 230 void) 231{ 232 ACPI_FUNCTION_TRACE ("ps_delete_parse_cache"); 233 234 235 acpi_ut_delete_generic_cache (ACPI_MEM_LIST_PSNODE); 236 acpi_ut_delete_generic_cache (ACPI_MEM_LIST_PSNODE_EXT); 237 return_VOID; 238} 239 240 241/******************************************************************************* 242 * 243 * FUNCTION: Utility functions 244 * 245 * DESCRIPTION: Low level character and object functions 246 * 247 ******************************************************************************/ 248 249 250/* 251 * Is "c" a namestring lead character? 252 */ 253u8 254acpi_ps_is_leading_char ( 255 u32 c) 256{ 257 return ((u8) (c == '_' || (c >= 'A' && c <= 'Z'))); 258} 259 260 261/* 262 * Is "c" a namestring prefix character? 263 */ 264u8 265acpi_ps_is_prefix_char ( 266 u32 c) 267{ 268 return ((u8) (c == '\\' || c == '^')); 269} 270 271 272/* 273 * Get op's name (4-byte name segment) or 0 if unnamed 274 */ 275u32 276acpi_ps_get_name ( 277 union acpi_parse_object *op) 278{ 279 280 281 /* The "generic" object has no name associated with it */ 282 283 if (op->common.flags & ACPI_PARSEOP_GENERIC) { 284 return (0); 285 } 286 287 /* Only the "Extended" parse objects have a name */ 288 289 return (op->named.name); 290} 291 292 293/* 294 * Set op's name 295 */ 296void 297acpi_ps_set_name ( 298 union acpi_parse_object *op, 299 u32 name) 300{ 301 302 /* The "generic" object has no name associated with it */ 303 304 if (op->common.flags & ACPI_PARSEOP_GENERIC) { 305 return; 306 } 307 308 op->named.name = name; 309} 310 311

