diff options
author | Bob Moore <robert.moore@intel.com> | 2005-12-16 17:05:00 -0500 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2005-12-28 02:54:59 -0500 |
commit | defba1d8f233c0d5cf3e1ea6aeb898eca7231860 (patch) | |
tree | cd8b1b84da8d8a52ad0d44107daaeeee0a0b65f4 /drivers/acpi/dispatcher/dswload.c | |
parent | cb654695f6b912cef7cb3271665b6ee0d416124c (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.c | 110 |
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; |