diff options
Diffstat (limited to 'drivers/acpi/executer')
-rw-r--r-- | drivers/acpi/executer/exdump.c | 27 | ||||
-rw-r--r-- | drivers/acpi/executer/exresolv.c | 13 | ||||
-rw-r--r-- | drivers/acpi/executer/exstore.c | 23 |
3 files changed, 46 insertions, 17 deletions
diff --git a/drivers/acpi/executer/exdump.c b/drivers/acpi/executer/exdump.c index 251d84ba79b3..ed560e656f9a 100644 --- a/drivers/acpi/executer/exdump.c +++ b/drivers/acpi/executer/exdump.c | |||
@@ -895,14 +895,25 @@ static void acpi_ex_dump_reference_obj(union acpi_operand_object *obj_desc) | |||
895 | } else if (obj_desc->reference.object) { | 895 | } else if (obj_desc->reference.object) { |
896 | if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) == | 896 | if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) == |
897 | ACPI_DESC_TYPE_OPERAND) { | 897 | ACPI_DESC_TYPE_OPERAND) { |
898 | acpi_os_printf(" Target: %p [%s]\n", | 898 | acpi_os_printf(" Target: %p", |
899 | obj_desc->reference.object, | 899 | obj_desc->reference.object); |
900 | acpi_ut_get_type_name(((union | 900 | if (obj_desc->reference.opcode == AML_LOAD_OP) { |
901 | acpi_operand_object | 901 | /* |
902 | *)obj_desc-> | 902 | * For DDBHandle reference, |
903 | reference. | 903 | * obj_desc->Reference.Object is the table index |
904 | object)->common. | 904 | */ |
905 | type)); | 905 | acpi_os_printf(" [DDBHandle]\n"); |
906 | } else { | ||
907 | acpi_os_printf(" [%s]\n", | ||
908 | acpi_ut_get_type_name(((union | ||
909 | acpi_operand_object | ||
910 | *) | ||
911 | obj_desc-> | ||
912 | reference. | ||
913 | object)-> | ||
914 | common. | ||
915 | type)); | ||
916 | } | ||
906 | } else { | 917 | } else { |
907 | acpi_os_printf(" Target: %p\n", | 918 | acpi_os_printf(" Target: %p\n", |
908 | obj_desc->reference.object); | 919 | obj_desc->reference.object); |
diff --git a/drivers/acpi/executer/exresolv.c b/drivers/acpi/executer/exresolv.c index 9c3cdf61dc34..5b5b2ff45ea2 100644 --- a/drivers/acpi/executer/exresolv.c +++ b/drivers/acpi/executer/exresolv.c | |||
@@ -382,10 +382,10 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state, | |||
382 | } | 382 | } |
383 | 383 | ||
384 | /* | 384 | /* |
385 | * For reference objects created via the ref_of or Index operators, | 385 | * For reference objects created via the ref_of, Index, or Load/load_table |
386 | * we need to get to the base object (as per the ACPI specification | 386 | * operators, we need to get to the base object (as per the ACPI |
387 | * of the object_type and size_of operators). This means traversing | 387 | * specification of the object_type and size_of operators). This means |
388 | * the list of possibly many nested references. | 388 | * traversing the list of possibly many nested references. |
389 | */ | 389 | */ |
390 | while (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_LOCAL_REFERENCE) { | 390 | while (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_LOCAL_REFERENCE) { |
391 | switch (obj_desc->reference.opcode) { | 391 | switch (obj_desc->reference.opcode) { |
@@ -455,6 +455,11 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state, | |||
455 | } | 455 | } |
456 | break; | 456 | break; |
457 | 457 | ||
458 | case AML_LOAD_OP: | ||
459 | |||
460 | type = ACPI_TYPE_DDB_HANDLE; | ||
461 | goto exit; | ||
462 | |||
458 | case AML_LOCAL_OP: | 463 | case AML_LOCAL_OP: |
459 | case AML_ARG_OP: | 464 | case AML_ARG_OP: |
460 | 465 | ||
diff --git a/drivers/acpi/executer/exstore.c b/drivers/acpi/executer/exstore.c index 2408122cb3b2..725614e277f8 100644 --- a/drivers/acpi/executer/exstore.c +++ b/drivers/acpi/executer/exstore.c | |||
@@ -434,11 +434,24 @@ acpi_ex_store_object_to_index(union acpi_operand_object *source_desc, | |||
434 | */ | 434 | */ |
435 | obj_desc = *(index_desc->reference.where); | 435 | obj_desc = *(index_desc->reference.where); |
436 | 436 | ||
437 | status = | 437 | if (ACPI_GET_OBJECT_TYPE(source_desc) == |
438 | acpi_ut_copy_iobject_to_iobject(source_desc, &new_desc, | 438 | ACPI_TYPE_LOCAL_REFERENCE |
439 | walk_state); | 439 | && source_desc->reference.opcode == AML_LOAD_OP) { |
440 | if (ACPI_FAILURE(status)) { | 440 | |
441 | return_ACPI_STATUS(status); | 441 | /* This is a DDBHandle, just add a reference to it */ |
442 | |||
443 | acpi_ut_add_reference(source_desc); | ||
444 | new_desc = source_desc; | ||
445 | } else { | ||
446 | /* Normal object, copy it */ | ||
447 | |||
448 | status = | ||
449 | acpi_ut_copy_iobject_to_iobject(source_desc, | ||
450 | &new_desc, | ||
451 | walk_state); | ||
452 | if (ACPI_FAILURE(status)) { | ||
453 | return_ACPI_STATUS(status); | ||
454 | } | ||
442 | } | 455 | } |
443 | 456 | ||
444 | if (obj_desc) { | 457 | if (obj_desc) { |