Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.28-rc8 311 lines 7.9 kB view raw
1/****************************************************************************** 2 * 3 * Module Name: pstree - Parser op tree manipulation/traversal/search 4 * 5 *****************************************************************************/ 6 7/* 8 * Copyright (C) 2000 - 2008, 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/acpi.h> 45#include <acpi/acparser.h> 46#include <acpi/amlcode.h> 47 48#define _COMPONENT ACPI_PARSER 49ACPI_MODULE_NAME("pstree") 50 51/* Local prototypes */ 52#ifdef ACPI_OBSOLETE_FUNCTIONS 53union acpi_parse_object *acpi_ps_get_child(union acpi_parse_object *op); 54#endif 55 56/******************************************************************************* 57 * 58 * FUNCTION: acpi_ps_get_arg 59 * 60 * PARAMETERS: Op - Get an argument for this op 61 * Argn - Nth argument to get 62 * 63 * RETURN: The argument (as an Op object). NULL if argument does not exist 64 * 65 * DESCRIPTION: Get the specified op's argument. 66 * 67 ******************************************************************************/ 68 69union acpi_parse_object *acpi_ps_get_arg(union acpi_parse_object *op, u32 argn) 70{ 71 union acpi_parse_object *arg = NULL; 72 const struct acpi_opcode_info *op_info; 73 74 ACPI_FUNCTION_ENTRY(); 75 76 /* Get the info structure for this opcode */ 77 78 op_info = acpi_ps_get_opcode_info(op->common.aml_opcode); 79 if (op_info->class == AML_CLASS_UNKNOWN) { 80 81 /* Invalid opcode or ASCII character */ 82 83 return (NULL); 84 } 85 86 /* Check if this opcode requires argument sub-objects */ 87 88 if (!(op_info->flags & AML_HAS_ARGS)) { 89 90 /* Has no linked argument objects */ 91 92 return (NULL); 93 } 94 95 /* Get the requested argument object */ 96 97 arg = op->common.value.arg; 98 while (arg && argn) { 99 argn--; 100 arg = arg->common.next; 101 } 102 103 return (arg); 104} 105 106/******************************************************************************* 107 * 108 * FUNCTION: acpi_ps_append_arg 109 * 110 * PARAMETERS: Op - Append an argument to this Op. 111 * Arg - Argument Op to append 112 * 113 * RETURN: None. 114 * 115 * DESCRIPTION: Append an argument to an op's argument list (a NULL arg is OK) 116 * 117 ******************************************************************************/ 118 119void 120acpi_ps_append_arg(union acpi_parse_object *op, union acpi_parse_object *arg) 121{ 122 union acpi_parse_object *prev_arg; 123 const struct acpi_opcode_info *op_info; 124 125 ACPI_FUNCTION_ENTRY(); 126 127 if (!op) { 128 return; 129 } 130 131 /* Get the info structure for this opcode */ 132 133 op_info = acpi_ps_get_opcode_info(op->common.aml_opcode); 134 if (op_info->class == AML_CLASS_UNKNOWN) { 135 136 /* Invalid opcode */ 137 138 ACPI_ERROR((AE_INFO, "Invalid AML Opcode: 0x%2.2X", 139 op->common.aml_opcode)); 140 return; 141 } 142 143 /* Check if this opcode requires argument sub-objects */ 144 145 if (!(op_info->flags & AML_HAS_ARGS)) { 146 147 /* Has no linked argument objects */ 148 149 return; 150 } 151 152 /* Append the argument to the linked argument list */ 153 154 if (op->common.value.arg) { 155 156 /* Append to existing argument list */ 157 158 prev_arg = op->common.value.arg; 159 while (prev_arg->common.next) { 160 prev_arg = prev_arg->common.next; 161 } 162 prev_arg->common.next = arg; 163 } else { 164 /* No argument list, this will be the first argument */ 165 166 op->common.value.arg = arg; 167 } 168 169 /* Set the parent in this arg and any args linked after it */ 170 171 while (arg) { 172 arg->common.parent = op; 173 arg = arg->common.next; 174 175 op->common.arg_list_length++; 176 } 177} 178 179#ifdef ACPI_FUTURE_USAGE 180/******************************************************************************* 181 * 182 * FUNCTION: acpi_ps_get_depth_next 183 * 184 * PARAMETERS: Origin - Root of subtree to search 185 * Op - Last (previous) Op that was found 186 * 187 * RETURN: Next Op found in the search. 188 * 189 * DESCRIPTION: Get next op in tree (walking the tree in depth-first order) 190 * Return NULL when reaching "origin" or when walking up from root 191 * 192 ******************************************************************************/ 193 194union acpi_parse_object *acpi_ps_get_depth_next(union acpi_parse_object *origin, 195 union acpi_parse_object *op) 196{ 197 union acpi_parse_object *next = NULL; 198 union acpi_parse_object *parent; 199 union acpi_parse_object *arg; 200 201 ACPI_FUNCTION_ENTRY(); 202 203 if (!op) { 204 return (NULL); 205 } 206 207 /* Look for an argument or child */ 208 209 next = acpi_ps_get_arg(op, 0); 210 if (next) { 211 return (next); 212 } 213 214 /* Look for a sibling */ 215 216 next = op->common.next; 217 if (next) { 218 return (next); 219 } 220 221 /* Look for a sibling of parent */ 222 223 parent = op->common.parent; 224 225 while (parent) { 226 arg = acpi_ps_get_arg(parent, 0); 227 while (arg && (arg != origin) && (arg != op)) { 228 arg = arg->common.next; 229 } 230 231 if (arg == origin) { 232 233 /* Reached parent of origin, end search */ 234 235 return (NULL); 236 } 237 238 if (parent->common.next) { 239 240 /* Found sibling of parent */ 241 242 return (parent->common.next); 243 } 244 245 op = parent; 246 parent = parent->common.parent; 247 } 248 249 return (next); 250} 251 252#ifdef ACPI_OBSOLETE_FUNCTIONS 253/******************************************************************************* 254 * 255 * FUNCTION: acpi_ps_get_child 256 * 257 * PARAMETERS: Op - Get the child of this Op 258 * 259 * RETURN: Child Op, Null if none is found. 260 * 261 * DESCRIPTION: Get op's children or NULL if none 262 * 263 ******************************************************************************/ 264 265union acpi_parse_object *acpi_ps_get_child(union acpi_parse_object *op) 266{ 267 union acpi_parse_object *child = NULL; 268 269 ACPI_FUNCTION_ENTRY(); 270 271 switch (op->common.aml_opcode) { 272 case AML_SCOPE_OP: 273 case AML_ELSE_OP: 274 case AML_DEVICE_OP: 275 case AML_THERMAL_ZONE_OP: 276 case AML_INT_METHODCALL_OP: 277 278 child = acpi_ps_get_arg(op, 0); 279 break; 280 281 case AML_BUFFER_OP: 282 case AML_PACKAGE_OP: 283 case AML_METHOD_OP: 284 case AML_IF_OP: 285 case AML_WHILE_OP: 286 case AML_FIELD_OP: 287 288 child = acpi_ps_get_arg(op, 1); 289 break; 290 291 case AML_POWER_RES_OP: 292 case AML_INDEX_FIELD_OP: 293 294 child = acpi_ps_get_arg(op, 2); 295 break; 296 297 case AML_PROCESSOR_OP: 298 case AML_BANK_FIELD_OP: 299 300 child = acpi_ps_get_arg(op, 3); 301 break; 302 303 default: 304 /* All others have no children */ 305 break; 306 } 307 308 return (child); 309} 310#endif 311#endif /* ACPI_FUTURE_USAGE */