aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/dispatcher/dswload.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/dispatcher/dswload.c')
-rw-r--r--drivers/acpi/dispatcher/dswload.c56
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 /*