vserver 1.9.5.x5
[linux-2.6.git] / drivers / acpi / executer / exstore.c
index 25464f7..e0fc6ab 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2004, R. Byron Moore
+ * Copyright (C) 2000 - 2005, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -129,7 +129,8 @@ acpi_ex_store (
                /* Destination is not a Reference object */
 
                ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
-                       "Destination is not a Reference or Constant object [%p]\n", dest_desc));
+                       "Target is not a Reference or Constant object - %s [%p]\n",
+                       acpi_ut_get_object_type_name (dest_desc), dest_desc));
 
                ACPI_DUMP_STACK_ENTRY (source_desc);
                ACPI_DUMP_STACK_ENTRY (dest_desc);
@@ -182,23 +183,37 @@ acpi_ex_store (
                 * Storing to the Debug object causes the value stored to be
                 * displayed and otherwise has no effect -- see ACPI Specification
                 */
-               ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "**** Write to Debug Object: ****:\n\n"));
+               ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+                       "**** Write to Debug Object: Object %p %s ****:\n\n",
+                       source_desc, acpi_ut_get_object_type_name (source_desc)));
 
                ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "[ACPI Debug] %s: ",
-                                 acpi_ut_get_object_type_name (source_desc)));
+                       acpi_ut_get_object_type_name (source_desc)));
+
+               if (!acpi_ut_valid_internal_object (source_desc)) {
+                  ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT,
+                          "%p, Invalid Internal Object!\n", source_desc));
+                  break;
+               }
 
                switch (ACPI_GET_OBJECT_TYPE (source_desc)) {
                case ACPI_TYPE_INTEGER:
 
-                       ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "0x%8.8X%8.8X\n",
+                       if (acpi_gbl_integer_byte_width == 4) {
+                               ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "0x%8.8X\n",
+                                       (u32) source_desc->integer.value));
+                       }
+                       else {
+                               ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "0x%8.8X%8.8X\n",
                                        ACPI_FORMAT_UINT64 (source_desc->integer.value)));
+                       }
                        break;
 
 
                case ACPI_TYPE_BUFFER:
 
-                       ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "Length 0x%.2X",
-                                       (u32) source_desc->buffer.length));
+                       ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "[0x%.2X]",
+                               (u32) source_desc->buffer.length));
                        ACPI_DUMP_BUFFER (source_desc->buffer.pointer,
                                (source_desc->buffer.length < 32) ? source_desc->buffer.length : 32);
                        break;
@@ -206,22 +221,22 @@ acpi_ex_store (
 
                case ACPI_TYPE_STRING:
 
-                       ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "Length 0x%.2X, \"%s\"\n",
-                                       source_desc->string.length, source_desc->string.pointer));
+                       ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "[0x%.2X] \"%s\"\n",
+                               source_desc->string.length, source_desc->string.pointer));
                        break;
 
 
                case ACPI_TYPE_PACKAGE:
 
-                       ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "Size 0x%.2X Elements Ptr - %p\n",
-                                       source_desc->package.count, source_desc->package.elements));
+                       ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "[0x%.2X] Elements Ptr - %p\n",
+                               source_desc->package.count, source_desc->package.elements));
                        break;
 
 
                default:
 
                        ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "%p\n",
-                                       source_desc));
+                               source_desc));
                        break;
                }
 
@@ -280,56 +295,45 @@ acpi_ex_store_object_to_index (
        switch (index_desc->reference.target_type) {
        case ACPI_TYPE_PACKAGE:
                /*
-                * Storing to a package element is not simple.  The source must be
-                * evaluated and converted to the type of the destination and then the
-                * source is copied into the destination - we can't just point to the
-                * source object.
-                */
-               /*
+                * Storing to a package element. Copy the object and replace
+                * any existing object with the new object. No implicit
+                * conversion is performed.
+                *
                 * The object at *(index_desc->Reference.Where) is the
                 * element within the package that is to be modified.
                 * The parent package object is at index_desc->Reference.Object
                 */
                obj_desc = *(index_desc->reference.where);
 
-               /* Do the conversion/store */
-
-               status = acpi_ex_store_object_to_object (source_desc, obj_desc, &new_desc,
-                                 walk_state);
+               status = acpi_ut_copy_iobject_to_iobject (source_desc, &new_desc, walk_state);
                if (ACPI_FAILURE (status)) {
-                       ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
-                               "Could not store object to indexed package element\n"));
                        return_ACPI_STATUS (status);
                }
 
-               /*
-                * If a new object was created, we must install it as the new
-                * package element
-                */
-               if (new_desc != obj_desc) {
-                       acpi_ut_remove_reference (obj_desc);
-                       *(index_desc->reference.where) = new_desc;
+               if (obj_desc) {
+                       /* Decrement reference count by the ref count of the parent package */
 
-                       /* If same as the original source, add a reference */
-
-                       if (new_desc == source_desc) {
-                               acpi_ut_add_reference (new_desc);
+                       for (i = 0; i < ((union acpi_operand_object *) index_desc->reference.object)->common.reference_count; i++) {
+                               acpi_ut_remove_reference (obj_desc);
                        }
+               }
 
-                       /* Increment reference count by the ref count of the parent package -1 */
+               *(index_desc->reference.where) = new_desc;
 
-                       for (i = 1; i < ((union acpi_operand_object *) index_desc->reference.object)->common.reference_count; i++) {
-                               acpi_ut_add_reference (new_desc);
-                       }
+               /* Increment reference count by the ref count of the parent package -1 */
+
+               for (i = 1; i < ((union acpi_operand_object *) index_desc->reference.object)->common.reference_count; i++) {
+                       acpi_ut_add_reference (new_desc);
                }
+
                break;
 
 
        case ACPI_TYPE_BUFFER_FIELD:
 
                /*
-                * Store into a Buffer (not actually a real buffer_field) at a
-                * location defined by an Index.
+                * Store into a Buffer or String (not actually a real buffer_field)
+                * at a location defined by an Index.
                 *
                 * The first 8-bit element of the source object is written to the
                 * 8-bit Buffer location defined by the Index destination object,
@@ -337,10 +341,13 @@ acpi_ex_store_object_to_index (
                 */
 
                /*
-                * Make sure the target is a Buffer
+                * Make sure the target is a Buffer or String. An error should
+                * not happen here, since the reference_object was constructed
+                * by the INDEX_OP code.
                 */
                obj_desc = index_desc->reference.object;
-               if (ACPI_GET_OBJECT_TYPE (obj_desc) != ACPI_TYPE_BUFFER) {
+               if ((ACPI_GET_OBJECT_TYPE (obj_desc) != ACPI_TYPE_BUFFER) &&
+                       (ACPI_GET_OBJECT_TYPE (obj_desc) != ACPI_TYPE_STRING)) {
                        return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
                }
 
@@ -357,13 +364,11 @@ acpi_ex_store_object_to_index (
                        break;
 
                case ACPI_TYPE_BUFFER:
-
-                       value = source_desc->buffer.pointer[0];
-                       break;
-
                case ACPI_TYPE_STRING:
 
-                       value = (u8) source_desc->string.pointer[0];
+                       /* Note: Takes advantage of common string/buffer fields */
+
+                       value = source_desc->buffer.pointer[0];
                        break;
 
                default: