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/dsobject.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/dsobject.c')
-rw-r--r-- | drivers/acpi/dispatcher/dsobject.c | 81 |
1 files changed, 53 insertions, 28 deletions
diff --git a/drivers/acpi/dispatcher/dsobject.c b/drivers/acpi/dispatcher/dsobject.c index 8ac0cd93adb5..905a84e4b145 100644 --- a/drivers/acpi/dispatcher/dsobject.c +++ b/drivers/acpi/dispatcher/dsobject.c | |||
@@ -51,6 +51,7 @@ | |||
51 | #define _COMPONENT ACPI_DISPATCHER | 51 | #define _COMPONENT ACPI_DISPATCHER |
52 | ACPI_MODULE_NAME("dsobject") | 52 | ACPI_MODULE_NAME("dsobject") |
53 | 53 | ||
54 | /* Local prototypes */ | ||
54 | static acpi_status | 55 | static acpi_status |
55 | acpi_ds_build_internal_object(struct acpi_walk_state *walk_state, | 56 | acpi_ds_build_internal_object(struct acpi_walk_state *walk_state, |
56 | union acpi_parse_object *op, | 57 | union acpi_parse_object *op, |
@@ -85,7 +86,7 @@ acpi_ds_build_internal_object(struct acpi_walk_state *walk_state, | |||
85 | *obj_desc_ptr = NULL; | 86 | *obj_desc_ptr = NULL; |
86 | if (op->common.aml_opcode == AML_INT_NAMEPATH_OP) { | 87 | if (op->common.aml_opcode == AML_INT_NAMEPATH_OP) { |
87 | /* | 88 | /* |
88 | * This is an named object reference. If this name was | 89 | * This is a named object reference. If this name was |
89 | * previously looked up in the namespace, it was stored in this op. | 90 | * previously looked up in the namespace, it was stored in this op. |
90 | * Otherwise, go ahead and look it up now | 91 | * Otherwise, go ahead and look it up now |
91 | */ | 92 | */ |
@@ -96,18 +97,48 @@ acpi_ds_build_internal_object(struct acpi_walk_state *walk_state, | |||
96 | ACPI_IMODE_EXECUTE, | 97 | ACPI_IMODE_EXECUTE, |
97 | ACPI_NS_SEARCH_PARENT | | 98 | ACPI_NS_SEARCH_PARENT | |
98 | ACPI_NS_DONT_OPEN_SCOPE, NULL, | 99 | ACPI_NS_DONT_OPEN_SCOPE, NULL, |
99 | (struct acpi_namespace_node **) | 100 | ACPI_CAST_INDIRECT_PTR(struct |
100 | &(op->common.node)); | 101 | acpi_namespace_node, |
101 | 102 | &(op-> | |
103 | common. | ||
104 | node))); | ||
102 | if (ACPI_FAILURE(status)) { | 105 | if (ACPI_FAILURE(status)) { |
103 | ACPI_REPORT_NSERROR(op->common.value.string, | 106 | /* Check if we are resolving a named reference within a package */ |
104 | status); | 107 | |
108 | if ((status == AE_NOT_FOUND) | ||
109 | && (acpi_gbl_enable_interpreter_slack) | ||
110 | && | ||
111 | ((op->common.parent->common.aml_opcode == | ||
112 | AML_PACKAGE_OP) | ||
113 | || (op->common.parent->common.aml_opcode == | ||
114 | AML_VAR_PACKAGE_OP))) { | ||
115 | /* | ||
116 | * We didn't find the target and we are populating elements | ||
117 | * of a package - ignore if slack enabled. Some ASL code | ||
118 | * contains dangling invalid references in packages and | ||
119 | * expects that no exception will be issued. Leave the | ||
120 | * element as a null element. It cannot be used, but it | ||
121 | * can be overwritten by subsequent ASL code - this is | ||
122 | * typically the case. | ||
123 | */ | ||
124 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||
125 | "Ignoring unresolved reference in package [%4.4s]\n", | ||
126 | walk_state-> | ||
127 | scope_info->scope. | ||
128 | node->name.ascii)); | ||
129 | |||
130 | return_ACPI_STATUS(AE_OK); | ||
131 | } else { | ||
132 | ACPI_REPORT_NSERROR(op->common.value. | ||
133 | string, status); | ||
134 | } | ||
135 | |||
105 | return_ACPI_STATUS(status); | 136 | return_ACPI_STATUS(status); |
106 | } | 137 | } |
107 | } | 138 | } |
108 | } | 139 | } |
109 | 140 | ||
110 | /* Create and init the internal ACPI object */ | 141 | /* Create and init a new internal ACPI object */ |
111 | 142 | ||
112 | obj_desc = acpi_ut_create_internal_object((acpi_ps_get_opcode_info | 143 | obj_desc = acpi_ut_create_internal_object((acpi_ps_get_opcode_info |
113 | (op->common.aml_opcode))-> | 144 | (op->common.aml_opcode))-> |
@@ -157,13 +188,13 @@ acpi_ds_build_internal_buffer_obj(struct acpi_walk_state *walk_state, | |||
157 | 188 | ||
158 | ACPI_FUNCTION_TRACE("ds_build_internal_buffer_obj"); | 189 | ACPI_FUNCTION_TRACE("ds_build_internal_buffer_obj"); |
159 | 190 | ||
191 | /* | ||
192 | * If we are evaluating a Named buffer object "Name (xxxx, Buffer)". | ||
193 | * The buffer object already exists (from the NS node), otherwise it must | ||
194 | * be created. | ||
195 | */ | ||
160 | obj_desc = *obj_desc_ptr; | 196 | obj_desc = *obj_desc_ptr; |
161 | if (obj_desc) { | 197 | if (!obj_desc) { |
162 | /* | ||
163 | * We are evaluating a Named buffer object "Name (xxxx, Buffer)". | ||
164 | * The buffer object already exists (from the NS node) | ||
165 | */ | ||
166 | } else { | ||
167 | /* Create a new buffer object */ | 198 | /* Create a new buffer object */ |
168 | 199 | ||
169 | obj_desc = acpi_ut_create_internal_object(ACPI_TYPE_BUFFER); | 200 | obj_desc = acpi_ut_create_internal_object(ACPI_TYPE_BUFFER); |
@@ -259,7 +290,7 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state, | |||
259 | union acpi_operand_object *obj_desc = NULL; | 290 | union acpi_operand_object *obj_desc = NULL; |
260 | u32 package_list_length; | 291 | u32 package_list_length; |
261 | acpi_status status = AE_OK; | 292 | acpi_status status = AE_OK; |
262 | u32 i; | 293 | acpi_native_uint i; |
263 | 294 | ||
264 | ACPI_FUNCTION_TRACE("ds_build_internal_package_obj"); | 295 | ACPI_FUNCTION_TRACE("ds_build_internal_package_obj"); |
265 | 296 | ||
@@ -271,13 +302,12 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state, | |||
271 | parent = parent->common.parent; | 302 | parent = parent->common.parent; |
272 | } | 303 | } |
273 | 304 | ||
305 | /* | ||
306 | * If we are evaluating a Named package object "Name (xxxx, Package)", | ||
307 | * the package object already exists, otherwise it must be created. | ||
308 | */ | ||
274 | obj_desc = *obj_desc_ptr; | 309 | obj_desc = *obj_desc_ptr; |
275 | if (obj_desc) { | 310 | if (!obj_desc) { |
276 | /* | ||
277 | * We are evaluating a Named package object "Name (xxxx, Package)". | ||
278 | * Get the existing package object from the NS node | ||
279 | */ | ||
280 | } else { | ||
281 | obj_desc = acpi_ut_create_internal_object(ACPI_TYPE_PACKAGE); | 311 | obj_desc = acpi_ut_create_internal_object(ACPI_TYPE_PACKAGE); |
282 | *obj_desc_ptr = obj_desc; | 312 | *obj_desc_ptr = obj_desc; |
283 | if (!obj_desc) { | 313 | if (!obj_desc) { |
@@ -291,11 +321,9 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state, | |||
291 | 321 | ||
292 | /* Count the number of items in the package list */ | 322 | /* Count the number of items in the package list */ |
293 | 323 | ||
294 | package_list_length = 0; | ||
295 | arg = op->common.value.arg; | 324 | arg = op->common.value.arg; |
296 | arg = arg->common.next; | 325 | arg = arg->common.next; |
297 | while (arg) { | 326 | for (package_list_length = 0; arg; package_list_length++) { |
298 | package_list_length++; | ||
299 | arg = arg->common.next; | 327 | arg = arg->common.next; |
300 | } | 328 | } |
301 | 329 | ||
@@ -322,12 +350,11 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state, | |||
322 | } | 350 | } |
323 | 351 | ||
324 | /* | 352 | /* |
325 | * Now init the elements of the package | 353 | * Initialize all elements of the package |
326 | */ | 354 | */ |
327 | i = 0; | ||
328 | arg = op->common.value.arg; | 355 | arg = op->common.value.arg; |
329 | arg = arg->common.next; | 356 | arg = arg->common.next; |
330 | while (arg) { | 357 | for (i = 0; arg; i++) { |
331 | if (arg->common.aml_opcode == AML_INT_RETURN_VALUE_OP) { | 358 | if (arg->common.aml_opcode == AML_INT_RETURN_VALUE_OP) { |
332 | /* Object (package or buffer) is already built */ | 359 | /* Object (package or buffer) is already built */ |
333 | 360 | ||
@@ -340,8 +367,6 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state, | |||
340 | package. | 367 | package. |
341 | elements[i]); | 368 | elements[i]); |
342 | } | 369 | } |
343 | |||
344 | i++; | ||
345 | arg = arg->common.next; | 370 | arg = arg->common.next; |
346 | } | 371 | } |
347 | 372 | ||