ACPICA: Restructure includes into public/private
[safe/jmp/linux-2.6] / drivers / acpi / dispatcher / dswexec.c
index d7a616c..2482cbd 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2006, R. Byron Moore
+ * Copyright (C) 2000 - 2008, Intel Corp.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -43,6 +43,7 @@
  */
 
 #include <acpi/acpi.h>
+#include <acpi/accommon.h>
 #include <acpi/acparser.h>
 #include <acpi/amlcode.h>
 #include <acpi/acdispat.h>
@@ -166,6 +167,10 @@ acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state,
                status = AE_CTRL_FALSE;
        }
 
+       /* Predicate can be used for an implicit return value */
+
+       (void)acpi_ds_do_implicit_return(local_obj_desc, walk_state, TRUE);
+
       cleanup:
 
        ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Completed a predicate eval=%X Op=%p\n",
@@ -219,7 +224,7 @@ acpi_ds_exec_begin_op(struct acpi_walk_state *walk_state,
        if (!op) {
                status = acpi_ds_load2_begin_op(walk_state, out_op);
                if (ACPI_FAILURE(status)) {
-                       return_ACPI_STATUS(status);
+                       goto error_exit;
                }
 
                op = *out_op;
@@ -238,7 +243,7 @@ acpi_ds_exec_begin_op(struct acpi_walk_state *walk_state,
 
                        status = acpi_ds_scope_stack_pop(walk_state);
                        if (ACPI_FAILURE(status)) {
-                               return_ACPI_STATUS(status);
+                               goto error_exit;
                        }
                }
        }
@@ -285,11 +290,6 @@ acpi_ds_exec_begin_op(struct acpi_walk_state *walk_state,
        switch (opcode_class) {
        case AML_CLASS_CONTROL:
 
-               status = acpi_ds_result_stack_push(walk_state);
-               if (ACPI_FAILURE(status)) {
-                       return_ACPI_STATUS(status);
-               }
-
                status = acpi_ds_exec_begin_control_op(walk_state, op);
                break;
 
@@ -305,20 +305,11 @@ acpi_ds_exec_begin_op(struct acpi_walk_state *walk_state,
                        status = acpi_ds_load2_begin_op(walk_state, NULL);
                }
 
-               if (op->common.aml_opcode == AML_REGION_OP) {
-                       status = acpi_ds_result_stack_push(walk_state);
-               }
                break;
 
        case AML_CLASS_EXECUTE:
        case AML_CLASS_CREATE:
-               /*
-                * Most operators with arguments (except create_xxx_field operators)
-                * Start a new result/operand state
-                */
-               if (walk_state->op_info->object_type != ACPI_TYPE_BUFFER_FIELD) {
-                       status = acpi_ds_result_stack_push(walk_state);
-               }
+
                break;
 
        default:
@@ -328,6 +319,10 @@ acpi_ds_exec_begin_op(struct acpi_walk_state *walk_state,
        /* Nothing to do here during method execution */
 
        return_ACPI_STATUS(status);
+
+      error_exit:
+       status = acpi_ds_method_error(status, walk_state);
+       return_ACPI_STATUS(status);
 }
 
 /*****************************************************************************
@@ -370,6 +365,7 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
        /* Init the walk state */
 
        walk_state->num_operands = 0;
+       walk_state->operand_index = 0;
        walk_state->return_desc = NULL;
        walk_state->result_obj = NULL;
 
@@ -384,10 +380,17 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
        /* Decode the Opcode Class */
 
        switch (op_class) {
-       case AML_CLASS_ARGUMENT:        /* constants, literals, etc. - do nothing */
+       case AML_CLASS_ARGUMENT:        /* Constants, literals, etc. */
+
+               if (walk_state->opcode == AML_INT_NAMEPATH_OP) {
+                       status = acpi_ds_evaluate_name_path(walk_state);
+                       if (ACPI_FAILURE(status)) {
+                               goto cleanup;
+                       }
+               }
                break;
 
-       case AML_CLASS_EXECUTE: /* most operators with arguments */
+       case AML_CLASS_EXECUTE: /* Most operators with arguments */
 
                /* Build resolved operand stack */
 
@@ -396,13 +399,6 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
                        goto cleanup;
                }
 
-               /* Done with this result state (Now that operand stack is built) */
-
-               status = acpi_ds_result_stack_pop(walk_state);
-               if (ACPI_FAILURE(status)) {
-                       goto cleanup;
-               }
-
                /*
                 * All opcodes require operand resolution, with the only exceptions
                 * being the object_type and size_of operators.
@@ -417,14 +413,6 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
                                                            [walk_state->
                                                             num_operands - 1]),
                                                          walk_state);
-                       if (ACPI_SUCCESS(status)) {
-                               ACPI_DUMP_OPERANDS(ACPI_WALK_OPERANDS,
-                                                  ACPI_IMODE_EXECUTE,
-                                                  acpi_ps_get_opcode_name
-                                                  (walk_state->opcode),
-                                                  walk_state->num_operands,
-                                                  "after ExResolveOperands");
-                       }
                }
 
                if (ACPI_SUCCESS(status)) {
@@ -446,10 +434,10 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
                             ACPI_TYPE_LOCAL_REFERENCE)
                            && (walk_state->operands[1]->common.type ==
                                ACPI_TYPE_LOCAL_REFERENCE)
-                           && (walk_state->operands[0]->reference.opcode ==
-                               walk_state->operands[1]->reference.opcode)
-                           && (walk_state->operands[0]->reference.offset ==
-                               walk_state->operands[1]->reference.offset)) {
+                           && (walk_state->operands[0]->reference.class ==
+                               walk_state->operands[1]->reference.class)
+                           && (walk_state->operands[0]->reference.value ==
+                               walk_state->operands[1]->reference.value)) {
                                status = AE_OK;
                        } else {
                                ACPI_EXCEPTION((AE_INFO, status,
@@ -483,16 +471,6 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
 
                        status = acpi_ds_exec_end_control_op(walk_state, op);
 
-                       /* Make sure to properly pop the result stack */
-
-                       if (ACPI_SUCCESS(status)) {
-                               status = acpi_ds_result_stack_pop(walk_state);
-                       } else if (status == AE_CTRL_PENDING) {
-                               status = acpi_ds_result_stack_pop(walk_state);
-                               if (ACPI_SUCCESS(status)) {
-                                       status = AE_CTRL_PENDING;
-                               }
-                       }
                        break;
 
                case AML_TYPE_METHOD_CALL:
@@ -512,7 +490,7 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
 
                                op->common.node =
                                    (struct acpi_namespace_node *)op->asl.value.
-                                   arg->asl.node->object;
+                                   arg->asl.node;
                                acpi_ut_add_reference(op->asl.value.arg->asl.
                                                      node->object);
                                return_ACPI_STATUS(AE_OK);
@@ -628,13 +606,6 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
                                break;
                        }
 
-                       /* Done with result state (Now that operand stack is built) */
-
-                       status = acpi_ds_result_stack_pop(walk_state);
-                       if (ACPI_FAILURE(status)) {
-                               goto cleanup;
-                       }
-
                        /*
                         * If a result object was returned from above, push it on the
                         * current result stack
@@ -667,8 +638,28 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
                                if (ACPI_FAILURE(status)) {
                                        break;
                                }
+                       } else if (op->common.aml_opcode == AML_DATA_REGION_OP) {
+                               ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
+                                                 "Executing DataTableRegion Strings Op=%p\n",
+                                                 op));
 
-                               status = acpi_ds_result_stack_pop(walk_state);
+                               status =
+                                   acpi_ds_eval_table_region_operands
+                                   (walk_state, op);
+                               if (ACPI_FAILURE(status)) {
+                                       break;
+                               }
+                       } else if (op->common.aml_opcode == AML_BANK_FIELD_OP) {
+                               ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
+                                                 "Executing BankField Op=%p\n",
+                                                 op));
+
+                               status =
+                                   acpi_ds_eval_bank_field_operands(walk_state,
+                                                                    op);
+                               if (ACPI_FAILURE(status)) {
+                                       break;
+                               }
                        }
                        break;