提交 886308ec 编写于 作者: B Bob Moore 提交者: Rafael J. Wysocki

ACPICA: Debugger: Major update for the Disassemble<method> command.

This command was downreved and did not properly disassemble control
methods with any reasonable complexity. This fix brings the command
up to the same level as the rest of the disassembler.  Adds one
new file, dmdeferred.c, which is existing code that is now common
with the main disassembler and the debugger disassembl command.
Signed-off-by: NBob Moore <robert.moore@intel.com>
Signed-off-by: NLv Zheng <lv.zheng@intel.com>
Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
上级 0e770b32
...@@ -535,12 +535,15 @@ acpi_ut_display_init_pathname(u8 type, ...@@ -535,12 +535,15 @@ acpi_ut_display_init_pathname(u8 type,
* utresrc * utresrc
*/ */
acpi_status acpi_status
acpi_ut_walk_aml_resources(u8 *aml, acpi_ut_walk_aml_resources(struct acpi_walk_state *walk_state,
u8 *aml,
acpi_size aml_length, acpi_size aml_length,
acpi_walk_aml_callback user_function, acpi_walk_aml_callback user_function,
void **context); void **context);
acpi_status acpi_ut_validate_resource(void *aml, u8 *return_index); acpi_status
acpi_ut_validate_resource(struct acpi_walk_state *walk_state,
void *aml, u8 *return_index);
u32 acpi_ut_get_descriptor_length(void *aml); u32 acpi_ut_get_descriptor_length(void *aml);
......
...@@ -407,7 +407,9 @@ acpi_rs_get_list_length(u8 * aml_buffer, ...@@ -407,7 +407,9 @@ acpi_rs_get_list_length(u8 * aml_buffer,
/* Validate the Resource Type and Resource Length */ /* Validate the Resource Type and Resource Length */
status = acpi_ut_validate_resource(aml_buffer, &resource_index); status =
acpi_ut_validate_resource(NULL, aml_buffer,
&resource_index);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
/* /*
* Exit on failure. Cannot continue because the descriptor length * Exit on failure. Cannot continue because the descriptor length
......
...@@ -98,7 +98,7 @@ acpi_buffer_to_resource(u8 *aml_buffer, ...@@ -98,7 +98,7 @@ acpi_buffer_to_resource(u8 *aml_buffer,
/* Perform the AML-to-Resource conversion */ /* Perform the AML-to-Resource conversion */
status = acpi_ut_walk_aml_resources(aml_buffer, aml_buffer_length, status = acpi_ut_walk_aml_resources(NULL, aml_buffer, aml_buffer_length,
acpi_rs_convert_aml_to_resources, acpi_rs_convert_aml_to_resources,
&current_resource_ptr); &current_resource_ptr);
if (status == AE_AML_NO_RESOURCE_END_TAG) { if (status == AE_AML_NO_RESOURCE_END_TAG) {
...@@ -174,7 +174,7 @@ acpi_rs_create_resource_list(union acpi_operand_object *aml_buffer, ...@@ -174,7 +174,7 @@ acpi_rs_create_resource_list(union acpi_operand_object *aml_buffer,
/* Do the conversion */ /* Do the conversion */
resource = output_buffer->pointer; resource = output_buffer->pointer;
status = acpi_ut_walk_aml_resources(aml_start, aml_buffer_length, status = acpi_ut_walk_aml_resources(NULL, aml_start, aml_buffer_length,
acpi_rs_convert_aml_to_resources, acpi_rs_convert_aml_to_resources,
&resource); &resource);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
......
...@@ -217,9 +217,10 @@ acpi_rs_convert_resources_to_aml(struct acpi_resource *resource, ...@@ -217,9 +217,10 @@ acpi_rs_convert_resources_to_aml(struct acpi_resource *resource,
/* Perform final sanity check on the new AML resource descriptor */ /* Perform final sanity check on the new AML resource descriptor */
status = status = acpi_ut_validate_resource(NULL,
acpi_ut_validate_resource(ACPI_CAST_PTR ACPI_CAST_PTR(union
(union aml_resource, aml), NULL); aml_resource,
aml), NULL);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
......
...@@ -383,26 +383,16 @@ static const u8 acpi_gbl_resource_types[] = { ...@@ -383,26 +383,16 @@ static const u8 acpi_gbl_resource_types[] = {
ACPI_VARIABLE_LENGTH /* 0E *serial_bus */ ACPI_VARIABLE_LENGTH /* 0E *serial_bus */
}; };
/*
* For the iASL compiler/disassembler, we don't want any error messages
* because the disassembler uses the resource validation code to determine
* if Buffer objects are actually Resource Templates.
*/
#ifdef ACPI_ASL_COMPILER
#define ACPI_RESOURCE_ERROR(plist)
#else
#define ACPI_RESOURCE_ERROR(plist) ACPI_ERROR(plist)
#endif
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_ut_walk_aml_resources * FUNCTION: acpi_ut_walk_aml_resources
* *
* PARAMETERS: aml - Pointer to the raw AML resource template * PARAMETERS: walk_state - Current walk info
* aml_length - Length of the entire template * PARAMETERS: aml - Pointer to the raw AML resource template
* user_function - Called once for each descriptor found. If * aml_length - Length of the entire template
* NULL, a pointer to the end_tag is returned * user_function - Called once for each descriptor found. If
* context - Passed to user_function * NULL, a pointer to the end_tag is returned
* context - Passed to user_function
* *
* RETURN: Status * RETURN: Status
* *
...@@ -412,7 +402,8 @@ static const u8 acpi_gbl_resource_types[] = { ...@@ -412,7 +402,8 @@ static const u8 acpi_gbl_resource_types[] = {
******************************************************************************/ ******************************************************************************/
acpi_status acpi_status
acpi_ut_walk_aml_resources(u8 *aml, acpi_ut_walk_aml_resources(struct acpi_walk_state *walk_state,
u8 *aml,
acpi_size aml_length, acpi_size aml_length,
acpi_walk_aml_callback user_function, void **context) acpi_walk_aml_callback user_function, void **context)
{ {
...@@ -441,7 +432,8 @@ acpi_ut_walk_aml_resources(u8 *aml, ...@@ -441,7 +432,8 @@ acpi_ut_walk_aml_resources(u8 *aml,
/* Validate the Resource Type and Resource Length */ /* Validate the Resource Type and Resource Length */
status = acpi_ut_validate_resource(aml, &resource_index); status =
acpi_ut_validate_resource(walk_state, aml, &resource_index);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
/* /*
* Exit on failure. Cannot continue because the descriptor length * Exit on failure. Cannot continue because the descriptor length
...@@ -498,7 +490,8 @@ acpi_ut_walk_aml_resources(u8 *aml, ...@@ -498,7 +490,8 @@ acpi_ut_walk_aml_resources(u8 *aml,
/* Insert an end_tag anyway. acpi_rs_get_list_length always leaves room */ /* Insert an end_tag anyway. acpi_rs_get_list_length always leaves room */
(void)acpi_ut_validate_resource(end_tag, &resource_index); (void)acpi_ut_validate_resource(walk_state, end_tag,
&resource_index);
status = status =
user_function(end_tag, 2, offset, resource_index, context); user_function(end_tag, 2, offset, resource_index, context);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
...@@ -513,9 +506,10 @@ acpi_ut_walk_aml_resources(u8 *aml, ...@@ -513,9 +506,10 @@ acpi_ut_walk_aml_resources(u8 *aml,
* *
* FUNCTION: acpi_ut_validate_resource * FUNCTION: acpi_ut_validate_resource
* *
* PARAMETERS: aml - Pointer to the raw AML resource descriptor * PARAMETERS: walk_state - Current walk info
* return_index - Where the resource index is returned. NULL * aml - Pointer to the raw AML resource descriptor
* if the index is not required. * return_index - Where the resource index is returned. NULL
* if the index is not required.
* *
* RETURN: Status, and optionally the Index into the global resource tables * RETURN: Status, and optionally the Index into the global resource tables
* *
...@@ -525,7 +519,9 @@ acpi_ut_walk_aml_resources(u8 *aml, ...@@ -525,7 +519,9 @@ acpi_ut_walk_aml_resources(u8 *aml,
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_ut_validate_resource(void *aml, u8 *return_index) acpi_status
acpi_ut_validate_resource(struct acpi_walk_state *walk_state,
void *aml, u8 *return_index)
{ {
union aml_resource *aml_resource; union aml_resource *aml_resource;
u8 resource_type; u8 resource_type;
...@@ -627,10 +623,12 @@ acpi_status acpi_ut_validate_resource(void *aml, u8 *return_index) ...@@ -627,10 +623,12 @@ acpi_status acpi_ut_validate_resource(void *aml, u8 *return_index)
if ((aml_resource->common_serial_bus.type == 0) || if ((aml_resource->common_serial_bus.type == 0) ||
(aml_resource->common_serial_bus.type > (aml_resource->common_serial_bus.type >
AML_RESOURCE_MAX_SERIALBUSTYPE)) { AML_RESOURCE_MAX_SERIALBUSTYPE)) {
ACPI_RESOURCE_ERROR((AE_INFO, if (walk_state) {
"Invalid/unsupported SerialBus resource descriptor: BusType 0x%2.2X", ACPI_ERROR((AE_INFO,
aml_resource->common_serial_bus. "Invalid/unsupported SerialBus resource descriptor: BusType 0x%2.2X",
type)); aml_resource->common_serial_bus.
type));
}
return (AE_AML_INVALID_RESOURCE_TYPE); return (AE_AML_INVALID_RESOURCE_TYPE);
} }
} }
...@@ -645,18 +643,22 @@ acpi_status acpi_ut_validate_resource(void *aml, u8 *return_index) ...@@ -645,18 +643,22 @@ acpi_status acpi_ut_validate_resource(void *aml, u8 *return_index)
invalid_resource: invalid_resource:
ACPI_RESOURCE_ERROR((AE_INFO, if (walk_state) {
"Invalid/unsupported resource descriptor: Type 0x%2.2X", ACPI_ERROR((AE_INFO,
resource_type)); "Invalid/unsupported resource descriptor: Type 0x%2.2X",
resource_type));
}
return (AE_AML_INVALID_RESOURCE_TYPE); return (AE_AML_INVALID_RESOURCE_TYPE);
bad_resource_length: bad_resource_length:
ACPI_RESOURCE_ERROR((AE_INFO, if (walk_state) {
"Invalid resource descriptor length: Type " ACPI_ERROR((AE_INFO,
"0x%2.2X, Length 0x%4.4X, MinLength 0x%4.4X", "Invalid resource descriptor length: Type "
resource_type, resource_length, "0x%2.2X, Length 0x%4.4X, MinLength 0x%4.4X",
minimum_resource_length)); resource_type, resource_length,
minimum_resource_length));
}
return (AE_AML_BAD_RESOURCE_LENGTH); return (AE_AML_BAD_RESOURCE_LENGTH);
} }
...@@ -815,7 +817,7 @@ acpi_ut_get_resource_end_tag(union acpi_operand_object *obj_desc, u8 **end_tag) ...@@ -815,7 +817,7 @@ acpi_ut_get_resource_end_tag(union acpi_operand_object *obj_desc, u8 **end_tag)
/* Validate the template and get a pointer to the end_tag */ /* Validate the template and get a pointer to the end_tag */
status = acpi_ut_walk_aml_resources(obj_desc->buffer.pointer, status = acpi_ut_walk_aml_resources(NULL, obj_desc->buffer.pointer,
obj_desc->buffer.length, NULL, obj_desc->buffer.length, NULL,
(void **)end_tag); (void **)end_tag);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册