void acpi_db_dump_buffer(u32 address) { acpi_os_printf("\nLocation %X:\n", address); acpi_dbg_level |= ACPI_LV_TABLES; acpi_ut_debug_dump_buffer(ACPI_TO_POINTER(address), 64, DB_BYTE_DISPLAY, ACPI_UINT32_MAX); }
void acpi_db_display_template(char *buffer_arg) { struct acpi_namespace_node *node; acpi_status status; struct acpi_buffer return_buffer; /* Translate buffer_arg to an Named object */ node = acpi_db_convert_to_node(buffer_arg); if (!node || (node == acpi_gbl_root_node)) { acpi_os_printf("Invalid argument: %s\n", buffer_arg); return; } /* We must have a buffer object */ if (node->type != ACPI_TYPE_BUFFER) { acpi_os_printf ("Not a Buffer object, cannot be a template: %s\n", buffer_arg); return; } return_buffer.length = ACPI_DEBUG_BUFFER_SIZE; return_buffer.pointer = acpi_gbl_db_buffer; /* Attempt to convert the raw buffer to a resource list */ status = acpi_rs_create_resource_list(node->object, &return_buffer); acpi_db_set_output_destination(ACPI_DB_REDIRECTABLE_OUTPUT); acpi_dbg_level |= ACPI_LV_RESOURCES; if (ACPI_FAILURE(status)) { acpi_os_printf ("Could not convert Buffer to a resource list: %s, %s\n", buffer_arg, acpi_format_exception(status)); goto dump_buffer; } /* Now we can dump the resource list */ acpi_rs_dump_resource_list(ACPI_CAST_PTR(struct acpi_resource, return_buffer.pointer)); dump_buffer: acpi_os_printf("\nRaw data buffer:\n"); acpi_ut_debug_dump_buffer((u8 *)node->object->buffer.pointer, node->object->buffer.length, DB_BYTE_DISPLAY, ACPI_UINT32_MAX); acpi_db_set_output_destination(ACPI_DB_CONSOLE_OUTPUT); return; }
void acpi_db_dump_external_object(union acpi_object *obj_desc, u32 level) { u32 i; if (!obj_desc) { acpi_os_printf("[Null Object]\n"); return; } for (i = 0; i < level; i++) { acpi_os_printf(" "); } switch (obj_desc->type) { case ACPI_TYPE_ANY: acpi_os_printf("[Null Object] (Type=0)\n"); break; case ACPI_TYPE_INTEGER: acpi_os_printf("[Integer] = %8.8X%8.8X\n", ACPI_FORMAT_UINT64(obj_desc->integer.value)); break; case ACPI_TYPE_STRING: acpi_os_printf("[String] Length %.2X = ", obj_desc->string.length); acpi_ut_print_string(obj_desc->string.pointer, ACPI_UINT8_MAX); acpi_os_printf("\n"); break; case ACPI_TYPE_BUFFER: acpi_os_printf("[Buffer] Length %.2X = ", obj_desc->buffer.length); if (obj_desc->buffer.length) { if (obj_desc->buffer.length > 16) { acpi_os_printf("\n"); } acpi_ut_debug_dump_buffer(ACPI_CAST_PTR (u8, obj_desc->buffer.pointer), obj_desc->buffer.length, DB_BYTE_DISPLAY, _COMPONENT); } else { acpi_os_printf("\n"); } break; case ACPI_TYPE_PACKAGE: acpi_os_printf("[Package] Contains %u Elements:\n", obj_desc->package.count); for (i = 0; i < obj_desc->package.count; i++) { acpi_db_dump_external_object(&obj_desc->package. elements[i], level + 1); } break; case ACPI_TYPE_LOCAL_REFERENCE: acpi_os_printf("[Object Reference] = "); acpi_db_display_internal_object(obj_desc->reference.handle, NULL); break; case ACPI_TYPE_PROCESSOR: acpi_os_printf("[Processor]\n"); break; case ACPI_TYPE_POWER: acpi_os_printf("[Power Resource]\n"); break; default: acpi_os_printf("[Unknown Type] %X\n", obj_desc->type); break; } }
void acpi_db_decode_and_display_object(char *target, char *output_type) { void *obj_ptr; struct acpi_namespace_node *node; union acpi_operand_object *obj_desc; u32 display = DB_BYTE_DISPLAY; char buffer[80]; struct acpi_buffer ret_buf; acpi_status status; u32 size; if (!target) { return; } /* Decode the output type */ if (output_type) { acpi_ut_strupr(output_type); if (output_type[0] == 'W') { display = DB_WORD_DISPLAY; } else if (output_type[0] == 'D') { display = DB_DWORD_DISPLAY; } else if (output_type[0] == 'Q') { display = DB_QWORD_DISPLAY; } } ret_buf.length = sizeof(buffer); ret_buf.pointer = buffer; /* Differentiate between a number and a name */ if ((target[0] >= 0x30) && (target[0] <= 0x39)) { obj_ptr = acpi_db_get_pointer(target); if (!acpi_os_readable(obj_ptr, 16)) { acpi_os_printf ("Address %p is invalid in this address space\n", obj_ptr); return; } /* Decode the object type */ switch (ACPI_GET_DESCRIPTOR_TYPE(obj_ptr)) { case ACPI_DESC_TYPE_NAMED: /* This is a namespace Node */ if (!acpi_os_readable (obj_ptr, sizeof(struct acpi_namespace_node))) { acpi_os_printf ("Cannot read entire Named object at address %p\n", obj_ptr); return; } node = obj_ptr; goto dump_node; case ACPI_DESC_TYPE_OPERAND: /* This is a ACPI OPERAND OBJECT */ if (!acpi_os_readable (obj_ptr, sizeof(union acpi_operand_object))) { acpi_os_printf ("Cannot read entire ACPI object at address %p\n", obj_ptr); return; } acpi_ut_debug_dump_buffer(obj_ptr, sizeof(union acpi_operand_object), display, ACPI_UINT32_MAX); acpi_ex_dump_object_descriptor(obj_ptr, 1); break; case ACPI_DESC_TYPE_PARSER: /* This is a Parser Op object */ if (!acpi_os_readable (obj_ptr, sizeof(union acpi_parse_object))) { acpi_os_printf ("Cannot read entire Parser object at address %p\n", obj_ptr); return; } acpi_ut_debug_dump_buffer(obj_ptr, sizeof(union acpi_parse_object), display, ACPI_UINT32_MAX); acpi_db_dump_parser_descriptor((union acpi_parse_object *)obj_ptr); break; default: /* Is not a recognizeable object */ acpi_os_printf ("Not a known ACPI internal object, descriptor type %2.2X\n", ACPI_GET_DESCRIPTOR_TYPE(obj_ptr)); size = 16; if (acpi_os_readable(obj_ptr, 64)) { size = 64; } /* Just dump some memory */ acpi_ut_debug_dump_buffer(obj_ptr, size, display, ACPI_UINT32_MAX); break; } return; } /* The parameter is a name string that must be resolved to a Named obj */ node = acpi_db_local_ns_lookup(target); if (!node) { return; } dump_node: /* Now dump the NS node */ status = acpi_get_name(node, ACPI_FULL_PATHNAME_NO_TRAILING, &ret_buf); if (ACPI_FAILURE(status)) { acpi_os_printf("Could not convert name to pathname\n"); } else { acpi_os_printf("Object (%p) Pathname: %s\n", node, (char *)ret_buf.pointer); } if (!acpi_os_readable(node, sizeof(struct acpi_namespace_node))) { acpi_os_printf("Invalid Named object at address %p\n", node); return; } acpi_ut_debug_dump_buffer((void *)node, sizeof(struct acpi_namespace_node), display, ACPI_UINT32_MAX); acpi_ex_dump_namespace_node(node, 1); obj_desc = acpi_ns_get_attached_object(node); if (obj_desc) { acpi_os_printf("\nAttached Object (%p):\n", obj_desc); if (!acpi_os_readable (obj_desc, sizeof(union acpi_operand_object))) { acpi_os_printf ("Invalid internal ACPI Object at address %p\n", obj_desc); return; } acpi_ut_debug_dump_buffer((void *)obj_desc, sizeof(union acpi_operand_object), display, ACPI_UINT32_MAX); acpi_ex_dump_object_descriptor(obj_desc, 1); } }