aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/dispatcher/dswexec.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/dispatcher/dswexec.c')
-rw-r--r--drivers/acpi/dispatcher/dswexec.c80
1 files changed, 30 insertions, 50 deletions
diff --git a/drivers/acpi/dispatcher/dswexec.c b/drivers/acpi/dispatcher/dswexec.c
index e522763bb692..f1af655ff113 100644
--- a/drivers/acpi/dispatcher/dswexec.c
+++ b/drivers/acpi/dispatcher/dswexec.c
@@ -6,7 +6,7 @@
6 *****************************************************************************/ 6 *****************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
@@ -100,9 +100,8 @@ acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state,
100 if (result_obj) { 100 if (result_obj) {
101 status = acpi_ds_result_pop(&obj_desc, walk_state); 101 status = acpi_ds_result_pop(&obj_desc, walk_state);
102 if (ACPI_FAILURE(status)) { 102 if (ACPI_FAILURE(status)) {
103 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 103 ACPI_EXCEPTION((AE_INFO, status,
104 "Could not get result from predicate evaluation, %s\n", 104 "Could not get result from predicate evaluation"));
105 acpi_format_exception(status)));
106 105
107 return_ACPI_STATUS(status); 106 return_ACPI_STATUS(status);
108 } 107 }
@@ -123,9 +122,9 @@ acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state,
123 } 122 }
124 123
125 if (!obj_desc) { 124 if (!obj_desc) {
126 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 125 ACPI_ERROR((AE_INFO,
127 "No predicate obj_desc=%p State=%p\n", 126 "No predicate obj_desc=%p State=%p",
128 obj_desc, walk_state)); 127 obj_desc, walk_state));
129 128
130 return_ACPI_STATUS(AE_AML_NO_OPERAND); 129 return_ACPI_STATUS(AE_AML_NO_OPERAND);
131 } 130 }
@@ -140,10 +139,10 @@ acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state,
140 } 139 }
141 140
142 if (ACPI_GET_OBJECT_TYPE(local_obj_desc) != ACPI_TYPE_INTEGER) { 141 if (ACPI_GET_OBJECT_TYPE(local_obj_desc) != ACPI_TYPE_INTEGER) {
143 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 142 ACPI_ERROR((AE_INFO,
144 "Bad predicate (not an integer) obj_desc=%p State=%p Type=%X\n", 143 "Bad predicate (not an integer) obj_desc=%p State=%p Type=%X",
145 obj_desc, walk_state, 144 obj_desc, walk_state,
146 ACPI_GET_OBJECT_TYPE(obj_desc))); 145 ACPI_GET_OBJECT_TYPE(obj_desc)));
147 146
148 status = AE_AML_OPERAND_TYPE; 147 status = AE_AML_OPERAND_TYPE;
149 goto cleanup; 148 goto cleanup;
@@ -314,12 +313,13 @@ acpi_ds_exec_begin_op(struct acpi_walk_state *walk_state,
314 313
315 case AML_CLASS_EXECUTE: 314 case AML_CLASS_EXECUTE:
316 case AML_CLASS_CREATE: 315 case AML_CLASS_CREATE:
317
318 /* 316 /*
319 * Most operators with arguments. 317 * Most operators with arguments.
320 * Start a new result/operand state 318 * Start a new result/operand state
321 */ 319 */
322 status = acpi_ds_result_stack_push(walk_state); 320 if (walk_state->opcode != AML_CREATE_FIELD_OP) {
321 status = acpi_ds_result_stack_push(walk_state);
322 }
323 break; 323 break;
324 324
325 default: 325 default:
@@ -361,8 +361,8 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
361 op_class = walk_state->op_info->class; 361 op_class = walk_state->op_info->class;
362 362
363 if (op_class == AML_CLASS_UNKNOWN) { 363 if (op_class == AML_CLASS_UNKNOWN) {
364 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Unknown opcode %X\n", 364 ACPI_ERROR((AE_INFO, "Unknown opcode %X",
365 op->common.aml_opcode)); 365 op->common.aml_opcode));
366 return_ACPI_STATUS(AE_NOT_IMPLEMENTED); 366 return_ACPI_STATUS(AE_NOT_IMPLEMENTED);
367 } 367 }
368 368
@@ -452,12 +452,10 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
452 walk_state->operands[1]->reference.offset)) { 452 walk_state->operands[1]->reference.offset)) {
453 status = AE_OK; 453 status = AE_OK;
454 } else { 454 } else {
455 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 455 ACPI_EXCEPTION((AE_INFO, status,
456 "[%s]: Could not resolve operands, %s\n", 456 "While resolving operands for [%s]",
457 acpi_ps_get_opcode_name 457 acpi_ps_get_opcode_name
458 (walk_state->opcode), 458 (walk_state->opcode)));
459 acpi_format_exception
460 (status)));
461 } 459 }
462 } 460 }
463 461
@@ -676,8 +674,8 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
676 674
677 case AML_TYPE_UNDEFINED: 675 case AML_TYPE_UNDEFINED:
678 676
679 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 677 ACPI_ERROR((AE_INFO,
680 "Undefined opcode type Op=%p\n", op)); 678 "Undefined opcode type Op=%p", op));
681 return_ACPI_STATUS(AE_NOT_IMPLEMENTED); 679 return_ACPI_STATUS(AE_NOT_IMPLEMENTED);
682 680
683 case AML_TYPE_BOGUS: 681 case AML_TYPE_BOGUS:
@@ -689,10 +687,10 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
689 687
690 default: 688 default:
691 689
692 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 690 ACPI_ERROR((AE_INFO,
693 "Unimplemented opcode, class=%X type=%X Opcode=%X Op=%p\n", 691 "Unimplemented opcode, class=%X type=%X Opcode=%X Op=%p",
694 op_class, op_type, 692 op_class, op_type, op->common.aml_opcode,
695 op->common.aml_opcode, op)); 693 op));
696 694
697 status = AE_NOT_IMPLEMENTED; 695 status = AE_NOT_IMPLEMENTED;
698 break; 696 break;
@@ -723,20 +721,6 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
723 721
724 cleanup: 722 cleanup:
725 723
726 /* Invoke exception handler on error */
727
728 if (ACPI_FAILURE(status) &&
729 acpi_gbl_exception_handler && !(status & AE_CODE_CONTROL)) {
730 acpi_ex_exit_interpreter();
731 status = acpi_gbl_exception_handler(status,
732 walk_state->method_node->
733 name.integer,
734 walk_state->opcode,
735 walk_state->aml_offset,
736 NULL);
737 (void)acpi_ex_enter_interpreter();
738 }
739
740 if (walk_state->result_obj) { 724 if (walk_state->result_obj) {
741 /* Break to debugger to display result */ 725 /* Break to debugger to display result */
742 726
@@ -758,18 +742,14 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
758 } 742 }
759#endif 743#endif
760 744
761 /* Always clear the object stack */ 745 /* Invoke exception handler on error */
762
763 walk_state->num_operands = 0;
764
765#ifdef ACPI_DISASSEMBLER
766
767 /* On error, display method locals/args */
768 746
769 if (ACPI_FAILURE(status)) { 747 if (ACPI_FAILURE(status)) {
770 acpi_dm_dump_method_info(status, walk_state, op); 748 status = acpi_ds_method_error(status, walk_state);
771 } 749 }
772#endif
773 750
751 /* Always clear the object stack */
752
753 walk_state->num_operands = 0;
774 return_ACPI_STATUS(status); 754 return_ACPI_STATUS(status);
775} 755}