aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/parser/psloop.c
diff options
context:
space:
mode:
authorBob Moore <robert.moore@intel.com>2008-04-10 11:06:37 -0400
committerLen Brown <len.brown@intel.com>2008-04-22 14:29:21 -0400
commit4e3156b183aa087bc19804b3295c7c1a71f64752 (patch)
tree5db51b2351f4d919b36364681e594d2b6daa3860 /drivers/acpi/parser/psloop.c
parentba886cd4ac957608777fbc8d137f6b9f0450e775 (diff)
ACPICA: changed order of interpretation of operand objects
The interpreter now evaluates operands in the order that they appear (both in the AML and ASL), instead of in reverse order. This previously caused subtle incompatibilities with the MS interpreter as well as being non-intuitive. Signed-off-by: Bob Moore <robert.moore@intel.com> Signed-off-by: Alexey Starikovskiy <astarikovskiy@suse.de> Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/parser/psloop.c')
-rw-r--r--drivers/acpi/parser/psloop.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/drivers/acpi/parser/psloop.c b/drivers/acpi/parser/psloop.c
index 266dd0c10218..4348b0530398 100644
--- a/drivers/acpi/parser/psloop.c
+++ b/drivers/acpi/parser/psloop.c
@@ -182,6 +182,7 @@ acpi_ps_build_named_op(struct acpi_walk_state *walk_state,
182 ACPI_FUNCTION_TRACE_PTR(ps_build_named_op, walk_state); 182 ACPI_FUNCTION_TRACE_PTR(ps_build_named_op, walk_state);
183 183
184 unnamed_op->common.value.arg = NULL; 184 unnamed_op->common.value.arg = NULL;
185 unnamed_op->common.arg_list_length = 0;
185 unnamed_op->common.aml_opcode = walk_state->opcode; 186 unnamed_op->common.aml_opcode = walk_state->opcode;
186 187
187 /* 188 /*
@@ -280,6 +281,9 @@ acpi_ps_create_op(struct acpi_walk_state *walk_state,
280 acpi_status status = AE_OK; 281 acpi_status status = AE_OK;
281 union acpi_parse_object *op; 282 union acpi_parse_object *op;
282 union acpi_parse_object *named_op = NULL; 283 union acpi_parse_object *named_op = NULL;
284 union acpi_parse_object *parent_scope;
285 u8 argument_count;
286 const struct acpi_opcode_info *op_info;
283 287
284 ACPI_FUNCTION_TRACE_PTR(ps_create_op, walk_state); 288 ACPI_FUNCTION_TRACE_PTR(ps_create_op, walk_state);
285 289
@@ -320,8 +324,23 @@ acpi_ps_create_op(struct acpi_walk_state *walk_state,
320 op->named.length = 0; 324 op->named.length = 0;
321 } 325 }
322 326
323 acpi_ps_append_arg(acpi_ps_get_parent_scope 327 parent_scope = acpi_ps_get_parent_scope(&(walk_state->parser_state));
324 (&(walk_state->parser_state)), op); 328 acpi_ps_append_arg(parent_scope, op);
329
330 if (parent_scope) {
331 op_info =
332 acpi_ps_get_opcode_info(parent_scope->common.aml_opcode);
333 if (op_info->flags & AML_HAS_TARGET) {
334 argument_count =
335 acpi_ps_get_argument_count(op_info->type);
336 if (parent_scope->common.arg_list_length >
337 argument_count) {
338 op->common.flags |= ACPI_PARSEOP_TARGET;
339 }
340 } else if (parent_scope->common.aml_opcode == AML_INCREMENT_OP) {
341 op->common.flags |= ACPI_PARSEOP_TARGET;
342 }
343 }
325 344
326 if (walk_state->descending_callback != NULL) { 345 if (walk_state->descending_callback != NULL) {
327 /* 346 /*