1097 lines · c
1// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.02/*******************************************************************************3 *4 * Module Name: dbdisply - debug display commands5 *6 ******************************************************************************/7 8#include <acpi/acpi.h>9#include "accommon.h"10#include "amlcode.h"11#include "acdispat.h"12#include "acnamesp.h"13#include "acparser.h"14#include "acinterp.h"15#include "acevents.h"16#include "acdebug.h"17 18#define _COMPONENT ACPI_CA_DEBUGGER19ACPI_MODULE_NAME("dbdisply")20 21/* Local prototypes */22static void acpi_db_dump_parser_descriptor(union acpi_parse_object *op);23 24static void *acpi_db_get_pointer(void *target);25 26static acpi_status27acpi_db_display_non_root_handlers(acpi_handle obj_handle,28 u32 nesting_level,29 void *context, void **return_value);30 31/*32 * System handler information.33 * Used for Handlers command, in acpi_db_display_handlers.34 */35#define ACPI_PREDEFINED_PREFIX "%25s (%.2X) : "36#define ACPI_HANDLER_NAME_STRING "%30s : "37#define ACPI_HANDLER_PRESENT_STRING "%-9s (%p)\n"38#define ACPI_HANDLER_PRESENT_STRING2 "%-9s (%p)"39#define ACPI_HANDLER_NOT_PRESENT_STRING "%-9s\n"40 41/* All predefined Address Space IDs */42 43static acpi_adr_space_type acpi_gbl_space_id_list[] = {44 ACPI_ADR_SPACE_SYSTEM_MEMORY,45 ACPI_ADR_SPACE_SYSTEM_IO,46 ACPI_ADR_SPACE_PCI_CONFIG,47 ACPI_ADR_SPACE_EC,48 ACPI_ADR_SPACE_SMBUS,49 ACPI_ADR_SPACE_CMOS,50 ACPI_ADR_SPACE_PCI_BAR_TARGET,51 ACPI_ADR_SPACE_IPMI,52 ACPI_ADR_SPACE_GPIO,53 ACPI_ADR_SPACE_GSBUS,54 ACPI_ADR_SPACE_PLATFORM_COMM,55 ACPI_ADR_SPACE_PLATFORM_RT,56 ACPI_ADR_SPACE_DATA_TABLE,57 ACPI_ADR_SPACE_FIXED_HARDWARE58};59 60/* Global handler information */61 62typedef struct acpi_handler_info {63 void *handler;64 char *name;65 66} acpi_handler_info;67 68static struct acpi_handler_info acpi_gbl_handler_list[] = {69 {&acpi_gbl_global_notify[0].handler, "System Notifications"},70 {&acpi_gbl_global_notify[1].handler, "Device Notifications"},71 {&acpi_gbl_table_handler, "ACPI Table Events"},72 {&acpi_gbl_exception_handler, "Control Method Exceptions"},73 {&acpi_gbl_interface_handler, "OSI Invocations"}74};75 76/*******************************************************************************77 *78 * FUNCTION: acpi_db_get_pointer79 *80 * PARAMETERS: target - Pointer to string to be converted81 *82 * RETURN: Converted pointer83 *84 * DESCRIPTION: Convert an ascii pointer value to a real value85 *86 ******************************************************************************/87 88static void *acpi_db_get_pointer(void *target)89{90 void *obj_ptr;91 acpi_size address;92 93 address = strtoul(target, NULL, 16);94 obj_ptr = ACPI_TO_POINTER(address);95 return (obj_ptr);96}97 98/*******************************************************************************99 *100 * FUNCTION: acpi_db_dump_parser_descriptor101 *102 * PARAMETERS: op - A parser Op descriptor103 *104 * RETURN: None105 *106 * DESCRIPTION: Display a formatted parser object107 *108 ******************************************************************************/109 110static void acpi_db_dump_parser_descriptor(union acpi_parse_object *op)111{112 const struct acpi_opcode_info *info;113 114 info = acpi_ps_get_opcode_info(op->common.aml_opcode);115 116 acpi_os_printf("Parser Op Descriptor:\n");117 acpi_os_printf("%20.20s : %4.4X\n", "Opcode", op->common.aml_opcode);118 119 ACPI_DEBUG_ONLY_MEMBERS(acpi_os_printf("%20.20s : %s\n", "Opcode Name",120 info->name));121 122 acpi_os_printf("%20.20s : %p\n", "Value/ArgList", op->common.value.arg);123 acpi_os_printf("%20.20s : %p\n", "Parent", op->common.parent);124 acpi_os_printf("%20.20s : %p\n", "NextOp", op->common.next);125}126 127/*******************************************************************************128 *129 * FUNCTION: acpi_db_decode_and_display_object130 *131 * PARAMETERS: target - String with object to be displayed. Names132 * and hex pointers are supported.133 * output_type - Byte, Word, Dword, or Qword (B|W|D|Q)134 *135 * RETURN: None136 *137 * DESCRIPTION: Display a formatted ACPI object138 *139 ******************************************************************************/140 141void acpi_db_decode_and_display_object(char *target, char *output_type)142{143 void *obj_ptr;144 struct acpi_namespace_node *node;145 union acpi_operand_object *obj_desc;146 u32 display = DB_BYTE_DISPLAY;147 char buffer[80];148 struct acpi_buffer ret_buf;149 acpi_status status;150 u32 size;151 152 if (!target) {153 return;154 }155 156 /* Decode the output type */157 158 if (output_type) {159 acpi_ut_strupr(output_type);160 if (output_type[0] == 'W') {161 display = DB_WORD_DISPLAY;162 } else if (output_type[0] == 'D') {163 display = DB_DWORD_DISPLAY;164 } else if (output_type[0] == 'Q') {165 display = DB_QWORD_DISPLAY;166 }167 }168 169 ret_buf.length = sizeof(buffer);170 ret_buf.pointer = buffer;171 172 /* Differentiate between a number and a name */173 174 if ((target[0] >= 0x30) && (target[0] <= 0x39)) {175 obj_ptr = acpi_db_get_pointer(target);176 if (!acpi_os_readable(obj_ptr, 16)) {177 acpi_os_printf178 ("Address %p is invalid in this address space\n",179 obj_ptr);180 return;181 }182 183 /* Decode the object type */184 185 switch (ACPI_GET_DESCRIPTOR_TYPE(obj_ptr)) {186 case ACPI_DESC_TYPE_NAMED:187 188 /* This is a namespace Node */189 190 if (!acpi_os_readable191 (obj_ptr, sizeof(struct acpi_namespace_node))) {192 acpi_os_printf193 ("Cannot read entire Named object at address %p\n",194 obj_ptr);195 return;196 }197 198 node = obj_ptr;199 goto dump_node;200 201 case ACPI_DESC_TYPE_OPERAND:202 203 /* This is a ACPI OPERAND OBJECT */204 205 if (!acpi_os_readable206 (obj_ptr, sizeof(union acpi_operand_object))) {207 acpi_os_printf208 ("Cannot read entire ACPI object at address %p\n",209 obj_ptr);210 return;211 }212 213 acpi_ut_debug_dump_buffer(obj_ptr,214 sizeof(union215 acpi_operand_object),216 display, ACPI_UINT32_MAX);217 acpi_ex_dump_object_descriptor(obj_ptr, 1);218 break;219 220 case ACPI_DESC_TYPE_PARSER:221 222 /* This is a Parser Op object */223 224 if (!acpi_os_readable225 (obj_ptr, sizeof(union acpi_parse_object))) {226 acpi_os_printf227 ("Cannot read entire Parser object at address %p\n",228 obj_ptr);229 return;230 }231 232 acpi_ut_debug_dump_buffer(obj_ptr,233 sizeof(union234 acpi_parse_object),235 display, ACPI_UINT32_MAX);236 acpi_db_dump_parser_descriptor((union acpi_parse_object237 *)obj_ptr);238 break;239 240 default:241 242 /* Is not a recognizable object */243 244 acpi_os_printf245 ("Not a known ACPI internal object, descriptor type %2.2X\n",246 ACPI_GET_DESCRIPTOR_TYPE(obj_ptr));247 248 size = 16;249 if (acpi_os_readable(obj_ptr, 64)) {250 size = 64;251 }252 253 /* Just dump some memory */254 255 acpi_ut_debug_dump_buffer(obj_ptr, size, display,256 ACPI_UINT32_MAX);257 break;258 }259 260 return;261 }262 263 /* The parameter is a name string that must be resolved to a Named obj */264 265 node = acpi_db_local_ns_lookup(target);266 if (!node) {267 return;268 }269 270dump_node:271 /* Now dump the NS node */272 273 status = acpi_get_name(node, ACPI_FULL_PATHNAME_NO_TRAILING, &ret_buf);274 if (ACPI_FAILURE(status)) {275 acpi_os_printf("Could not convert name to pathname\n");276 }277 278 else {279 acpi_os_printf("Object %p: Namespace Node - Pathname: %s\n",280 node, (char *)ret_buf.pointer);281 }282 283 if (!acpi_os_readable(node, sizeof(struct acpi_namespace_node))) {284 acpi_os_printf("Invalid Named object at address %p\n", node);285 return;286 }287 288 acpi_ut_debug_dump_buffer((void *)node,289 sizeof(struct acpi_namespace_node), display,290 ACPI_UINT32_MAX);291 acpi_ex_dump_namespace_node(node, 1);292 293 obj_desc = acpi_ns_get_attached_object(node);294 if (obj_desc) {295 acpi_os_printf("\nAttached Object %p:", obj_desc);296 if (!acpi_os_readable297 (obj_desc, sizeof(union acpi_operand_object))) {298 acpi_os_printf299 ("Invalid internal ACPI Object at address %p\n",300 obj_desc);301 return;302 }303 304 if (ACPI_GET_DESCRIPTOR_TYPE(((struct acpi_namespace_node *)305 obj_desc)) ==306 ACPI_DESC_TYPE_NAMED) {307 acpi_os_printf(" Namespace Node - ");308 status =309 acpi_get_name((struct acpi_namespace_node *)310 obj_desc,311 ACPI_FULL_PATHNAME_NO_TRAILING,312 &ret_buf);313 if (ACPI_FAILURE(status)) {314 acpi_os_printf315 ("Could not convert name to pathname\n");316 } else {317 acpi_os_printf("Pathname: %s",318 (char *)ret_buf.pointer);319 }320 321 acpi_os_printf("\n");322 acpi_ut_debug_dump_buffer((void *)obj_desc,323 sizeof(struct324 acpi_namespace_node),325 display, ACPI_UINT32_MAX);326 } else {327 acpi_os_printf("\n");328 acpi_ut_debug_dump_buffer((void *)obj_desc,329 sizeof(union330 acpi_operand_object),331 display, ACPI_UINT32_MAX);332 }333 334 acpi_ex_dump_object_descriptor(obj_desc, 1);335 }336}337 338/*******************************************************************************339 *340 * FUNCTION: acpi_db_display_method_info341 *342 * PARAMETERS: start_op - Root of the control method parse tree343 *344 * RETURN: None345 *346 * DESCRIPTION: Display information about the current method347 *348 ******************************************************************************/349 350void acpi_db_display_method_info(union acpi_parse_object *start_op)351{352 struct acpi_walk_state *walk_state;353 union acpi_operand_object *obj_desc;354 struct acpi_namespace_node *node;355 union acpi_parse_object *root_op;356 union acpi_parse_object *op;357 const struct acpi_opcode_info *op_info;358 u32 num_ops = 0;359 u32 num_operands = 0;360 u32 num_operators = 0;361 u32 num_remaining_ops = 0;362 u32 num_remaining_operands = 0;363 u32 num_remaining_operators = 0;364 u8 count_remaining = FALSE;365 366 walk_state = acpi_ds_get_current_walk_state(acpi_gbl_current_walk_list);367 if (!walk_state) {368 acpi_os_printf("There is no method currently executing\n");369 return;370 }371 372 obj_desc = walk_state->method_desc;373 node = walk_state->method_node;374 375 acpi_os_printf("Currently executing control method is [%4.4s]\n",376 acpi_ut_get_node_name(node));377 acpi_os_printf("%X Arguments, SyncLevel = %X\n",378 (u32)obj_desc->method.param_count,379 (u32)obj_desc->method.sync_level);380 381 root_op = start_op;382 while (root_op->common.parent) {383 root_op = root_op->common.parent;384 }385 386 op = root_op;387 388 while (op) {389 if (op == start_op) {390 count_remaining = TRUE;391 }392 393 num_ops++;394 if (count_remaining) {395 num_remaining_ops++;396 }397 398 /* Decode the opcode */399 400 op_info = acpi_ps_get_opcode_info(op->common.aml_opcode);401 switch (op_info->class) {402 case AML_CLASS_ARGUMENT:403 404 if (count_remaining) {405 num_remaining_operands++;406 }407 408 num_operands++;409 break;410 411 case AML_CLASS_UNKNOWN:412 413 /* Bad opcode or ASCII character */414 415 continue;416 417 default:418 419 if (count_remaining) {420 num_remaining_operators++;421 }422 423 num_operators++;424 break;425 }426 427 op = acpi_ps_get_depth_next(start_op, op);428 }429 430 acpi_os_printf431 ("Method contains: %X AML Opcodes - %X Operators, %X Operands\n",432 num_ops, num_operators, num_operands);433 434 acpi_os_printf435 ("Remaining to execute: %X AML Opcodes - %X Operators, %X Operands\n",436 num_remaining_ops, num_remaining_operators,437 num_remaining_operands);438}439 440/*******************************************************************************441 *442 * FUNCTION: acpi_db_display_locals443 *444 * PARAMETERS: None445 *446 * RETURN: None447 *448 * DESCRIPTION: Display all locals for the currently running control method449 *450 ******************************************************************************/451 452void acpi_db_display_locals(void)453{454 struct acpi_walk_state *walk_state;455 456 walk_state = acpi_ds_get_current_walk_state(acpi_gbl_current_walk_list);457 if (!walk_state) {458 acpi_os_printf("There is no method currently executing\n");459 return;460 }461 462 acpi_db_decode_locals(walk_state);463}464 465/*******************************************************************************466 *467 * FUNCTION: acpi_db_display_arguments468 *469 * PARAMETERS: None470 *471 * RETURN: None472 *473 * DESCRIPTION: Display all arguments for the currently running control method474 *475 ******************************************************************************/476 477void acpi_db_display_arguments(void)478{479 struct acpi_walk_state *walk_state;480 481 walk_state = acpi_ds_get_current_walk_state(acpi_gbl_current_walk_list);482 if (!walk_state) {483 acpi_os_printf("There is no method currently executing\n");484 return;485 }486 487 acpi_db_decode_arguments(walk_state);488}489 490/*******************************************************************************491 *492 * FUNCTION: acpi_db_display_results493 *494 * PARAMETERS: None495 *496 * RETURN: None497 *498 * DESCRIPTION: Display current contents of a method result stack499 *500 ******************************************************************************/501 502void acpi_db_display_results(void)503{504 u32 i;505 struct acpi_walk_state *walk_state;506 union acpi_operand_object *obj_desc;507 u32 result_count = 0;508 struct acpi_namespace_node *node;509 union acpi_generic_state *frame;510 u32 index; /* Index onto current frame */511 512 walk_state = acpi_ds_get_current_walk_state(acpi_gbl_current_walk_list);513 if (!walk_state) {514 acpi_os_printf("There is no method currently executing\n");515 return;516 }517 518 node = walk_state->method_node;519 520 if (walk_state->results) {521 result_count = walk_state->result_count;522 }523 524 acpi_os_printf("Method [%4.4s] has %X stacked result objects\n",525 acpi_ut_get_node_name(node), result_count);526 527 /* From the top element of result stack */528 529 frame = walk_state->results;530 index = (result_count - 1) % ACPI_RESULTS_FRAME_OBJ_NUM;531 532 for (i = 0; i < result_count; i++) {533 obj_desc = frame->results.obj_desc[index];534 acpi_os_printf("Result%u: ", i);535 acpi_db_display_internal_object(obj_desc, walk_state);536 537 if (index == 0) {538 frame = frame->results.next;539 index = ACPI_RESULTS_FRAME_OBJ_NUM;540 }541 542 index--;543 }544}545 546/*******************************************************************************547 *548 * FUNCTION: acpi_db_display_calling_tree549 *550 * PARAMETERS: None551 *552 * RETURN: None553 *554 * DESCRIPTION: Display current calling tree of nested control methods555 *556 ******************************************************************************/557 558void acpi_db_display_calling_tree(void)559{560 struct acpi_walk_state *walk_state;561 struct acpi_namespace_node *node;562 563 walk_state = acpi_ds_get_current_walk_state(acpi_gbl_current_walk_list);564 if (!walk_state) {565 acpi_os_printf("There is no method currently executing\n");566 return;567 }568 569 acpi_os_printf("Current Control Method Call Tree\n");570 571 while (walk_state) {572 node = walk_state->method_node;573 acpi_os_printf(" [%4.4s]\n", acpi_ut_get_node_name(node));574 575 walk_state = walk_state->next;576 }577}578 579/*******************************************************************************580 *581 * FUNCTION: acpi_db_display_object_type582 *583 * PARAMETERS: object_arg - User entered NS node handle584 *585 * RETURN: None586 *587 * DESCRIPTION: Display type of an arbitrary NS node588 *589 ******************************************************************************/590 591void acpi_db_display_object_type(char *object_arg)592{593 acpi_size arg;594 acpi_handle handle;595 struct acpi_device_info *info;596 acpi_status status;597 u32 i;598 599 arg = strtoul(object_arg, NULL, 16);600 handle = ACPI_TO_POINTER(arg);601 602 status = acpi_get_object_info(handle, &info);603 if (ACPI_FAILURE(status)) {604 acpi_os_printf("Could not get object info, %s\n",605 acpi_format_exception(status));606 return;607 }608 609 acpi_os_printf("ADR: %8.8X%8.8X, Flags: %X\n",610 ACPI_FORMAT_UINT64(info->address), info->flags);611 612 acpi_os_printf("S1D-%2.2X S2D-%2.2X S3D-%2.2X S4D-%2.2X\n",613 info->highest_dstates[0], info->highest_dstates[1],614 info->highest_dstates[2], info->highest_dstates[3]);615 616 acpi_os_printf("S0W-%2.2X S1W-%2.2X S2W-%2.2X S3W-%2.2X S4W-%2.2X\n",617 info->lowest_dstates[0], info->lowest_dstates[1],618 info->lowest_dstates[2], info->lowest_dstates[3],619 info->lowest_dstates[4]);620 621 if (info->valid & ACPI_VALID_HID) {622 acpi_os_printf("HID: %s\n", info->hardware_id.string);623 }624 625 if (info->valid & ACPI_VALID_UID) {626 acpi_os_printf("UID: %s\n", info->unique_id.string);627 }628 629 if (info->valid & ACPI_VALID_CID) {630 for (i = 0; i < info->compatible_id_list.count; i++) {631 acpi_os_printf("CID %u: %s\n", i,632 info->compatible_id_list.ids[i].string);633 }634 }635 636 ACPI_FREE(info);637}638 639/*******************************************************************************640 *641 * FUNCTION: acpi_db_display_result_object642 *643 * PARAMETERS: obj_desc - Object to be displayed644 * walk_state - Current walk state645 *646 * RETURN: None647 *648 * DESCRIPTION: Display the result of an AML opcode649 *650 * Note: Currently only displays the result object if we are single stepping.651 * However, this output may be useful in other contexts and could be enabled652 * to do so if needed.653 *654 ******************************************************************************/655 656void657acpi_db_display_result_object(union acpi_operand_object *obj_desc,658 struct acpi_walk_state *walk_state)659{660 661#ifndef ACPI_APPLICATION662 if (acpi_gbl_db_thread_id != acpi_os_get_thread_id()) {663 return;664 }665#endif666 667 /* Only display if single stepping */668 669 if (!acpi_gbl_cm_single_step) {670 return;671 }672 673 acpi_os_printf("ResultObj: ");674 acpi_db_display_internal_object(obj_desc, walk_state);675 acpi_os_printf("\n");676}677 678/*******************************************************************************679 *680 * FUNCTION: acpi_db_display_argument_object681 *682 * PARAMETERS: obj_desc - Object to be displayed683 * walk_state - Current walk state684 *685 * RETURN: None686 *687 * DESCRIPTION: Display the result of an AML opcode688 *689 ******************************************************************************/690 691void692acpi_db_display_argument_object(union acpi_operand_object *obj_desc,693 struct acpi_walk_state *walk_state)694{695 696#ifndef ACPI_APPLICATION697 if (acpi_gbl_db_thread_id != acpi_os_get_thread_id()) {698 return;699 }700#endif701 702 if (!acpi_gbl_cm_single_step) {703 return;704 }705 706 acpi_os_printf("ArgObj: ");707 acpi_db_display_internal_object(obj_desc, walk_state);708}709 710#if (!ACPI_REDUCED_HARDWARE)711/*******************************************************************************712 *713 * FUNCTION: acpi_db_display_gpes714 *715 * PARAMETERS: None716 *717 * RETURN: None718 *719 * DESCRIPTION: Display the current GPE structures720 *721 ******************************************************************************/722 723void acpi_db_display_gpes(void)724{725 struct acpi_gpe_block_info *gpe_block;726 struct acpi_gpe_xrupt_info *gpe_xrupt_info;727 struct acpi_gpe_event_info *gpe_event_info;728 struct acpi_gpe_register_info *gpe_register_info;729 char *gpe_type;730 struct acpi_gpe_notify_info *notify;731 u32 gpe_index;732 u32 block = 0;733 u32 i;734 u32 j;735 u32 count;736 char buffer[80];737 struct acpi_buffer ret_buf;738 acpi_status status;739 740 ret_buf.length = sizeof(buffer);741 ret_buf.pointer = buffer;742 743 block = 0;744 745 /* Walk the GPE lists */746 747 gpe_xrupt_info = acpi_gbl_gpe_xrupt_list_head;748 while (gpe_xrupt_info) {749 gpe_block = gpe_xrupt_info->gpe_block_list_head;750 while (gpe_block) {751 status = acpi_get_name(gpe_block->node,752 ACPI_FULL_PATHNAME_NO_TRAILING,753 &ret_buf);754 if (ACPI_FAILURE(status)) {755 acpi_os_printf756 ("Could not convert name to pathname\n");757 }758 759 if (gpe_block->node == acpi_gbl_fadt_gpe_device) {760 gpe_type = "FADT-defined GPE block";761 } else {762 gpe_type = "GPE Block Device";763 }764 765 acpi_os_printf766 ("\nBlock %u - Info %p DeviceNode %p [%s] - %s\n",767 block, gpe_block, gpe_block->node, buffer,768 gpe_type);769 770 acpi_os_printf(" Registers: %u (%u GPEs)\n",771 gpe_block->register_count,772 gpe_block->gpe_count);773 774 acpi_os_printf775 (" GPE range: 0x%X to 0x%X on interrupt %u\n",776 gpe_block->block_base_number,777 gpe_block->block_base_number +778 (gpe_block->gpe_count - 1),779 gpe_xrupt_info->interrupt_number);780 781 acpi_os_printf782 (" RegisterInfo: %p Status %8.8X%8.8X Enable %8.8X%8.8X\n",783 gpe_block->register_info,784 ACPI_FORMAT_UINT64(gpe_block->register_info->785 status_address.address),786 ACPI_FORMAT_UINT64(gpe_block->register_info->787 enable_address.address));788 789 acpi_os_printf(" EventInfo: %p\n",790 gpe_block->event_info);791 792 /* Examine each GPE Register within the block */793 794 for (i = 0; i < gpe_block->register_count; i++) {795 gpe_register_info =796 &gpe_block->register_info[i];797 798 acpi_os_printf(" Reg %u: (GPE %.2X-%.2X) "799 "RunEnable %2.2X WakeEnable %2.2X"800 " Status %8.8X%8.8X Enable %8.8X%8.8X\n",801 i,802 gpe_register_info->803 base_gpe_number,804 gpe_register_info->805 base_gpe_number +806 (ACPI_GPE_REGISTER_WIDTH - 1),807 gpe_register_info->808 enable_for_run,809 gpe_register_info->810 enable_for_wake,811 ACPI_FORMAT_UINT64812 (gpe_register_info->813 status_address.address),814 ACPI_FORMAT_UINT64815 (gpe_register_info->816 enable_address.address));817 818 /* Now look at the individual GPEs in this byte register */819 820 for (j = 0; j < ACPI_GPE_REGISTER_WIDTH; j++) {821 gpe_index =822 (i * ACPI_GPE_REGISTER_WIDTH) + j;823 gpe_event_info =824 &gpe_block->event_info[gpe_index];825 826 if (ACPI_GPE_DISPATCH_TYPE827 (gpe_event_info->flags) ==828 ACPI_GPE_DISPATCH_NONE) {829 830 /* This GPE is not used (no method or handler), ignore it */831 832 continue;833 }834 835 acpi_os_printf836 (" GPE %.2X: %p RunRefs %2.2X Flags %2.2X (",837 gpe_block->block_base_number +838 gpe_index, gpe_event_info,839 gpe_event_info->runtime_count,840 gpe_event_info->flags);841 842 /* Decode the flags byte */843 844 if (gpe_event_info->845 flags & ACPI_GPE_LEVEL_TRIGGERED) {846 acpi_os_printf("Level, ");847 } else {848 acpi_os_printf("Edge, ");849 }850 851 if (gpe_event_info->852 flags & ACPI_GPE_CAN_WAKE) {853 acpi_os_printf("CanWake, ");854 } else {855 acpi_os_printf("RunOnly, ");856 }857 858 switch (ACPI_GPE_DISPATCH_TYPE859 (gpe_event_info->flags)) {860 case ACPI_GPE_DISPATCH_NONE:861 862 acpi_os_printf("NotUsed");863 break;864 865 case ACPI_GPE_DISPATCH_METHOD:866 867 acpi_os_printf("Method");868 break;869 870 case ACPI_GPE_DISPATCH_HANDLER:871 872 acpi_os_printf("Handler");873 break;874 875 case ACPI_GPE_DISPATCH_NOTIFY:876 877 count = 0;878 notify =879 gpe_event_info->dispatch.880 notify_list;881 while (notify) {882 count++;883 notify = notify->next;884 }885 886 acpi_os_printf887 ("Implicit Notify on %u devices",888 count);889 break;890 891 case ACPI_GPE_DISPATCH_RAW_HANDLER:892 893 acpi_os_printf("RawHandler");894 break;895 896 default:897 898 acpi_os_printf("UNKNOWN: %X",899 ACPI_GPE_DISPATCH_TYPE900 (gpe_event_info->901 flags));902 break;903 }904 905 acpi_os_printf(")\n");906 }907 }908 909 block++;910 gpe_block = gpe_block->next;911 }912 913 gpe_xrupt_info = gpe_xrupt_info->next;914 }915}916#endif /* !ACPI_REDUCED_HARDWARE */917 918/*******************************************************************************919 *920 * FUNCTION: acpi_db_display_handlers921 *922 * PARAMETERS: None923 *924 * RETURN: None925 *926 * DESCRIPTION: Display the currently installed global handlers927 *928 ******************************************************************************/929 930void acpi_db_display_handlers(void)931{932 union acpi_operand_object *obj_desc;933 union acpi_operand_object *handler_obj;934 acpi_adr_space_type space_id;935 u32 i;936 937 /* Operation region handlers */938 939 acpi_os_printf("\nOperation Region Handlers at the namespace root:\n");940 941 obj_desc = acpi_ns_get_attached_object(acpi_gbl_root_node);942 if (obj_desc) {943 for (i = 0; i < ACPI_ARRAY_LENGTH(acpi_gbl_space_id_list); i++) {944 space_id = acpi_gbl_space_id_list[i];945 946 acpi_os_printf(ACPI_PREDEFINED_PREFIX,947 acpi_ut_get_region_name((u8)space_id),948 space_id);949 950 handler_obj =951 acpi_ev_find_region_handler(space_id,952 obj_desc->common_notify.953 handler);954 if (handler_obj) {955 acpi_os_printf(ACPI_HANDLER_PRESENT_STRING,956 (handler_obj->address_space.957 handler_flags &958 ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)959 ? "Default" : "User",960 handler_obj->address_space.961 handler);962 963 goto found_handler;964 }965 966 /* There is no handler for this space_id */967 968 acpi_os_printf("None\n");969 970found_handler: ;971 }972 973 /* Find all handlers for user-defined space_IDs */974 975 handler_obj = obj_desc->common_notify.handler;976 while (handler_obj) {977 if (handler_obj->address_space.space_id >=978 ACPI_USER_REGION_BEGIN) {979 acpi_os_printf(ACPI_PREDEFINED_PREFIX,980 "User-defined ID",981 handler_obj->address_space.982 space_id);983 acpi_os_printf(ACPI_HANDLER_PRESENT_STRING,984 (handler_obj->address_space.985 handler_flags &986 ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)987 ? "Default" : "User",988 handler_obj->address_space.989 handler);990 }991 992 handler_obj = handler_obj->address_space.next;993 }994 }995#if (!ACPI_REDUCED_HARDWARE)996 997 /* Fixed event handlers */998 999 acpi_os_printf("\nFixed Event Handlers:\n");1000 1001 for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++) {1002 acpi_os_printf(ACPI_PREDEFINED_PREFIX,1003 acpi_ut_get_event_name(i), i);1004 if (acpi_gbl_fixed_event_handlers[i].handler) {1005 acpi_os_printf(ACPI_HANDLER_PRESENT_STRING, "User",1006 acpi_gbl_fixed_event_handlers[i].1007 handler);1008 } else {1009 acpi_os_printf(ACPI_HANDLER_NOT_PRESENT_STRING, "None");1010 }1011 }1012 1013#endif /* !ACPI_REDUCED_HARDWARE */1014 1015 /* Miscellaneous global handlers */1016 1017 acpi_os_printf("\nMiscellaneous Global Handlers:\n");1018 1019 for (i = 0; i < ACPI_ARRAY_LENGTH(acpi_gbl_handler_list); i++) {1020 acpi_os_printf(ACPI_HANDLER_NAME_STRING,1021 acpi_gbl_handler_list[i].name);1022 1023 if (acpi_gbl_handler_list[i].handler) {1024 acpi_os_printf(ACPI_HANDLER_PRESENT_STRING, "User",1025 acpi_gbl_handler_list[i].handler);1026 } else {1027 acpi_os_printf(ACPI_HANDLER_NOT_PRESENT_STRING, "None");1028 }1029 }1030 1031 /* Other handlers that are installed throughout the namespace */1032 1033 acpi_os_printf("\nOperation Region Handlers for specific devices:\n");1034 1035 (void)acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,1036 ACPI_UINT32_MAX,1037 acpi_db_display_non_root_handlers, NULL, NULL,1038 NULL);1039}1040 1041/*******************************************************************************1042 *1043 * FUNCTION: acpi_db_display_non_root_handlers1044 *1045 * PARAMETERS: acpi_walk_callback1046 *1047 * RETURN: Status1048 *1049 * DESCRIPTION: Display information about all handlers installed for a1050 * device object.1051 *1052 ******************************************************************************/1053 1054static acpi_status1055acpi_db_display_non_root_handlers(acpi_handle obj_handle,1056 u32 nesting_level,1057 void *context, void **return_value)1058{1059 struct acpi_namespace_node *node =1060 ACPI_CAST_PTR(struct acpi_namespace_node, obj_handle);1061 union acpi_operand_object *obj_desc;1062 union acpi_operand_object *handler_obj;1063 char *pathname;1064 1065 obj_desc = acpi_ns_get_attached_object(node);1066 if (!obj_desc) {1067 return (AE_OK);1068 }1069 1070 pathname = acpi_ns_get_normalized_pathname(node, TRUE);1071 if (!pathname) {1072 return (AE_OK);1073 }1074 1075 /* Display all handlers associated with this device */1076 1077 handler_obj = obj_desc->common_notify.handler;1078 while (handler_obj) {1079 acpi_os_printf(ACPI_PREDEFINED_PREFIX,1080 acpi_ut_get_region_name((u8)handler_obj->1081 address_space.space_id),1082 handler_obj->address_space.space_id);1083 1084 acpi_os_printf(ACPI_HANDLER_PRESENT_STRING2,1085 (handler_obj->address_space.handler_flags &1086 ACPI_ADDR_HANDLER_DEFAULT_INSTALLED) ? "Default"1087 : "User", handler_obj->address_space.handler);1088 1089 acpi_os_printf(" Device Name: %s (%p)\n", pathname, node);1090 1091 handler_obj = handler_obj->address_space.next;1092 }1093 1094 ACPI_FREE(pathname);1095 return (AE_OK);1096}1097