mirror of
https://github.com/torvalds/linux.git
synced 2024-12-27 13:22:23 +00:00
ACPICA: debugger: add command to dump all fields of particular subtype
In acpiexec, this can be invoked by typing "fields" followed by a number representing the address space ID of that field. Signed-off-by: Erik Schmauss <erik.schmauss@intel.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
efcf9456c8
commit
5fd033288a
@ -148,6 +148,8 @@ void acpi_db_find_references(char *object_arg);
|
|||||||
|
|
||||||
void acpi_db_get_bus_info(void);
|
void acpi_db_get_bus_info(void);
|
||||||
|
|
||||||
|
acpi_status acpi_db_display_fields(u32 address_space_id);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* dbdisply - debug display commands
|
* dbdisply - debug display commands
|
||||||
*/
|
*/
|
||||||
|
@ -192,6 +192,16 @@ struct acpi_device_walk_info {
|
|||||||
u32 num_INI;
|
u32 num_INI;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Info used by Acpi acpi_db_display_fields */
|
||||||
|
|
||||||
|
struct acpi_region_walk_info {
|
||||||
|
u32 debug_level;
|
||||||
|
u32 count;
|
||||||
|
acpi_owner_id owner_id;
|
||||||
|
u8 display_type;
|
||||||
|
u32 address_space_id;
|
||||||
|
};
|
||||||
|
|
||||||
/* TBD: [Restructure] Merge with struct above */
|
/* TBD: [Restructure] Merge with struct above */
|
||||||
|
|
||||||
struct acpi_walk_info {
|
struct acpi_walk_info {
|
||||||
|
@ -50,6 +50,7 @@ enum acpi_ex_debugger_commands {
|
|||||||
CMD_EVALUATE,
|
CMD_EVALUATE,
|
||||||
CMD_EXECUTE,
|
CMD_EXECUTE,
|
||||||
CMD_EXIT,
|
CMD_EXIT,
|
||||||
|
CMD_FIELDS,
|
||||||
CMD_FIND,
|
CMD_FIND,
|
||||||
CMD_GO,
|
CMD_GO,
|
||||||
CMD_HANDLERS,
|
CMD_HANDLERS,
|
||||||
@ -127,6 +128,7 @@ static const struct acpi_db_command_info acpi_gbl_db_commands[] = {
|
|||||||
{"EVALUATE", 1},
|
{"EVALUATE", 1},
|
||||||
{"EXECUTE", 1},
|
{"EXECUTE", 1},
|
||||||
{"EXIT", 0},
|
{"EXIT", 0},
|
||||||
|
{"FIELDS", 1},
|
||||||
{"FIND", 1},
|
{"FIND", 1},
|
||||||
{"GO", 0},
|
{"GO", 0},
|
||||||
{"HANDLERS", 0},
|
{"HANDLERS", 0},
|
||||||
@ -200,6 +202,8 @@ static const struct acpi_db_command_help acpi_gbl_db_command_help[] = {
|
|||||||
"Find ACPI name(s) with wildcards\n"},
|
"Find ACPI name(s) with wildcards\n"},
|
||||||
{1, " Integrity", "Validate namespace integrity\n"},
|
{1, " Integrity", "Validate namespace integrity\n"},
|
||||||
{1, " Methods", "Display list of loaded control methods\n"},
|
{1, " Methods", "Display list of loaded control methods\n"},
|
||||||
|
{1, " Fields <AddressSpaceId>",
|
||||||
|
"Display list of loaded field units by space ID\n"},
|
||||||
{1, " Namespace [Object] [Depth]",
|
{1, " Namespace [Object] [Depth]",
|
||||||
"Display loaded namespace tree/subtree\n"},
|
"Display loaded namespace tree/subtree\n"},
|
||||||
{1, " Notify <Object> <Value>", "Send a notification on Object\n"},
|
{1, " Notify <Object> <Value>", "Send a notification on Object\n"},
|
||||||
@ -674,6 +678,7 @@ acpi_db_command_dispatch(char *input_buffer,
|
|||||||
union acpi_parse_object *op)
|
union acpi_parse_object *op)
|
||||||
{
|
{
|
||||||
u32 temp;
|
u32 temp;
|
||||||
|
u64 temp64;
|
||||||
u32 command_index;
|
u32 command_index;
|
||||||
u32 param_count;
|
u32 param_count;
|
||||||
char *command_line;
|
char *command_line;
|
||||||
@ -789,6 +794,21 @@ acpi_db_command_dispatch(char *input_buffer,
|
|||||||
status = acpi_db_find_name_in_namespace(acpi_gbl_db_args[1]);
|
status = acpi_db_find_name_in_namespace(acpi_gbl_db_args[1]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case CMD_FIELDS:
|
||||||
|
|
||||||
|
status = acpi_ut_strtoul64(acpi_gbl_db_args[1], &temp64);
|
||||||
|
|
||||||
|
if (ACPI_FAILURE(status)
|
||||||
|
|| temp64 >= ACPI_NUM_PREDEFINED_REGIONS) {
|
||||||
|
acpi_os_printf
|
||||||
|
("Invalid adress space ID: must be between 0 and %u inclusive\n",
|
||||||
|
ACPI_NUM_PREDEFINED_REGIONS - 1);
|
||||||
|
return (AE_OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
status = acpi_db_display_fields((u32)temp64);
|
||||||
|
break;
|
||||||
|
|
||||||
case CMD_GO:
|
case CMD_GO:
|
||||||
|
|
||||||
acpi_gbl_cm_single_step = FALSE;
|
acpi_gbl_cm_single_step = FALSE;
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include "acnamesp.h"
|
#include "acnamesp.h"
|
||||||
#include "acdebug.h"
|
#include "acdebug.h"
|
||||||
#include "acpredef.h"
|
#include "acpredef.h"
|
||||||
|
#include "acinterp.h"
|
||||||
|
|
||||||
#define _COMPONENT ACPI_CA_DEBUGGER
|
#define _COMPONENT ACPI_CA_DEBUGGER
|
||||||
ACPI_MODULE_NAME("dbnames")
|
ACPI_MODULE_NAME("dbnames")
|
||||||
@ -502,6 +503,81 @@ acpi_db_walk_for_object_counts(acpi_handle obj_handle,
|
|||||||
return (AE_OK);
|
return (AE_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
*
|
||||||
|
* FUNCTION: acpi_db_walk_for_fields
|
||||||
|
*
|
||||||
|
* PARAMETERS: Callback from walk_namespace
|
||||||
|
*
|
||||||
|
* RETURN: Status
|
||||||
|
*
|
||||||
|
* DESCRIPTION: Display short info about objects in the namespace
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
static acpi_status
|
||||||
|
acpi_db_walk_for_fields(acpi_handle obj_handle,
|
||||||
|
u32 nesting_level, void *context, void **return_value)
|
||||||
|
{
|
||||||
|
union acpi_object *ret_value;
|
||||||
|
struct acpi_region_walk_info *info =
|
||||||
|
(struct acpi_region_walk_info *)context;
|
||||||
|
struct acpi_buffer buffer;
|
||||||
|
acpi_status status;
|
||||||
|
struct acpi_namespace_node *node = acpi_ns_validate_handle(obj_handle);
|
||||||
|
|
||||||
|
if (!node) {
|
||||||
|
return (AE_OK);
|
||||||
|
}
|
||||||
|
if (node->object->field.region_obj->region.space_id !=
|
||||||
|
info->address_space_id) {
|
||||||
|
return (AE_OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
info->count++;
|
||||||
|
|
||||||
|
/* Get and display the full pathname to this object */
|
||||||
|
|
||||||
|
buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
|
||||||
|
status = acpi_ns_handle_to_pathname(obj_handle, &buffer, TRUE);
|
||||||
|
if (ACPI_FAILURE(status)) {
|
||||||
|
acpi_os_printf("Could Not get pathname for object %p\n",
|
||||||
|
obj_handle);
|
||||||
|
return (AE_OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
acpi_os_printf("%s ", (char *)buffer.pointer);
|
||||||
|
ACPI_FREE(buffer.pointer);
|
||||||
|
|
||||||
|
buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
|
||||||
|
acpi_evaluate_object(obj_handle, NULL, NULL, &buffer);
|
||||||
|
|
||||||
|
ret_value = (union acpi_object *)buffer.pointer;
|
||||||
|
switch (ret_value->type) {
|
||||||
|
case ACPI_TYPE_INTEGER:
|
||||||
|
|
||||||
|
acpi_os_printf("%8.8X%8.8X",
|
||||||
|
ACPI_FORMAT_UINT64(ret_value->integer.value));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ACPI_TYPE_BUFFER:
|
||||||
|
|
||||||
|
acpi_ut_dump_buffer(ret_value->buffer.pointer,
|
||||||
|
ret_value->buffer.length,
|
||||||
|
DB_DISPLAY_DATA_ONLY | DB_BYTE_DISPLAY, 0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
acpi_os_printf("\n");
|
||||||
|
|
||||||
|
ACPI_FREE(buffer.pointer);
|
||||||
|
|
||||||
|
return (AE_OK);
|
||||||
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
*
|
*
|
||||||
* FUNCTION: acpi_db_walk_for_specific_objects
|
* FUNCTION: acpi_db_walk_for_specific_objects
|
||||||
@ -628,6 +704,39 @@ acpi_status acpi_db_display_objects(char *obj_type_arg, char *display_count_arg)
|
|||||||
return (AE_OK);
|
return (AE_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
*
|
||||||
|
* FUNCTION: acpi_db_display_fields
|
||||||
|
*
|
||||||
|
* PARAMETERS: obj_type_arg - Type of object to display
|
||||||
|
* display_count_arg - Max depth to display
|
||||||
|
*
|
||||||
|
* RETURN: None
|
||||||
|
*
|
||||||
|
* DESCRIPTION: Display objects in the namespace of the requested type
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
acpi_status acpi_db_display_fields(u32 address_space_id)
|
||||||
|
{
|
||||||
|
struct acpi_region_walk_info info;
|
||||||
|
|
||||||
|
info.count = 0;
|
||||||
|
info.owner_id = ACPI_OWNER_ID_MAX;
|
||||||
|
info.debug_level = ACPI_UINT32_MAX;
|
||||||
|
info.display_type = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT;
|
||||||
|
info.address_space_id = address_space_id;
|
||||||
|
|
||||||
|
/* Walk the namespace from the root */
|
||||||
|
|
||||||
|
(void)acpi_walk_namespace(ACPI_TYPE_LOCAL_REGION_FIELD,
|
||||||
|
ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
|
||||||
|
acpi_db_walk_for_fields, NULL, (void *)&info,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
return (AE_OK);
|
||||||
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
*
|
*
|
||||||
* FUNCTION: acpi_db_integrity_walk
|
* FUNCTION: acpi_db_integrity_walk
|
||||||
|
Loading…
Reference in New Issue
Block a user