fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / acpi / executer / exstorob.c
index 42c1feb..99ebe5a 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2004, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * POSSIBILITY OF SUCH DAMAGES.
  */
 
-
 #include <acpi/acpi.h>
 #include <acpi/acinterp.h>
 
-
 #define _COMPONENT          ACPI_EXECUTER
-        ACPI_MODULE_NAME    ("exstorob")
-
+ACPI_MODULE_NAME("exstorob")
 
 /*******************************************************************************
  *
  * DESCRIPTION: Copy a buffer object to another buffer object.
  *
  ******************************************************************************/
-
 acpi_status
-acpi_ex_store_buffer_to_buffer (
-       union acpi_operand_object       *source_desc,
-       union acpi_operand_object       *target_desc)
+acpi_ex_store_buffer_to_buffer(union acpi_operand_object *source_desc,
+                              union acpi_operand_object *target_desc)
 {
-       u32                             length;
-       u8                              *buffer;
+       u32 length;
+       u8 *buffer;
 
+       ACPI_FUNCTION_TRACE_PTR(ex_store_buffer_to_buffer, source_desc);
 
-       ACPI_FUNCTION_TRACE_PTR ("ex_store_buffer_to_buffer", source_desc);
+       /* We know that source_desc is a buffer by now */
 
-
-       /*
-        * We know that source_desc is a buffer by now
-        */
-       buffer = (u8 *) source_desc->buffer.pointer;
+       buffer = ACPI_CAST_PTR(u8, source_desc->buffer.pointer);
        length = source_desc->buffer.length;
 
        /*
@@ -87,44 +79,65 @@ acpi_ex_store_buffer_to_buffer (
         * allocate a new buffer of the proper length
         */
        if ((target_desc->buffer.length == 0) ||
-               (target_desc->common.flags & AOPOBJ_STATIC_POINTER)) {
-               target_desc->buffer.pointer = ACPI_MEM_ALLOCATE (length);
+           (target_desc->common.flags & AOPOBJ_STATIC_POINTER)) {
+               target_desc->buffer.pointer = ACPI_ALLOCATE(length);
                if (!target_desc->buffer.pointer) {
-                       return_ACPI_STATUS (AE_NO_MEMORY);
+                       return_ACPI_STATUS(AE_NO_MEMORY);
                }
 
-               target_desc->common.flags &= ~AOPOBJ_STATIC_POINTER;
                target_desc->buffer.length = length;
        }
 
-       /*
-        * Buffer is a static allocation,
-        * only place what will fit in the buffer.
-        */
+       /* Copy source buffer to target buffer */
+
        if (length <= target_desc->buffer.length) {
+
                /* Clear existing buffer and copy in the new one */
 
-               ACPI_MEMSET (target_desc->buffer.pointer, 0, target_desc->buffer.length);
-               ACPI_MEMCPY (target_desc->buffer.pointer, buffer, length);
-       }
-       else {
+               ACPI_MEMSET(target_desc->buffer.pointer, 0,
+                           target_desc->buffer.length);
+               ACPI_MEMCPY(target_desc->buffer.pointer, buffer, length);
+
+#ifdef ACPI_OBSOLETE_BEHAVIOR
+               /*
+                * NOTE: ACPI versions up to 3.0 specified that the buffer must be
+                * truncated if the string is smaller than the buffer.  However, "other"
+                * implementations of ACPI never did this and thus became the defacto
+                * standard. ACPI 3.0_a changes this behavior such that the buffer
+                * is no longer truncated.
+                */
+
                /*
-                * Truncate the source, copy only what will fit
+                * OBSOLETE BEHAVIOR:
+                * If the original source was a string, we must truncate the buffer,
+                * according to the ACPI spec.  Integer-to-Buffer and Buffer-to-Buffer
+                * copy must not truncate the original buffer.
                 */
-               ACPI_MEMCPY (target_desc->buffer.pointer, buffer, target_desc->buffer.length);
+               if (original_src_type == ACPI_TYPE_STRING) {
+
+                       /* Set the new length of the target */
+
+                       target_desc->buffer.length = length;
+               }
+#endif
+       } else {
+               /* Truncate the source, copy only what will fit */
+
+               ACPI_MEMCPY(target_desc->buffer.pointer, buffer,
+                           target_desc->buffer.length);
 
-               ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
-                       "Truncating src buffer from %X to %X\n",
-                       length, target_desc->buffer.length));
+               ACPI_DEBUG_PRINT((ACPI_DB_INFO,
+                                 "Truncating source buffer from %X to %X\n",
+                                 length, target_desc->buffer.length));
        }
 
        /* Copy flags */
 
        target_desc->buffer.flags = source_desc->buffer.flags;
