1 /****************************************************************************** 2 * 3 * Module Name: exdump - Interpreter debug output routines 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2018, 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 "accommon.h" 46 #include "acinterp.h" 47 #include "amlcode.h" 48 #include "acnamesp.h" 49 50 #define _COMPONENT ACPI_EXECUTER 51 ACPI_MODULE_NAME("exdump") 52 53 /* 54 * The following routines are used for debug output only 55 */ 56 #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER) 57 /* Local prototypes */ 58 static void acpi_ex_out_string(const char *title, const char *value); 59 60 static void acpi_ex_out_pointer(const char *title, const void *value); 61 62 static void 63 acpi_ex_dump_object(union acpi_operand_object *obj_desc, 64 struct acpi_exdump_info *info); 65 66 static void acpi_ex_dump_reference_obj(union acpi_operand_object *obj_desc); 67 68 static void 69 acpi_ex_dump_package_obj(union acpi_operand_object *obj_desc, 70 u32 level, u32 index); 71 72 /******************************************************************************* 73 * 74 * Object Descriptor info tables 75 * 76 * Note: The first table entry must be an INIT opcode and must contain 77 * the table length (number of table entries) 78 * 79 ******************************************************************************/ 80 81 static struct acpi_exdump_info acpi_ex_dump_integer[2] = { 82 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_integer), NULL}, 83 {ACPI_EXD_UINT64, ACPI_EXD_OFFSET(integer.value), "Value"} 84 }; 85 86 static struct acpi_exdump_info acpi_ex_dump_string[4] = { 87 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_string), NULL}, 88 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(string.length), "Length"}, 89 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(string.pointer), "Pointer"}, 90 {ACPI_EXD_STRING, 0, NULL} 91 }; 92 93 static struct acpi_exdump_info acpi_ex_dump_buffer[5] = { 94 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_buffer), NULL}, 95 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(buffer.length), "Length"}, 96 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(buffer.pointer), "Pointer"}, 97 {ACPI_EXD_NODE, ACPI_EXD_OFFSET(buffer.node), "Parent Node"}, 98 {ACPI_EXD_BUFFER, 0, NULL} 99 }; 100 101 static struct acpi_exdump_info acpi_ex_dump_package[6] = { 102 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_package), NULL}, 103 {ACPI_EXD_NODE, ACPI_EXD_OFFSET(package.node), "Parent Node"}, 104 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(package.flags), "Flags"}, 105 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(package.count), "Element Count"}, 106 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(package.elements), "Element List"}, 107 {ACPI_EXD_PACKAGE, 0, NULL} 108 }; 109 110 static struct acpi_exdump_info acpi_ex_dump_device[4] = { 111 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_device), NULL}, 112 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(device.notify_list[0]), 113 "System Notify"}, 114 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(device.notify_list[1]), 115 "Device Notify"}, 116 {ACPI_EXD_HDLR_LIST, ACPI_EXD_OFFSET(device.handler), "Handler"} 117 }; 118 119 static struct acpi_exdump_info acpi_ex_dump_event[2] = { 120 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_event), NULL}, 121 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(event.os_semaphore), "OsSemaphore"} 122 }; 123 124 static struct acpi_exdump_info acpi_ex_dump_method[9] = { 125 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_method), NULL}, 126 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.info_flags), "Info Flags"}, 127 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.param_count), 128 "Parameter Count"}, 129 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.sync_level), "Sync Level"}, 130 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(method.mutex), "Mutex"}, 131 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.owner_id), "Owner Id"}, 132 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.thread_count), "Thread Count"}, 133 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(method.aml_length), "Aml Length"}, 134 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(method.aml_start), "Aml Start"} 135 }; 136 137 static struct acpi_exdump_info acpi_ex_dump_mutex[6] = { 138 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_mutex), NULL}, 139 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(mutex.sync_level), "Sync Level"}, 140 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(mutex.original_sync_level), 141 "Original Sync Level"}, 142 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(mutex.owner_thread), "Owner Thread"}, 143 {ACPI_EXD_UINT16, ACPI_EXD_OFFSET(mutex.acquisition_depth), 144 "Acquire Depth"}, 145 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(mutex.os_mutex), "OsMutex"} 146 }; 147 148 static struct acpi_exdump_info acpi_ex_dump_region[8] = { 149 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_region), NULL}, 150 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(region.space_id), "Space Id"}, 151 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(region.flags), "Flags"}, 152 {ACPI_EXD_NODE, ACPI_EXD_OFFSET(region.node), "Parent Node"}, 153 {ACPI_EXD_ADDRESS, ACPI_EXD_OFFSET(region.address), "Address"}, 154 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(region.length), "Length"}, 155 {ACPI_EXD_HDLR_LIST, ACPI_EXD_OFFSET(region.handler), "Handler"}, 156 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(region.next), "Next"} 157 }; 158 159 static struct acpi_exdump_info acpi_ex_dump_power[6] = { 160 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_power), NULL}, 161 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(power_resource.system_level), 162 "System Level"}, 163 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(power_resource.resource_order), 164 "Resource Order"}, 165 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(power_resource.notify_list[0]), 166 "System Notify"}, 167 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(power_resource.notify_list[1]), 168 "Device Notify"}, 169 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(power_resource.handler), "Handler"} 170 }; 171 172 static struct acpi_exdump_info acpi_ex_dump_processor[7] = { 173 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_processor), NULL}, 174 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(processor.proc_id), "Processor ID"}, 175 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(processor.length), "Length"}, 176 {ACPI_EXD_ADDRESS, ACPI_EXD_OFFSET(processor.address), "Address"}, 177 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(processor.notify_list[0]), 178 "System Notify"}, 179 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(processor.notify_list[1]), 180 "Device Notify"}, 181 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(processor.handler), "Handler"} 182 }; 183 184 static struct acpi_exdump_info acpi_ex_dump_thermal[4] = { 185 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_thermal), NULL}, 186 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(thermal_zone.notify_list[0]), 187 "System Notify"}, 188 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(thermal_zone.notify_list[1]), 189 "Device Notify"}, 190 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(thermal_zone.handler), "Handler"} 191 }; 192 193 static struct acpi_exdump_info acpi_ex_dump_buffer_field[3] = { 194 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_buffer_field), NULL}, 195 {ACPI_EXD_FIELD, 0, NULL}, 196 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(buffer_field.buffer_obj), 197 "Buffer Object"} 198 }; 199 200 static struct acpi_exdump_info acpi_ex_dump_region_field[5] = { 201 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_region_field), NULL}, 202 {ACPI_EXD_FIELD, 0, NULL}, 203 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(field.access_length), "AccessLength"}, 204 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(field.region_obj), "Region Object"}, 205 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(field.resource_buffer), 206 "ResourceBuffer"} 207 }; 208 209 static struct acpi_exdump_info acpi_ex_dump_bank_field[5] = { 210 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_bank_field), NULL}, 211 {ACPI_EXD_FIELD, 0, NULL}, 212 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(bank_field.value), "Value"}, 213 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(bank_field.region_obj), 214 "Region Object"}, 215 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(bank_field.bank_obj), "Bank Object"} 216 }; 217 218 static struct acpi_exdump_info acpi_ex_dump_index_field[5] = { 219 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_bank_field), NULL}, 220 {ACPI_EXD_FIELD, 0, NULL}, 221 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(index_field.value), "Value"}, 222 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(index_field.index_obj), 223 "Index Object"}, 224 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(index_field.data_obj), "Data Object"} 225 }; 226 227 static struct acpi_exdump_info acpi_ex_dump_reference[9] = { 228 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_reference), NULL}, 229 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(reference.class), "Class"}, 230 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(reference.target_type), "Target Type"}, 231 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(reference.value), "Value"}, 232 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(reference.object), "Object Desc"}, 233 {ACPI_EXD_NODE, ACPI_EXD_OFFSET(reference.node), "Node"}, 234 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(reference.where), "Where"}, 235 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(reference.index_pointer), 236 "Index Pointer"}, 237 {ACPI_EXD_REFERENCE, 0, NULL} 238 }; 239 240 static struct acpi_exdump_info acpi_ex_dump_address_handler[6] = { 241 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_address_handler), 242 NULL}, 243 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(address_space.space_id), "Space Id"}, 244 {ACPI_EXD_HDLR_LIST, ACPI_EXD_OFFSET(address_space.next), "Next"}, 245 {ACPI_EXD_RGN_LIST, ACPI_EXD_OFFSET(address_space.region_list), 246 "Region List"}, 247 {ACPI_EXD_NODE, ACPI_EXD_OFFSET(address_space.node), "Node"}, 248 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(address_space.context), "Context"} 249 }; 250 251 static struct acpi_exdump_info acpi_ex_dump_notify[7] = { 252 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_notify), NULL}, 253 {ACPI_EXD_NODE, ACPI_EXD_OFFSET(notify.node), "Node"}, 254 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(notify.handler_type), "Handler Type"}, 255 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(notify.handler), "Handler"}, 256 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(notify.context), "Context"}, 257 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(notify.next[0]), 258 "Next System Notify"}, 259 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(notify.next[1]), "Next Device Notify"} 260 }; 261 262 static struct acpi_exdump_info acpi_ex_dump_extra[6] = { 263 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_extra), NULL}, 264 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(extra.method_REG), "_REG Method"}, 265 {ACPI_EXD_NODE, ACPI_EXD_OFFSET(extra.scope_node), "Scope Node"}, 266 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(extra.region_context), 267 "Region Context"}, 268 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(extra.aml_start), "Aml Start"}, 269 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(extra.aml_length), "Aml Length"} 270 }; 271 272 static struct acpi_exdump_info acpi_ex_dump_data[3] = { 273 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_data), NULL}, 274 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(data.handler), "Handler"}, 275 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(data.pointer), "Raw Data"} 276 }; 277 278 /* Miscellaneous tables */ 279 280 static struct acpi_exdump_info acpi_ex_dump_common[5] = { 281 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_common), NULL}, 282 {ACPI_EXD_TYPE, 0, NULL}, 283 {ACPI_EXD_UINT16, ACPI_EXD_OFFSET(common.reference_count), 284 "Reference Count"}, 285 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(common.flags), "Flags"}, 286 {ACPI_EXD_LIST, ACPI_EXD_OFFSET(common.next_object), "Object List"} 287 }; 288 289 static struct acpi_exdump_info acpi_ex_dump_field_common[7] = { 290 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_field_common), NULL}, 291 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(common_field.field_flags), 292 "Field Flags"}, 293 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(common_field.access_byte_width), 294 "Access Byte Width"}, 295 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(common_field.bit_length), 296 "Bit Length"}, 297 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(common_field.start_field_bit_offset), 298 "Field Bit Offset"}, 299 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(common_field.base_byte_offset), 300 "Base Byte Offset"}, 301 {ACPI_EXD_NODE, ACPI_EXD_OFFSET(common_field.node), "Parent Node"} 302 }; 303 304 static struct acpi_exdump_info acpi_ex_dump_node[7] = { 305 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_node), NULL}, 306 {ACPI_EXD_UINT8, ACPI_EXD_NSOFFSET(flags), "Flags"}, 307 {ACPI_EXD_UINT8, ACPI_EXD_NSOFFSET(owner_id), "Owner Id"}, 308 {ACPI_EXD_LIST, ACPI_EXD_NSOFFSET(object), "Object List"}, 309 {ACPI_EXD_NODE, ACPI_EXD_NSOFFSET(parent), "Parent"}, 310 {ACPI_EXD_NODE, ACPI_EXD_NSOFFSET(child), "Child"}, 311 {ACPI_EXD_NODE, ACPI_EXD_NSOFFSET(peer), "Peer"} 312 }; 313 314 /* Dispatch table, indexed by object type */ 315 316 static struct acpi_exdump_info *acpi_ex_dump_info[] = { 317 NULL, 318 acpi_ex_dump_integer, 319 acpi_ex_dump_string, 320 acpi_ex_dump_buffer, 321 acpi_ex_dump_package, 322 NULL, 323 acpi_ex_dump_device, 324 acpi_ex_dump_event, 325 acpi_ex_dump_method, 326 acpi_ex_dump_mutex, 327 acpi_ex_dump_region, 328 acpi_ex_dump_power, 329 acpi_ex_dump_processor, 330 acpi_ex_dump_thermal, 331 acpi_ex_dump_buffer_field, 332 NULL, 333 NULL, 334 acpi_ex_dump_region_field, 335 acpi_ex_dump_bank_field, 336 acpi_ex_dump_index_field, 337 acpi_ex_dump_reference, 338 NULL, 339 NULL, 340 acpi_ex_dump_notify, 341 acpi_ex_dump_address_handler, 342 NULL, 343 NULL, 344 NULL, 345 acpi_ex_dump_extra, 346 acpi_ex_dump_data 347 }; 348 349 /******************************************************************************* 350 * 351 * FUNCTION: acpi_ex_dump_object 352 * 353 * PARAMETERS: obj_desc - Descriptor to dump 354 * info - Info table corresponding to this object 355 * type 356 * 357 * RETURN: None 358 * 359 * DESCRIPTION: Walk the info table for this object 360 * 361 ******************************************************************************/ 362 363 static void 364 acpi_ex_dump_object(union acpi_operand_object *obj_desc, 365 struct acpi_exdump_info *info) 366 { 367 u8 *target; 368 const char *name; 369 u8 count; 370 union acpi_operand_object *start; 371 union acpi_operand_object *data = NULL; 372 union acpi_operand_object *next; 373 struct acpi_namespace_node *node; 374 375 if (!info) { 376 acpi_os_printf 377 ("ExDumpObject: Display not implemented for object type %s\n", 378 acpi_ut_get_object_type_name(obj_desc)); 379 return; 380 } 381 382 /* First table entry must contain the table length (# of table entries) */ 383 384 count = info->offset; 385 386 while (count) { 387 if (!obj_desc) { 388 return; 389 } 390 391 target = ACPI_ADD_PTR(u8, obj_desc, info->offset); 392 name = info->name; 393 394 switch (info->opcode) { 395 case ACPI_EXD_INIT: 396 397 break; 398 399 case ACPI_EXD_TYPE: 400 401 acpi_os_printf("%20s : %2.2X [%s]\n", "Type", 402 obj_desc->common.type, 403 acpi_ut_get_object_type_name(obj_desc)); 404 break; 405 406 case ACPI_EXD_UINT8: 407 408 acpi_os_printf("%20s : %2.2X\n", name, *target); 409 break; 410 411 case ACPI_EXD_UINT16: 412 413 acpi_os_printf("%20s : %4.4X\n", name, 414 ACPI_GET16(target)); 415 break; 416 417 case ACPI_EXD_UINT32: 418 419 acpi_os_printf("%20s : %8.8X\n", name, 420 ACPI_GET32(target)); 421 break; 422 423 case ACPI_EXD_UINT64: 424 425 acpi_os_printf("%20s : %8.8X%8.8X\n", "Value", 426 ACPI_FORMAT_UINT64(ACPI_GET64(target))); 427 break; 428 429 case ACPI_EXD_POINTER: 430 case ACPI_EXD_ADDRESS: 431 432 acpi_ex_out_pointer(name, 433 *ACPI_CAST_PTR(void *, target)); 434 break; 435 436 case ACPI_EXD_STRING: 437 438 acpi_ut_print_string(obj_desc->string.pointer, 439 ACPI_UINT8_MAX); 440 acpi_os_printf("\n"); 441 break; 442 443 case ACPI_EXD_BUFFER: 444 445 ACPI_DUMP_BUFFER(obj_desc->buffer.pointer, 446 obj_desc->buffer.length); 447 break; 448 449 case ACPI_EXD_PACKAGE: 450 451 /* Dump the package contents */ 452 453 acpi_os_printf("\nPackage Contents:\n"); 454 acpi_ex_dump_package_obj(obj_desc, 0, 0); 455 break; 456 457 case ACPI_EXD_FIELD: 458 459 acpi_ex_dump_object(obj_desc, 460 acpi_ex_dump_field_common); 461 break; 462 463 case ACPI_EXD_REFERENCE: 464 465 acpi_ex_out_string("Class Name", 466 acpi_ut_get_reference_name 467 (obj_desc)); 468 acpi_ex_dump_reference_obj(obj_desc); 469 break; 470 471 case ACPI_EXD_LIST: 472 473 start = *ACPI_CAST_PTR(void *, target); 474 next = start; 475 476 acpi_os_printf("%20s : %p ", name, next); 477 if (next) { 478 acpi_os_printf("%s (Type %2.2X)", 479 acpi_ut_get_object_type_name 480 (next), next->common.type); 481 482 while (next->common.next_object) { 483 if ((next->common.type == 484 ACPI_TYPE_LOCAL_DATA) && !data) { 485 data = next; 486 } 487 488 next = next->common.next_object; 489 acpi_os_printf("->%p(%s %2.2X)", next, 490 acpi_ut_get_object_type_name 491 (next), 492 next->common.type); 493 494 if ((next == start) || (next == data)) { 495 acpi_os_printf 496 ("\n**** Error: Object list appears to be circular linked"); 497 break; 498 } 499 } 500 } else { 501 acpi_os_printf("- No attached objects"); 502 } 503 504 acpi_os_printf("\n"); 505 break; 506 507 case ACPI_EXD_HDLR_LIST: 508 509 start = *ACPI_CAST_PTR(void *, target); 510 next = start; 511 512 acpi_os_printf("%20s : %p", name, next); 513 if (next) { 514 acpi_os_printf("(%s %2.2X)", 515 acpi_ut_get_object_type_name 516 (next), 517 next->address_space.space_id); 518 519 while (next->address_space.next) { 520 if ((next->common.type == 521 ACPI_TYPE_LOCAL_DATA) && !data) { 522 data = next; 523 } 524 525 next = next->address_space.next; 526 acpi_os_printf("->%p(%s %2.2X)", next, 527 acpi_ut_get_object_type_name 528 (next), 529 next->address_space. 530 space_id); 531 532 if ((next == start) || (next == data)) { 533 acpi_os_printf 534 ("\n**** Error: Handler list appears to be circular linked"); 535 break; 536 } 537 } 538 } 539 540 acpi_os_printf("\n"); 541 break; 542 543 case ACPI_EXD_RGN_LIST: 544 545 start = *ACPI_CAST_PTR(void *, target); 546 next = start; 547 548 acpi_os_printf("%20s : %p", name, next); 549 if (next) { 550 acpi_os_printf("(%s %2.2X)", 551 acpi_ut_get_object_type_name 552 (next), next->common.type); 553 554 while (next->region.next) { 555 if ((next->common.type == 556 ACPI_TYPE_LOCAL_DATA) && !data) { 557 data = next; 558 } 559 560 next = next->region.next; 561 acpi_os_printf("->%p(%s %2.2X)", next, 562 acpi_ut_get_object_type_name 563 (next), 564 next->common.type); 565 566 if ((next == start) || (next == data)) { 567 acpi_os_printf 568 ("\n**** Error: Region list appears to be circular linked"); 569 break; 570 } 571 } 572 } 573 574 acpi_os_printf("\n"); 575 break; 576 577 case ACPI_EXD_NODE: 578 579 node = 580 *ACPI_CAST_PTR(struct acpi_namespace_node *, 581 target); 582 583 acpi_os_printf("%20s : %p", name, node); 584 if (node) { 585 acpi_os_printf(" [%4.4s]", node->name.ascii); 586 } 587 acpi_os_printf("\n"); 588 break; 589 590 default: 591 592 acpi_os_printf("**** Invalid table opcode [%X] ****\n", 593 info->opcode); 594 return; 595 } 596 597 info++; 598 count--; 599 } 600 } 601 602 /******************************************************************************* 603 * 604 * FUNCTION: acpi_ex_dump_operand 605 * 606 * PARAMETERS: *obj_desc - Pointer to entry to be dumped 607 * depth - Current nesting depth 608 * 609 * RETURN: None 610 * 611 * DESCRIPTION: Dump an operand object 612 * 613 ******************************************************************************/ 614 615 void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth) 616 { 617 u32 length; 618 u32 index; 619 620 ACPI_FUNCTION_NAME(ex_dump_operand); 621 622 /* Check if debug output enabled */ 623 624 if (!ACPI_IS_DEBUG_ENABLED(ACPI_LV_EXEC, _COMPONENT)) { 625 return; 626 } 627 628 if (!obj_desc) { 629 630 /* This could be a null element of a package */ 631 632 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Null Object Descriptor\n")); 633 return; 634 } 635 636 if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) == ACPI_DESC_TYPE_NAMED) { 637 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%p Namespace Node: ", 638 obj_desc)); 639 ACPI_DUMP_ENTRY(obj_desc, ACPI_LV_EXEC); 640 return; 641 } 642 643 if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) != ACPI_DESC_TYPE_OPERAND) { 644 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 645 "%p is not a node or operand object: [%s]\n", 646 obj_desc, 647 acpi_ut_get_descriptor_name(obj_desc))); 648 ACPI_DUMP_BUFFER(obj_desc, sizeof(union acpi_operand_object)); 649 return; 650 } 651 652 /* obj_desc is a valid object */ 653 654 if (depth > 0) { 655 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%*s[%u] %p Refs=%u ", 656 depth, " ", depth, obj_desc, 657 obj_desc->common.reference_count)); 658 } else { 659 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%p Refs=%u ", 660 obj_desc, obj_desc->common.reference_count)); 661 } 662 663 /* Decode object type */ 664 665 switch (obj_desc->common.type) { 666 case ACPI_TYPE_LOCAL_REFERENCE: 667 668 acpi_os_printf("Reference: [%s] ", 669 acpi_ut_get_reference_name(obj_desc)); 670 671 switch (obj_desc->reference.class) { 672 case ACPI_REFCLASS_DEBUG: 673 674 acpi_os_printf("\n"); 675 break; 676 677 case ACPI_REFCLASS_INDEX: 678 679 acpi_os_printf("%p\n", obj_desc->reference.object); 680 break; 681 682 case ACPI_REFCLASS_TABLE: 683 684 acpi_os_printf("Table Index %X\n", 685 obj_desc->reference.value); 686 break; 687 688 case ACPI_REFCLASS_REFOF: 689 690 acpi_os_printf("%p [%s]\n", obj_desc->reference.object, 691 acpi_ut_get_type_name(((union 692 acpi_operand_object 693 *) 694 obj_desc-> 695 reference. 696 object)->common. 697 type)); 698 break; 699 700 case ACPI_REFCLASS_NAME: 701 702 acpi_ut_repair_name(obj_desc->reference.node->name. 703 ascii); 704 acpi_os_printf("- [%4.4s] (Node %p)\n", 705 obj_desc->reference.node->name.ascii, 706 obj_desc->reference.node); 707 break; 708 709 case ACPI_REFCLASS_ARG: 710 case ACPI_REFCLASS_LOCAL: 711 712 acpi_os_printf("%X\n", obj_desc->reference.value); 713 break; 714 715 default: /* Unknown reference class */ 716 717 acpi_os_printf("%2.2X\n", obj_desc->reference.class); 718 break; 719 } 720 break; 721 722 case ACPI_TYPE_BUFFER: 723 724 acpi_os_printf("Buffer length %.2X @ %p\n", 725 obj_desc->buffer.length, 726 obj_desc->buffer.pointer); 727 728 /* Debug only -- dump the buffer contents */ 729 730 if (obj_desc->buffer.pointer) { 731 length = obj_desc->buffer.length; 732 if (length > 128) { 733 length = 128; 734 } 735 736 acpi_os_printf 737 ("Buffer Contents: (displaying length 0x%.2X)\n", 738 length); 739 ACPI_DUMP_BUFFER(obj_desc->buffer.pointer, length); 740 } 741 break; 742 743 case ACPI_TYPE_INTEGER: 744 745 acpi_os_printf("Integer %8.8X%8.8X\n", 746 ACPI_FORMAT_UINT64(obj_desc->integer.value)); 747 break; 748 749 case ACPI_TYPE_PACKAGE: 750 751 acpi_os_printf("Package [Len %X] ElementArray %p\n", 752 obj_desc->package.count, 753 obj_desc->package.elements); 754 755 /* 756 * If elements exist, package element pointer is valid, 757 * and debug_level exceeds 1, dump package's elements. 758 */ 759 if (obj_desc->package.count && 760 obj_desc->package.elements && acpi_dbg_level > 1) { 761 for (index = 0; index < obj_desc->package.count; 762 index++) { 763 acpi_ex_dump_operand(obj_desc->package. 764 elements[index], 765 depth + 1); 766 } 767 } 768 break; 769 770 case ACPI_TYPE_REGION: 771 772 acpi_os_printf("Region %s (%X)", 773 acpi_ut_get_region_name(obj_desc->region. 774 space_id), 775 obj_desc->region.space_id); 776 777 /* 778 * If the address and length have not been evaluated, 779 * don't print them. 780 */ 781 if (!(obj_desc->region.flags & AOPOBJ_DATA_VALID)) { 782 acpi_os_printf("\n"); 783 } else { 784 acpi_os_printf(" base %8.8X%8.8X Length %X\n", 785 ACPI_FORMAT_UINT64(obj_desc->region. 786 address), 787 obj_desc->region.length); 788 } 789 break; 790 791 case ACPI_TYPE_STRING: 792 793 acpi_os_printf("String length %X @ %p ", 794 obj_desc->string.length, 795 obj_desc->string.pointer); 796 797 acpi_ut_print_string(obj_desc->string.pointer, ACPI_UINT8_MAX); 798 acpi_os_printf("\n"); 799 break; 800 801 case ACPI_TYPE_LOCAL_BANK_FIELD: 802 803 acpi_os_printf("BankField\n"); 804 break; 805 806 case ACPI_TYPE_LOCAL_REGION_FIELD: 807 808 acpi_os_printf 809 ("RegionField: Bits=%X AccWidth=%X Lock=%X Update=%X at " 810 "byte=%X bit=%X of below:\n", obj_desc->field.bit_length, 811 obj_desc->field.access_byte_width, 812 obj_desc->field.field_flags & AML_FIELD_LOCK_RULE_MASK, 813 obj_desc->field.field_flags & AML_FIELD_UPDATE_RULE_MASK, 814 obj_desc->field.base_byte_offset, 815 obj_desc->field.start_field_bit_offset); 816 817 acpi_ex_dump_operand(obj_desc->field.region_obj, depth + 1); 818 break; 819 820 case ACPI_TYPE_LOCAL_INDEX_FIELD: 821 822 acpi_os_printf("IndexField\n"); 823 break; 824 825 case ACPI_TYPE_BUFFER_FIELD: 826 827 acpi_os_printf("BufferField: %X bits at byte %X bit %X of\n", 828 obj_desc->buffer_field.bit_length, 829 obj_desc->buffer_field.base_byte_offset, 830 obj_desc->buffer_field.start_field_bit_offset); 831 832 if (!obj_desc->buffer_field.buffer_obj) { 833 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "*NULL*\n")); 834 } else if ((obj_desc->buffer_field.buffer_obj)->common.type != 835 ACPI_TYPE_BUFFER) { 836 acpi_os_printf("*not a Buffer*\n"); 837 } else { 838 acpi_ex_dump_operand(obj_desc->buffer_field.buffer_obj, 839 depth + 1); 840 } 841 break; 842 843 case ACPI_TYPE_EVENT: 844 845 acpi_os_printf("Event\n"); 846 break; 847 848 case ACPI_TYPE_METHOD: 849 850 acpi_os_printf("Method(%X) @ %p:%X\n", 851 obj_desc->method.param_count, 852 obj_desc->method.aml_start, 853 obj_desc->method.aml_length); 854 break; 855 856 case ACPI_TYPE_MUTEX: 857 858 acpi_os_printf("Mutex\n"); 859 break; 860 861 case ACPI_TYPE_DEVICE: 862 863 acpi_os_printf("Device\n"); 864 break; 865 866 case ACPI_TYPE_POWER: 867 868 acpi_os_printf("Power\n"); 869 break; 870 871 case ACPI_TYPE_PROCESSOR: 872 873 acpi_os_printf("Processor\n"); 874 break; 875 876 case ACPI_TYPE_THERMAL: 877 878 acpi_os_printf("Thermal\n"); 879 break; 880 881 default: 882 883 /* Unknown Type */ 884 885 acpi_os_printf("Unknown Type %X\n", obj_desc->common.type); 886 break; 887 } 888 889 return; 890 } 891 892 /******************************************************************************* 893 * 894 * FUNCTION: acpi_ex_dump_operands 895 * 896 * PARAMETERS: operands - A list of Operand objects 897 * opcode_name - AML opcode name 898 * num_operands - Operand count for this opcode 899 * 900 * DESCRIPTION: Dump the operands associated with the opcode 901 * 902 ******************************************************************************/ 903 904 void 905 acpi_ex_dump_operands(union acpi_operand_object **operands, 906 const char *opcode_name, u32 num_operands) 907 { 908 ACPI_FUNCTION_TRACE(ex_dump_operands); 909 910 if (!opcode_name) { 911 opcode_name = "UNKNOWN"; 912 } 913 914 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 915 "**** Start operand dump for opcode [%s], %u operands\n", 916 opcode_name, num_operands)); 917 918 if (num_operands == 0) { 919 num_operands = 1; 920 } 921 922 /* Dump the individual operands */ 923 924 while (num_operands) { 925 acpi_ex_dump_operand(*operands, 0); 926 operands++; 927 num_operands--; 928 } 929 930 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 931 "**** End operand dump for [%s]\n", opcode_name)); 932 return_VOID; 933 } 934 935 /******************************************************************************* 936 * 937 * FUNCTION: acpi_ex_out* functions 938 * 939 * PARAMETERS: title - Descriptive text 940 * value - Value to be displayed 941 * 942 * DESCRIPTION: Object dump output formatting functions. These functions 943 * reduce the number of format strings required and keeps them 944 * all in one place for easy modification. 945 * 946 ******************************************************************************/ 947 948 static void acpi_ex_out_string(const char *title, const char *value) 949 { 950 acpi_os_printf("%20s : %s\n", title, value); 951 } 952 953 static void acpi_ex_out_pointer(const char *title, const void *value) 954 { 955 acpi_os_printf("%20s : %p\n", title, value); 956 } 957 958 /******************************************************************************* 959 * 960 * FUNCTION: acpi_ex_dump_namespace_node 961 * 962 * PARAMETERS: node - Descriptor to dump 963 * flags - Force display if TRUE 964 * 965 * DESCRIPTION: Dumps the members of the given.Node 966 * 967 ******************************************************************************/ 968 969 void acpi_ex_dump_namespace_node(struct acpi_namespace_node *node, u32 flags) 970 { 971 972 ACPI_FUNCTION_ENTRY(); 973 974 if (!flags) { 975 976 /* Check if debug output enabled */ 977 978 if (!ACPI_IS_DEBUG_ENABLED(ACPI_LV_OBJECTS, _COMPONENT)) { 979 return; 980 } 981 } 982 983 acpi_os_printf("%20s : %4.4s\n", "Name", acpi_ut_get_node_name(node)); 984 acpi_os_printf("%20s : %2.2X [%s]\n", "Type", 985 node->type, acpi_ut_get_type_name(node->type)); 986 987 acpi_ex_dump_object(ACPI_CAST_PTR(union acpi_operand_object, node), 988 acpi_ex_dump_node); 989 } 990 991 /******************************************************************************* 992 * 993 * FUNCTION: acpi_ex_dump_reference_obj 994 * 995 * PARAMETERS: object - Descriptor to dump 996 * 997 * DESCRIPTION: Dumps a reference object 998 * 999 ******************************************************************************/ 1000 1001 static void acpi_ex_dump_reference_obj(union acpi_operand_object *obj_desc) 1002 { 1003 struct acpi_buffer ret_buf; 1004 acpi_status status; 1005 1006 ret_buf.length = ACPI_ALLOCATE_LOCAL_BUFFER; 1007 1008 if (obj_desc->reference.class == ACPI_REFCLASS_NAME) { 1009 acpi_os_printf(" %p ", obj_desc->reference.node); 1010 1011 status = acpi_ns_handle_to_pathname(obj_desc->reference.node, 1012 &ret_buf, TRUE); 1013 if (ACPI_FAILURE(status)) { 1014 acpi_os_printf 1015 (" Could not convert name to pathname: %s\n", 1016 acpi_format_exception(status)); 1017 } else { 1018 acpi_os_printf("%s: %s\n", 1019 acpi_ut_get_type_name(obj_desc-> 1020 reference.node-> 1021 type), 1022 (char *)ret_buf.pointer); 1023 ACPI_FREE(ret_buf.pointer); 1024 } 1025 } else if (obj_desc->reference.object) { 1026 if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) == 1027 ACPI_DESC_TYPE_OPERAND) { 1028 acpi_os_printf("%22s %p", "Target :", 1029 obj_desc->reference.object); 1030 if (obj_desc->reference.class == ACPI_REFCLASS_TABLE) { 1031 acpi_os_printf(" Table Index: %X\n", 1032 obj_desc->reference.value); 1033 } else { 1034 acpi_os_printf(" [%s]\n", 1035 acpi_ut_get_type_name(((union 1036 acpi_operand_object 1037 *) 1038 obj_desc-> 1039 reference. 1040 object)-> 1041 common. 1042 type)); 1043 } 1044 } else { 1045 acpi_os_printf(" Target: %p\n", 1046 obj_desc->reference.object); 1047 } 1048 } 1049 } 1050 1051 /******************************************************************************* 1052 * 1053 * FUNCTION: acpi_ex_dump_package_obj 1054 * 1055 * PARAMETERS: obj_desc - Descriptor to dump 1056 * level - Indentation Level 1057 * index - Package index for this object 1058 * 1059 * DESCRIPTION: Dumps the elements of the package 1060 * 1061 ******************************************************************************/ 1062 1063 static void 1064 acpi_ex_dump_package_obj(union acpi_operand_object *obj_desc, 1065 u32 level, u32 index) 1066 { 1067 u32 i; 1068 1069 /* Indentation and index output */ 1070 1071 if (level > 0) { 1072 for (i = 0; i < level; i++) { 1073 acpi_os_printf(" "); 1074 } 1075 1076 acpi_os_printf("[%.2d] ", index); 1077 } 1078 1079 acpi_os_printf("%p ", obj_desc); 1080 1081 /* Null package elements are allowed */ 1082 1083 if (!obj_desc) { 1084 acpi_os_printf("[Null Object]\n"); 1085 return; 1086 } 1087 1088 /* Packages may only contain a few object types */ 1089 1090 switch (obj_desc->common.type) { 1091 case ACPI_TYPE_INTEGER: 1092 1093 acpi_os_printf("[Integer] = %8.8X%8.8X\n", 1094 ACPI_FORMAT_UINT64(obj_desc->integer.value)); 1095 break; 1096 1097 case ACPI_TYPE_STRING: 1098 1099 acpi_os_printf("[String] Value: "); 1100 acpi_ut_print_string(obj_desc->string.pointer, ACPI_UINT8_MAX); 1101 acpi_os_printf("\n"); 1102 break; 1103 1104 case ACPI_TYPE_BUFFER: 1105 1106 acpi_os_printf("[Buffer] Length %.2X = ", 1107 obj_desc->buffer.length); 1108 if (obj_desc->buffer.length) { 1109 acpi_ut_debug_dump_buffer(ACPI_CAST_PTR 1110 (u8, 1111 obj_desc->buffer.pointer), 1112 obj_desc->buffer.length, 1113 DB_DWORD_DISPLAY, _COMPONENT); 1114 } else { 1115 acpi_os_printf("\n"); 1116 } 1117 break; 1118 1119 case ACPI_TYPE_PACKAGE: 1120 1121 acpi_os_printf("[Package] Contains %u Elements:\n", 1122 obj_desc->package.count); 1123 1124 for (i = 0; i < obj_desc->package.count; i++) { 1125 acpi_ex_dump_package_obj(obj_desc->package.elements[i], 1126 level + 1, i); 1127 } 1128 break; 1129 1130 case ACPI_TYPE_LOCAL_REFERENCE: 1131 1132 acpi_os_printf("[Object Reference] Class [%s]", 1133 acpi_ut_get_reference_name(obj_desc)); 1134 acpi_ex_dump_reference_obj(obj_desc); 1135 break; 1136 1137 default: 1138 1139 acpi_os_printf("[%s] Type: %2.2X\n", 1140 acpi_ut_get_type_name(obj_desc->common.type), 1141 obj_desc->common.type); 1142 break; 1143 } 1144 } 1145 1146 /******************************************************************************* 1147 * 1148 * FUNCTION: acpi_ex_dump_object_descriptor 1149 * 1150 * PARAMETERS: obj_desc - Descriptor to dump 1151 * flags - Force display if TRUE 1152 * 1153 * DESCRIPTION: Dumps the members of the object descriptor given. 1154 * 1155 ******************************************************************************/ 1156 1157 void 1158 acpi_ex_dump_object_descriptor(union acpi_operand_object *obj_desc, u32 flags) 1159 { 1160 ACPI_FUNCTION_TRACE(ex_dump_object_descriptor); 1161 1162 if (!obj_desc) { 1163 return_VOID; 1164 } 1165 1166 if (!flags) { 1167 1168 /* Check if debug output enabled */ 1169 1170 if (!ACPI_IS_DEBUG_ENABLED(ACPI_LV_OBJECTS, _COMPONENT)) { 1171 return_VOID; 1172 } 1173 } 1174 1175 if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) == ACPI_DESC_TYPE_NAMED) { 1176 acpi_ex_dump_namespace_node((struct acpi_namespace_node *) 1177 obj_desc, flags); 1178 1179 obj_desc = ((struct acpi_namespace_node *)obj_desc)->object; 1180 if (!obj_desc) { 1181 return_VOID; 1182 } 1183 1184 acpi_os_printf("\nAttached Object %p", obj_desc); 1185 if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) == ACPI_DESC_TYPE_NAMED) { 1186 acpi_os_printf(" - Namespace Node"); 1187 } 1188 1189 acpi_os_printf(":\n"); 1190 goto dump_object; 1191 } 1192 1193 if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) != ACPI_DESC_TYPE_OPERAND) { 1194 acpi_os_printf("%p is not an ACPI operand object: [%s]\n", 1195 obj_desc, acpi_ut_get_descriptor_name(obj_desc)); 1196 return_VOID; 1197 } 1198 1199 /* Validate the object type */ 1200 1201 if (obj_desc->common.type > ACPI_TYPE_LOCAL_MAX) { 1202 acpi_os_printf("Not a known object type: %2.2X\n", 1203 obj_desc->common.type); 1204 return_VOID; 1205 } 1206 1207 dump_object: 1208 1209 if (!obj_desc) { 1210 return_VOID; 1211 } 1212 1213 /* Common Fields */ 1214 1215 acpi_ex_dump_object(obj_desc, acpi_ex_dump_common); 1216 1217 /* Object-specific fields */ 1218 1219 acpi_ex_dump_object(obj_desc, acpi_ex_dump_info[obj_desc->common.type]); 1220 1221 if (obj_desc->common.type == ACPI_TYPE_REGION) { 1222 obj_desc = obj_desc->common.next_object; 1223 if (obj_desc->common.type > ACPI_TYPE_LOCAL_MAX) { 1224 acpi_os_printf 1225 ("Secondary object is not a known object type: %2.2X\n", 1226 obj_desc->common.type); 1227 1228 return_VOID; 1229 } 1230 1231 acpi_os_printf("\nExtra attached Object (%p):\n", obj_desc); 1232 acpi_ex_dump_object(obj_desc, 1233 acpi_ex_dump_info[obj_desc->common.type]); 1234 } 1235 1236 return_VOID; 1237 } 1238 1239 #endif 1240