aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/dispatcher/dsobject.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/dispatcher/dsobject.c')
-rw-r--r--drivers/acpi/dispatcher/dsobject.c102
1 files changed, 60 insertions, 42 deletions
diff --git a/drivers/acpi/dispatcher/dsobject.c b/drivers/acpi/dispatcher/dsobject.c
index 8ac0cd93adb5..dc116d679a58 100644
--- a/drivers/acpi/dispatcher/dsobject.c
+++ b/drivers/acpi/dispatcher/dsobject.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -51,6 +51,7 @@
51#define _COMPONENT ACPI_DISPATCHER 51#define _COMPONENT ACPI_DISPATCHER
52ACPI_MODULE_NAME("dsobject") 52ACPI_MODULE_NAME("dsobject")
53 53
54/* Local prototypes */
54static acpi_status 55static acpi_status
55acpi_ds_build_internal_object(struct acpi_walk_state *walk_state, 56acpi_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);
@@ -183,10 +214,7 @@ acpi_ds_build_internal_buffer_obj(struct acpi_walk_state *walk_state,
183 byte_list = arg->named.next; 214 byte_list = arg->named.next;
184 if (byte_list) { 215 if (byte_list) {
185 if (byte_list->common.aml_opcode != AML_INT_BYTELIST_OP) { 216 if (byte_list->common.aml_opcode != AML_INT_BYTELIST_OP) {
186 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 217 ACPI_REPORT_ERROR(("Expecting bytelist, got AML opcode %X in op %p\n", byte_list->common.aml_opcode, byte_list));
187 "Expecting bytelist, got AML opcode %X in op %p\n",
188 byte_list->common.aml_opcode,
189 byte_list));
190 218
191 acpi_ut_remove_reference(obj_desc); 219 acpi_ut_remove_reference(obj_desc);
192 return (AE_TYPE); 220 return (AE_TYPE);
@@ -259,7 +287,7 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state,
259 union acpi_operand_object *obj_desc = NULL; 287 union acpi_operand_object *obj_desc = NULL;
260 u32 package_list_length; 288 u32 package_list_length;
261 acpi_status status = AE_OK; 289 acpi_status status = AE_OK;
262 u32 i; 290 acpi_native_uint i;
263 291
264 ACPI_FUNCTION_TRACE("ds_build_internal_package_obj"); 292 ACPI_FUNCTION_TRACE("ds_build_internal_package_obj");
265 293
@@ -271,13 +299,12 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state,
271 parent = parent->common.parent; 299 parent = parent->common.parent;
272 } 300 }
273 301
302 /*
303 * If we are evaluating a Named package object "Name (xxxx, Package)",
304 * the package object already exists, otherwise it must be created.
305 */
274 obj_desc = *obj_desc_ptr; 306 obj_desc = *obj_desc_ptr;
275 if (obj_desc) { 307 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); 308 obj_desc = acpi_ut_create_internal_object(ACPI_TYPE_PACKAGE);
282 *obj_desc_ptr = obj_desc; 309 *obj_desc_ptr = obj_desc;
283 if (!obj_desc) { 310 if (!obj_desc) {
@@ -291,11 +318,9 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state,
291 318
292 /* Count the number of items in the package list */ 319 /* Count the number of items in the package list */
293 320
294 package_list_length = 0;
295 arg = op->common.value.arg; 321 arg = op->common.value.arg;
296 arg = arg->common.next; 322 arg = arg->common.next;
297 while (arg) { 323 for (package_list_length = 0; arg; package_list_length++) {
298 package_list_length++;
299 arg = arg->common.next; 324 arg = arg->common.next;
300 } 325 }
301 326
@@ -322,12 +347,11 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state,
322 } 347 }
323 348
324 /* 349 /*
325 * Now init the elements of the package 350 * Initialize all elements of the package
326 */ 351 */
327 i = 0;
328 arg = op->common.value.arg; 352 arg = op->common.value.arg;
329 arg = arg->common.next; 353 arg = arg->common.next;
330 while (arg) { 354 for (i = 0; arg; i++) {
331 if (arg->common.aml_opcode == AML_INT_RETURN_VALUE_OP) { 355 if (arg->common.aml_opcode == AML_INT_RETURN_VALUE_OP) {
332 /* Object (package or buffer) is already built */ 356 /* Object (package or buffer) is already built */
333 357
@@ -340,8 +364,6 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state,
340 package. 364 package.
341 elements[i]); 365 elements[i]);
342 } 366 }
343
344 i++;
345 arg = arg->common.next; 367 arg = arg->common.next;
346 } 368 }
347 369
@@ -518,9 +540,7 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state,
518 540
519 default: 541 default:
520 542
521 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 543 ACPI_REPORT_ERROR(("Unknown constant opcode %X\n", opcode));
522 "Unknown constant opcode %X\n",
523 opcode));
524 status = AE_AML_OPERAND_TYPE; 544 status = AE_AML_OPERAND_TYPE;
525 break; 545 break;
526 } 546 }
@@ -535,9 +555,8 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state,
535 break; 555 break;
536 556
537 default: 557 default:
538 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 558 ACPI_REPORT_ERROR(("Unknown Integer type %X\n",
539 "Unknown Integer type %X\n", 559 op_info->type));
540 op_info->type));
541 status = AE_AML_OPERAND_TYPE; 560 status = AE_AML_OPERAND_TYPE;
542 break; 561 break;
543 } 562 }
@@ -615,9 +634,8 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state,
615 634
616 default: 635 default:
617 636
618 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 637 ACPI_REPORT_ERROR(("Unimplemented data type: %X\n",
619 "Unimplemented data type: %X\n", 638 ACPI_GET_OBJECT_TYPE(obj_desc)));
620 ACPI_GET_OBJECT_TYPE(obj_desc)));
621 639
622 status = AE_AML_OPERAND_TYPE; 640 status = AE_AML_OPERAND_TYPE;
623 break; 641 break;