-       return_ACPI_STATUS (AE_OK);
+       target_desc->common.flags &= ~AOPOBJ_STATIC_POINTER;
+       return_ACPI_STATUS(AE_OK);
 }
 
-
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ex_store_string_to_string
@@ -139,21 +152,17 @@ acpi_ex_store_buffer_to_buffer (
  ******************************************************************************/
 
 acpi_status
-acpi_ex_store_string_to_string (
-       union acpi_operand_object       *source_desc,
-       union acpi_operand_object       *target_desc)
+acpi_ex_store_string_to_string(union acpi_operand_object *source_desc,
+                              union acpi_operand_object *target_desc)
 {
-       u32                             length;
-       u8                              *buffer;
-
+       u32 length;
+       u8 *buffer;
 
-       ACPI_FUNCTION_TRACE_PTR ("ex_store_string_to_string", source_desc);
+       ACPI_FUNCTION_TRACE_PTR(ex_store_string_to_string, source_desc);
 
+       /* We know that source_desc is a string by now */
 
-       /*
-        * We know that source_desc is a string by now.
-        */
-       buffer = (u8 *) source_desc->string.pointer;
+       buffer = ACPI_CAST_PTR(u8, source_desc->string.pointer);
        length = source_desc->string.length;
 
        /*
@@ -161,40 +170,39 @@ acpi_ex_store_string_to_string (
         * pointer is not a static pointer (part of an ACPI table)
         */
        if ((length < target_desc->string.length) &&
-          (!(target_desc->common.flags & AOPOBJ_STATIC_POINTER))) {
+           (!(target_desc->common.flags & AOPOBJ_STATIC_POINTER))) {
                /*
                 * String will fit in existing non-static buffer.
                 * Clear old string and copy in the new one
                 */
-               ACPI_MEMSET (target_desc->string.pointer, 0, (acpi_size) target_desc->string.length + 1);
-               ACPI_MEMCPY (target_desc->string.pointer, buffer, length);
-       }
-       else {
+               ACPI_MEMSET(target_desc->string.pointer, 0,
+                           (acpi_size) target_desc->string.length + 1);
+               ACPI_MEMCPY(target_desc->string.pointer, buffer, length);
+       else {
                /*
                 * Free the current buffer, then allocate a new buffer
                 * large enough to hold the value
                 */
                if (target_desc->string.pointer &&
-                  (!(target_desc->common.flags & AOPOBJ_STATIC_POINTER))) {
-                       /*
-                        * Only free if not a pointer into the DSDT
-                        */
-                       ACPI_MEM_FREE (target_desc->string.pointer);
+                   (!(target_desc->common.flags & AOPOBJ_STATIC_POINTER))) {
+
+                       /* Only free if not a pointer into the DSDT */
+
+                       ACPI_FREE(target_desc->string.pointer);
                }
 
-               target_desc->string.pointer = ACPI_MEM_CALLOCATE ((acpi_size) length + 1);
+               target_desc->string.pointer = ACPI_ALLOCATE_ZEROED((acpi_size)
+                                                                  length + 1);
                if (!target_desc->string.pointer) {
-                       return_ACPI_STATUS (AE_NO_MEMORY);
+                       return_ACPI_STATUS(AE_NO_MEMORY);
                }
 
                target_desc->common.flags &= ~AOPOBJ_STATIC_POINTER;
-               ACPI_MEMCPY (target_desc->string.pointer, buffer, length);
+               ACPI_MEMCPY(target_desc->string.pointer, buffer, length);
        }
 
        /* Set the new target length */
 
        target_desc->string.length = length;
-       return_ACPI_STATUS (AE_OK);
+       return_ACPI_STATUS(AE_OK);
 }
-
-