aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/dispatcher/dswload.c
diff options
context:
space:
mode:
authorBob Moore <robert.moore@intel.com>2005-12-16 17:05:00 -0500
committerLen Brown <len.brown@intel.com>2005-12-28 02:54:59 -0500
commitdefba1d8f233c0d5cf3e1ea6aeb898eca7231860 (patch)
treecd8b1b84da8d8a52ad0d44107daaeeee0a0b65f4 /drivers/acpi/dispatcher/dswload.c
parentcb654695f6b912cef7cb3271665b6ee0d416124c (diff)
[ACPI] ACPICA 20051216
Implemented optional support to allow unresolved names within ASL Package objects. A null object is inserted in the package when a named reference cannot be located in the current namespace. Enabled via the interpreter slack flag which Linux has enabled by default (acpi=strict to disable slack). This should eliminate AE_NOT_FOUND exceptions seen on machines that contain such code. Implemented an optimization to the initialization sequence that can improve boot time. During ACPI device initialization, the _STA method is now run if and only if the _INI method exists. The _STA method is used to determine if the device is present; An _INI can only be run if _STA returns present, but it is a waste of time to run the _STA method if the _INI does not exist. (Prototype and assistance from Dong Wei) Implemented use of the C99 uintptr_t for the pointer casting macros if it is available in the current compiler. Otherwise, the default (void *) cast is used as before. Fixed some possible memory leaks found within the execution path of the Break, Continue, If, and CreateField operators. (Valery Podrezov) Fixed a problem introduced in the 20051202 release where an exception is generated during method execution if a control method attempts to declare another method. Signed-off-by: Bob Moore <robert.moore@intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/dispatcher/dswload.c')
-rw-r--r--drivers/acpi/dispatcher/dswload.c110
1 files changed, 80 insertions, 30 deletions
diff --git a/drivers/acpi/dispatcher/dswload.c b/drivers/acpi/dispatcher/dswload.c
index 44d4f4bb2f92..441931cab08a 100644
--- a/drivers/acpi/dispatcher/dswload.c
+++ b/drivers/acpi/dispatcher/dswload.c
@@ -428,43 +428,54 @@ acpi_status acpi_ds_load1_end_op(struct acpi_walk_state *walk_state)
428 } 428 }
429 } 429 }
430 430
431 if (op->common.aml_opcode == AML_METHOD_OP) { 431 /*
432 /* 432 * If we are executing a method, do not create any namespace objects
433 * method_op pkg_length name_string method_flags term_list 433 * during the load phase, only during execution.
434 * 434 */
435 * Note: We must create the method node/object pair as soon as we 435 if (!walk_state->method_node) {
436 * see the method declaration. This allows later pass1 parsing 436 if (op->common.aml_opcode == AML_METHOD_OP) {
437 * of invocations of the method (need to know the number of 437 /*
438 * arguments.) 438 * method_op pkg_length name_string method_flags term_list
439 */ 439 *
440 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, 440 * Note: We must create the method node/object pair as soon as we
441 "LOADING-Method: State=%p Op=%p named_obj=%p\n", 441 * see the method declaration. This allows later pass1 parsing
442 walk_state, op, op->named.node)); 442 * of invocations of the method (need to know the number of
443 * arguments.)
444 */
445 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
446 "LOADING-Method: State=%p Op=%p named_obj=%p\n",
447 walk_state, op, op->named.node));
443 448
444 if (!acpi_ns_get_attached_object(op->named.node)) { 449 if (!acpi_ns_get_attached_object(op->named.node)) {
445 walk_state->operands[0] = (void *)op->named.node; 450 walk_state->operands[0] =
446 walk_state->num_operands = 1; 451 ACPI_CAST_PTR(void, op->named.node);
452 walk_state->num_operands = 1;
447 453
448 status = 454 status =
449 acpi_ds_create_operands(walk_state, 455 acpi_ds_create_operands(walk_state,
450 op->common.value.arg); 456 op->common.value.
451 if (ACPI_SUCCESS(status)) { 457 arg);
452 status = acpi_ex_create_method(op->named.data, 458 if (ACPI_SUCCESS(status)) {
453 op->named.length, 459 status =
454 walk_state); 460 acpi_ex_create_method(op->named.
455 } 461 data,
456 walk_state->operands[0] = NULL; 462 op->named.
457 walk_state->num_operands = 0; 463 length,
464 walk_state);
465 }
466 walk_state->operands[0] = NULL;
467 walk_state->num_operands = 0;
458 468
459 if (ACPI_FAILURE(status)) { 469 if (ACPI_FAILURE(status)) {
460 return_ACPI_STATUS(status); 470 return_ACPI_STATUS(status);
471 }
461 } 472 }
462 } 473 }
463 } 474 }
464 475
465 /* Pop the scope stack */ 476 /* Pop the scope stack (only if loading a table) */
466 477
467 if (acpi_ns_opens_scope(object_type)) { 478 if (!walk_state->method_node && acpi_ns_opens_scope(object_type)) {
468 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, 479 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
469 "(%s): Popping scope for Op %p\n", 480 "(%s): Popping scope for Op %p\n",
470 acpi_ut_get_type_name(object_type), op)); 481 acpi_ut_get_type_name(object_type), op));
@@ -1015,11 +1026,50 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
1015 1026
1016 status = acpi_ds_create_node(walk_state, node, op); 1027 status = acpi_ds_create_node(walk_state, node, op);
1017 break; 1028 break;
1029
1030 case AML_METHOD_OP:
1031 /*
1032 * method_op pkg_length name_string method_flags term_list
1033 *
1034 * Note: We must create the method node/object pair as soon as we
1035 * see the method declaration. This allows later pass1 parsing
1036 * of invocations of the method (need to know the number of
1037 * arguments.)
1038 */
1039 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
1040 "LOADING-Method: State=%p Op=%p named_obj=%p\n",
1041 walk_state, op, op->named.node));
1042
1043 if (!acpi_ns_get_attached_object(op->named.node)) {
1044 walk_state->operands[0] =
1045 ACPI_CAST_PTR(void, op->named.node);
1046 walk_state->num_operands = 1;
1047
1048 status =
1049 acpi_ds_create_operands(walk_state,
1050 op->common.value.
1051 arg);
1052 if (ACPI_SUCCESS(status)) {
1053 status =
1054 acpi_ex_create_method(op->named.
1055 data,
1056 op->named.
1057 length,
1058 walk_state);
1059 }
1060 walk_state->operands[0] = NULL;
1061 walk_state->num_operands = 0;
1062
1063 if (ACPI_FAILURE(status)) {
1064 return_ACPI_STATUS(status);
1065 }
1066 }
1067 break;
1068
1018#endif /* ACPI_NO_METHOD_EXECUTION */ 1069#endif /* ACPI_NO_METHOD_EXECUTION */
1019 1070
1020 default: 1071 default:
1021 /* All NAMED_COMPLEX opcodes must be handled above */ 1072 /* All NAMED_COMPLEX opcodes must be handled above */
1022 /* Note: Method objects were already created in Pass 1 */
1023 break; 1073 break;
1024 } 1074 }
1025 break; 1075 break;