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/dsmethod.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/dsmethod.c')
-rw-r--r-- | drivers/acpi/dispatcher/dsmethod.c | 65 |
1 files changed, 62 insertions, 3 deletions
diff --git a/drivers/acpi/dispatcher/dsmethod.c b/drivers/acpi/dispatcher/dsmethod.c index 58ad00b31ee9..e7ce86b8d954 100644 --- a/drivers/acpi/dispatcher/dsmethod.c +++ b/drivers/acpi/dispatcher/dsmethod.c | |||
@@ -47,12 +47,70 @@ | |||
47 | #include <acpi/acdispat.h> | 47 | #include <acpi/acdispat.h> |
48 | #include <acpi/acinterp.h> | 48 | #include <acpi/acinterp.h> |
49 | #include <acpi/acnamesp.h> | 49 | #include <acpi/acnamesp.h> |
50 | #include <acpi/acdisasm.h> | ||
50 | 51 | ||
51 | #define _COMPONENT ACPI_DISPATCHER | 52 | #define _COMPONENT ACPI_DISPATCHER |
52 | ACPI_MODULE_NAME("dsmethod") | 53 | ACPI_MODULE_NAME("dsmethod") |
53 | 54 | ||
54 | /******************************************************************************* | 55 | /******************************************************************************* |
55 | * | 56 | * |
57 | * FUNCTION: acpi_ds_method_error | ||
58 | * | ||
59 | * PARAMETERS: Status - Execution status | ||
60 | * walk_state - Current state | ||
61 | * | ||
62 | * RETURN: Status | ||
63 | * | ||
64 | * DESCRIPTION: Called on method error. Invoke the global exception handler if | ||
65 | * present, dump the method data if the disassembler is configured | ||
66 | * | ||
67 | * Note: Allows the exception handler to change the status code | ||
68 | * | ||
69 | ******************************************************************************/ | ||
70 | acpi_status | ||
71 | acpi_ds_method_error(acpi_status status, struct acpi_walk_state *walk_state) | ||
72 | { | ||
73 | ACPI_FUNCTION_ENTRY(); | ||
74 | |||
75 | /* Ignore AE_OK and control exception codes */ | ||
76 | |||
77 | if (ACPI_SUCCESS(status) || (status & AE_CODE_CONTROL)) { | ||
78 | return (status); | ||
79 | } | ||
80 | |||
81 | /* Invoke the global exception handler */ | ||
82 | |||
83 | if (acpi_gbl_exception_handler) { | ||
84 | /* Exit the interpreter, allow handler to execute methods */ | ||
85 | |||
86 | acpi_ex_exit_interpreter(); | ||
87 | |||
88 | /* | ||
89 | * Handler can map the exception code to anything it wants, including | ||
90 | * AE_OK, in which case the executing method will not be aborted. | ||
91 | */ | ||
92 | status = acpi_gbl_exception_handler(status, | ||
93 | walk_state->method_node ? | ||
94 | walk_state->method_node-> | ||
95 | name.integer : 0, | ||
96 | walk_state->opcode, | ||
97 | walk_state->aml_offset, | ||
98 | NULL); | ||
99 | (void)acpi_ex_enter_interpreter(); | ||
100 | } | ||
101 | #ifdef ACPI_DISASSEMBLER | ||
102 | if (ACPI_FAILURE(status)) { | ||
103 | /* Display method locals/args if disassembler is present */ | ||
104 | |||
105 | acpi_dm_dump_method_info(status, walk_state, walk_state->op); | ||
106 | } | ||
107 | #endif | ||
108 | |||
109 | return (status); | ||
110 | } | ||
111 | |||
112 | /******************************************************************************* | ||
113 | * | ||
56 | * FUNCTION: acpi_ds_begin_method_execution | 114 | * FUNCTION: acpi_ds_begin_method_execution |
57 | * | 115 | * |
58 | * PARAMETERS: method_node - Node of the method | 116 | * PARAMETERS: method_node - Node of the method |
@@ -66,10 +124,11 @@ ACPI_MODULE_NAME("dsmethod") | |||
66 | * for clearance to execute. | 124 | * for clearance to execute. |
67 | * | 125 | * |
68 | ******************************************************************************/ | 126 | ******************************************************************************/ |
127 | |||
69 | acpi_status | 128 | acpi_status |
70 | acpi_ds_begin_method_execution(struct acpi_namespace_node *method_node, | 129 | acpi_ds_begin_method_execution(struct acpi_namespace_node * method_node, |
71 | union acpi_operand_object *obj_desc, | 130 | union acpi_operand_object * obj_desc, |
72 | struct acpi_namespace_node *calling_method_node) | 131 | struct acpi_namespace_node * calling_method_node) |
73 | { | 132 | { |
74 | acpi_status status = AE_OK; | 133 | acpi_status status = AE_OK; |
75 | 134 | ||