diff options
Diffstat (limited to 'drivers/acpi/dispatcher/dswload.c')
-rw-r--r-- | drivers/acpi/dispatcher/dswload.c | 56 |
1 files changed, 37 insertions, 19 deletions
diff --git a/drivers/acpi/dispatcher/dswload.c b/drivers/acpi/dispatcher/dswload.c index 1ac197ccfc80..e2e0a855be2c 100644 --- a/drivers/acpi/dispatcher/dswload.c +++ b/drivers/acpi/dispatcher/dswload.c | |||
@@ -145,15 +145,6 @@ acpi_ds_load1_begin_op ( | |||
145 | 145 | ||
146 | if (op) { | 146 | if (op) { |
147 | if (!(walk_state->op_info->flags & AML_NAMED)) { | 147 | if (!(walk_state->op_info->flags & AML_NAMED)) { |
148 | #if 0 | ||
149 | if ((walk_state->op_info->class == AML_CLASS_EXECUTE) || | ||
150 | (walk_state->op_info->class == AML_CLASS_CONTROL)) { | ||
151 | acpi_os_printf ("\n\n***EXECUTABLE OPCODE %s***\n\n", | ||
152 | walk_state->op_info->name); | ||
153 | *out_op = op; | ||
154 | return (AE_CTRL_SKIP); | ||
155 | } | ||
156 | #endif | ||
157 | *out_op = op; | 148 | *out_op = op; |
158 | return (AE_OK); | 149 | return (AE_OK); |
159 | } | 150 | } |
@@ -486,6 +477,15 @@ acpi_ds_load2_begin_op ( | |||
486 | ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", op, walk_state)); | 477 | ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", op, walk_state)); |
487 | 478 | ||
488 | if (op) { | 479 | if (op) { |
480 | if ((walk_state->control_state) && | ||
481 | (walk_state->control_state->common.state == | ||
482 | ACPI_CONTROL_CONDITIONAL_EXECUTING)) { | ||
483 | /* We are executing a while loop outside of a method */ | ||
484 | |||
485 | status = acpi_ds_exec_begin_op (walk_state, out_op); | ||
486 | return_ACPI_STATUS (status); | ||
487 | } | ||
488 | |||
489 | /* We only care about Namespace opcodes here */ | 489 | /* We only care about Namespace opcodes here */ |
490 | 490 | ||
491 | if ((!(walk_state->op_info->flags & AML_NSOPCODE) && | 491 | if ((!(walk_state->op_info->flags & AML_NSOPCODE) && |
@@ -493,9 +493,14 @@ acpi_ds_load2_begin_op ( | |||
493 | (!(walk_state->op_info->flags & AML_NAMED))) { | 493 | (!(walk_state->op_info->flags & AML_NAMED))) { |
494 | if ((walk_state->op_info->class == AML_CLASS_EXECUTE) || | 494 | if ((walk_state->op_info->class == AML_CLASS_EXECUTE) || |
495 | (walk_state->op_info->class == AML_CLASS_CONTROL)) { | 495 | (walk_state->op_info->class == AML_CLASS_CONTROL)) { |
496 | ACPI_REPORT_WARNING (( | 496 | ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, |
497 | "Encountered executable code at module level, [%s]\n", | 497 | "Begin/EXEC: %s (fl %8.8X)\n", walk_state->op_info->name, |
498 | acpi_ps_get_opcode_name (walk_state->opcode))); | 498 | walk_state->op_info->flags)); |
499 | |||
500 | /* Executing a type1 or type2 opcode outside of a method */ | ||
501 | |||
502 | status = acpi_ds_exec_begin_op (walk_state, out_op); | ||
503 | return_ACPI_STATUS (status); | ||
499 | } | 504 | } |
500 | return_ACPI_STATUS (AE_OK); | 505 | return_ACPI_STATUS (AE_OK); |
501 | } | 506 | } |
@@ -657,8 +662,10 @@ acpi_ds_load2_begin_op ( | |||
657 | break; | 662 | break; |
658 | } | 663 | } |
659 | 664 | ||
665 | /* Add new entry into namespace */ | ||
666 | |||
660 | status = acpi_ns_lookup (walk_state->scope_info, buffer_ptr, object_type, | 667 | status = acpi_ns_lookup (walk_state->scope_info, buffer_ptr, object_type, |
661 | ACPI_IMODE_EXECUTE, ACPI_NS_NO_UPSEARCH, | 668 | ACPI_IMODE_LOAD_PASS2, ACPI_NS_NO_UPSEARCH, |
662 | walk_state, &(node)); | 669 | walk_state, &(node)); |
663 | break; | 670 | break; |
664 | } | 671 | } |
@@ -668,7 +675,6 @@ acpi_ds_load2_begin_op ( | |||
668 | return_ACPI_STATUS (status); | 675 | return_ACPI_STATUS (status); |
669 | } | 676 | } |
670 | 677 | ||
671 | |||
672 | if (!op) { | 678 | if (!op) { |
673 | /* Create a new op */ | 679 | /* Create a new op */ |
674 | 680 | ||
@@ -682,9 +688,7 @@ acpi_ds_load2_begin_op ( | |||
682 | if (node) { | 688 | if (node) { |
683 | op->named.name = node->name.integer; | 689 | op->named.name = node->name.integer; |
684 | } | 690 | } |
685 | if (out_op) { | 691 | *out_op = op; |
686 | *out_op = op; | ||
687 | } | ||
688 | } | 692 | } |
689 | 693 | ||
690 | /* | 694 | /* |
@@ -731,9 +735,24 @@ acpi_ds_load2_end_op ( | |||
731 | ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Opcode [%s] Op %p State %p\n", | 735 | ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Opcode [%s] Op %p State %p\n", |
732 | walk_state->op_info->name, op, walk_state)); | 736 | walk_state->op_info->name, op, walk_state)); |
733 | 737 | ||
734 | /* Only interested in opcodes that have namespace objects */ | 738 | /* Check if opcode had an associated namespace object */ |
735 | 739 | ||
736 | if (!(walk_state->op_info->flags & AML_NSOBJECT)) { | 740 | if (!(walk_state->op_info->flags & AML_NSOBJECT)) { |
741 | #ifndef ACPI_NO_METHOD_EXECUTION | ||
742 | /* No namespace object. Executable opcode? */ | ||
743 | |||
744 | if ((walk_state->op_info->class == AML_CLASS_EXECUTE) || | ||
745 | (walk_state->op_info->class == AML_CLASS_CONTROL)) { | ||
746 | ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, | ||
747 | "End/EXEC: %s (fl %8.8X)\n", walk_state->op_info->name, | ||
748 | walk_state->op_info->flags)); | ||
749 | |||
750 | /* Executing a type1 or type2 opcode outside of a method */ | ||
751 | |||
752 | status = acpi_ds_exec_end_op (walk_state); | ||
753 | return_ACPI_STATUS (status); | ||
754 | } | ||
755 | #endif | ||
737 | return_ACPI_STATUS (AE_OK); | 756 | return_ACPI_STATUS (AE_OK); |
738 | } | 757 | } |
739 | 758 | ||
@@ -742,7 +761,6 @@ acpi_ds_load2_end_op ( | |||
742 | "Ending scope Op=%p State=%p\n", op, walk_state)); | 761 | "Ending scope Op=%p State=%p\n", op, walk_state)); |
743 | } | 762 | } |
744 | 763 | ||
745 | |||
746 | object_type = walk_state->op_info->object_type; | 764 | object_type = walk_state->op_info->object_type; |
747 | 765 | ||
748 | /* | 766 | /* |