aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/dispatcher/dsopcode.c
diff options
context:
space:
mode:
authorBob Moore <robert.moore@intel.com>2006-01-27 16:43:00 -0500
committerLen Brown <len.brown@intel.com>2006-01-31 03:25:09 -0500
commitb8e4d89357fc434618a59c1047cac72641191805 (patch)
treeac97fcc6fdc277c682365900663872c96f2420bd /drivers/acpi/dispatcher/dsopcode.c
parent292dd876ee765c478b27c93cc51e93a558ed58bf (diff)
[ACPI] ACPICA 20060127
Implemented support in the Resource Manager to allow unresolved namestring references within resource package objects for the _PRT method. This support is in addition to the previously implemented unresolved reference support within the AML parser. If the interpreter slack mode is enabled (true on Linux unless acpi=strict), these unresolved references will be passed through to the caller as a NULL package entry. http://bugzilla.kernel.org/show_bug.cgi?id=5741 Implemented and deployed new macros and functions for error and warning messages across the subsystem. These macros are simpler and generate less code than their predecessors. The new macros ACPI_ERROR, ACPI_EXCEPTION, ACPI_WARNING, and ACPI_INFO replace the ACPI_REPORT_* macros. Implemented the acpi_cpu_flags type to simplify host OS integration of the Acquire/Release Lock OSL interfaces. Suggested by Steven Rostedt and Andrew Morton. Fixed a problem where Alias ASL operators are sometimes not correctly resolved. causing AE_AML_INTERNAL http://bugzilla.kernel.org/show_bug.cgi?id=5189 http://bugzilla.kernel.org/show_bug.cgi?id=5674 Fixed several problems with the implementation of the ConcatenateResTemplate ASL operator. As per the ACPI specification, zero length buffers are now treated as a single EndTag. One-length buffers always cause a fatal exception. Non-zero length buffers that do not end with a full 2-byte EndTag cause a fatal exception. Fixed a possible structure overwrite in the AcpiGetObjectInfo external interface. (With assistance from Thomas Renninger) Signed-off-by: Bob Moore <robert.moore@intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/dispatcher/dsopcode.c')
-rw-r--r--drivers/acpi/dispatcher/dsopcode.c45
1 files changed, 28 insertions, 17 deletions
diff --git a/drivers/acpi/dispatcher/dsopcode.c b/drivers/acpi/dispatcher/dsopcode.c
index 60414ee84b0a..6229c10674e1 100644
--- a/drivers/acpi/dispatcher/dsopcode.c
+++ b/drivers/acpi/dispatcher/dsopcode.c
@@ -245,7 +245,9 @@ acpi_status acpi_ds_get_buffer_arguments(union acpi_operand_object *obj_desc)
245 245
246 node = obj_desc->buffer.node; 246 node = obj_desc->buffer.node;
247 if (!node) { 247 if (!node) {
248 ACPI_REPORT_ERROR(("No pointer back to NS node in buffer obj %p\n", obj_desc)); 248 ACPI_ERROR((AE_INFO,
249 "No pointer back to NS node in buffer obj %p",
250 obj_desc));
249 return_ACPI_STATUS(AE_AML_INTERNAL); 251 return_ACPI_STATUS(AE_AML_INTERNAL);
250 } 252 }
251 253
@@ -287,8 +289,9 @@ acpi_status acpi_ds_get_package_arguments(union acpi_operand_object *obj_desc)
287 289
288 node = obj_desc->package.node; 290 node = obj_desc->package.node;
289 if (!node) { 291 if (!node) {
290 ACPI_REPORT_ERROR(("No pointer back to NS node in package %p\n", 292 ACPI_ERROR((AE_INFO,
291 obj_desc)); 293 "No pointer back to NS node in package %p",
294 obj_desc));
292 return_ACPI_STATUS(AE_AML_INTERNAL); 295 return_ACPI_STATUS(AE_AML_INTERNAL);
293 } 296 }
294 297
@@ -413,7 +416,9 @@ acpi_ds_init_buffer_field(u16 aml_opcode,
413 /* Host object must be a Buffer */ 416 /* Host object must be a Buffer */
414 417
415 if (ACPI_GET_OBJECT_TYPE(buffer_desc) != ACPI_TYPE_BUFFER) { 418 if (ACPI_GET_OBJECT_TYPE(buffer_desc) != ACPI_TYPE_BUFFER) {
416 ACPI_REPORT_ERROR(("Target of Create Field is not a Buffer object - %s\n", acpi_ut_get_object_type_name(buffer_desc))); 419 ACPI_ERROR((AE_INFO,
420 "Target of Create Field is not a Buffer object - %s",
421 acpi_ut_get_object_type_name(buffer_desc)));
417 422
418 status = AE_AML_OPERAND_TYPE; 423 status = AE_AML_OPERAND_TYPE;
419 goto cleanup; 424 goto cleanup;
@@ -425,9 +430,10 @@ acpi_ds_init_buffer_field(u16 aml_opcode,
425 * after resolution in acpi_ex_resolve_operands(). 430 * after resolution in acpi_ex_resolve_operands().
426 */ 431 */
427 if (ACPI_GET_DESCRIPTOR_TYPE(result_desc) != ACPI_DESC_TYPE_NAMED) { 432 if (ACPI_GET_DESCRIPTOR_TYPE(result_desc) != ACPI_DESC_TYPE_NAMED) {
428 ACPI_REPORT_ERROR(("(%s) destination not a NS Node [%s]\n", 433 ACPI_ERROR((AE_INFO,
429 acpi_ps_get_opcode_name(aml_opcode), 434 "(%s) destination not a NS Node [%s]",
430 acpi_ut_get_descriptor_name(result_desc))); 435 acpi_ps_get_opcode_name(aml_opcode),
436 acpi_ut_get_descriptor_name(result_desc)));
431 437
432 status = AE_AML_OPERAND_TYPE; 438 status = AE_AML_OPERAND_TYPE;
433 goto cleanup; 439 goto cleanup;
@@ -450,7 +456,8 @@ acpi_ds_init_buffer_field(u16 aml_opcode,
450 /* Must have a valid (>0) bit count */ 456 /* Must have a valid (>0) bit count */
451 457
452 if (bit_count == 0) { 458 if (bit_count == 0) {
453 ACPI_REPORT_ERROR(("Attempt to create_field of length 0\n")); 459 ACPI_ERROR((AE_INFO,
460 "Attempt to create_field of length zero"));
454 status = AE_AML_OPERAND_VALUE; 461 status = AE_AML_OPERAND_VALUE;
455 goto cleanup; 462 goto cleanup;
456 } 463 }
@@ -503,8 +510,8 @@ acpi_ds_init_buffer_field(u16 aml_opcode,
503 510
504 default: 511 default:
505 512
506 ACPI_REPORT_ERROR(("Unknown field creation opcode %02x\n", 513 ACPI_ERROR((AE_INFO,
507 aml_opcode)); 514 "Unknown field creation opcode %02x", aml_opcode));
508 status = AE_AML_BAD_OPCODE; 515 status = AE_AML_BAD_OPCODE;
509 goto cleanup; 516 goto cleanup;
510 } 517 }
@@ -512,7 +519,12 @@ acpi_ds_init_buffer_field(u16 aml_opcode,
512 /* Entire field must fit within the current length of the buffer */ 519 /* Entire field must fit within the current length of the buffer */
513 520
514 if ((bit_offset + bit_count) > (8 * (u32) buffer_desc->buffer.length)) { 521 if ((bit_offset + bit_count) > (8 * (u32) buffer_desc->buffer.length)) {
515 ACPI_REPORT_ERROR(("Field [%4.4s] size %d exceeds Buffer [%4.4s] size %d (bits)\n", acpi_ut_get_node_name(result_desc), bit_offset + bit_count, acpi_ut_get_node_name(buffer_desc->buffer.node), 8 * (u32) buffer_desc->buffer.length)); 522 ACPI_ERROR((AE_INFO,
523 "Field [%4.4s] at %d exceeds Buffer [%4.4s] size %d (bits)",
524 acpi_ut_get_node_name(result_desc),
525 bit_offset + bit_count,
526 acpi_ut_get_node_name(buffer_desc->buffer.node),
527 8 * (u32) buffer_desc->buffer.length));
516 status = AE_AML_BUFFER_LIMIT; 528 status = AE_AML_BUFFER_LIMIT;
517 goto cleanup; 529 goto cleanup;
518 } 530 }
@@ -618,10 +630,9 @@ acpi_ds_eval_buffer_field_operands(struct acpi_walk_state *walk_state,
618 "after acpi_ex_resolve_operands"); 630 "after acpi_ex_resolve_operands");
619 631
620 if (ACPI_FAILURE(status)) { 632 if (ACPI_FAILURE(status)) {
621 ACPI_REPORT_ERROR(("(%s) bad operand(s) (%X)\n", 633 ACPI_ERROR((AE_INFO, "(%s) bad operand(s) (%X)",
622 acpi_ps_get_opcode_name(op->common. 634 acpi_ps_get_opcode_name(op->common.aml_opcode),
623 aml_opcode), 635 status));
624 status));
625 636
626 return_ACPI_STATUS(status); 637 return_ACPI_STATUS(status);
627 } 638 }
@@ -1145,8 +1156,8 @@ acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state,
1145 1156
1146 default: 1157 default:
1147 1158
1148 ACPI_REPORT_ERROR(("Unknown control opcode=%X Op=%p\n", 1159 ACPI_ERROR((AE_INFO, "Unknown control opcode=%X Op=%p",
1149 op->common.aml_opcode, op)); 1160 op->common.aml_opcode, op));
1150 1161
1151 status = AE_AML_BAD_OPCODE; 1162 status = AE_AML_BAD_OPCODE;
1152 break; 1163 break;