fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / acpi / utilities / utmisc.c
index 9efcb99..6d8a821 100644 (file)
@@ -5,7 +5,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 <linux/module.h>
 
 #include <acpi/acpi.h>
 #include <acpi/acnamesp.h>
 
-
 #define _COMPONENT          ACPI_UTILITIES
-        ACPI_MODULE_NAME    ("utmisc")
+ACPI_MODULE_NAME("utmisc")
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ut_is_aml_table
+ *
+ * PARAMETERS:  Table               - An ACPI table
+ *
+ * RETURN:      TRUE if table contains executable AML; FALSE otherwise
+ *
+ * DESCRIPTION: Check ACPI Signature for a table that contains AML code.
+ *              Currently, these are DSDT,SSDT,PSDT. All other table types are
+ *              data tables that do not contain AML code.
+ *
+ ******************************************************************************/
+u8 acpi_ut_is_aml_table(struct acpi_table_header *table)
+{
+
+       /* These are the only tables that contain executable AML */
+
+       if (ACPI_COMPARE_NAME(table->signature, DSDT_SIG) ||
+           ACPI_COMPARE_NAME(table->signature, PSDT_SIG) ||
+           ACPI_COMPARE_NAME(table->signature, SSDT_SIG)) {
+               return (TRUE);
+       }
+
+       return (FALSE);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ut_allocate_owner_id
+ *
+ * PARAMETERS:  owner_id        - Where the new owner ID is returned
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Allocate a table or method owner ID. The owner ID is used to
+ *              track objects created by the table or method, to be deleted
+ *              when the method exits or the table is unloaded.
+ *
+ ******************************************************************************/
+
+acpi_status acpi_ut_allocate_owner_id(acpi_owner_id * owner_id)
+{
+       acpi_native_uint i;
+       acpi_native_uint j;
+       acpi_native_uint k;
+       acpi_status status;
+
+       ACPI_FUNCTION_TRACE(ut_allocate_owner_id);
+
+       /* Guard against multiple allocations of ID to the same location */
+
+       if (*owner_id) {
+               ACPI_ERROR((AE_INFO, "Owner ID [%2.2X] already exists",
+                           *owner_id));
+               return_ACPI_STATUS(AE_ALREADY_EXISTS);
+       }
+
+       /* Mutex for the global ID mask */
+
+       status = acpi_ut_acquire_mutex(ACPI_MTX_CACHES);
+       if (ACPI_FAILURE(status)) {
+               return_ACPI_STATUS(status);
+       }
+
+       /*
+        * Find a free owner ID, cycle through all possible IDs on repeated
+        * allocations. (ACPI_NUM_OWNERID_MASKS + 1) because first index may have
+        * to be scanned twice.
+        */
+       for (i = 0, j = acpi_gbl_last_owner_id_index;
+            i < (ACPI_NUM_OWNERID_MASKS + 1); i++, j++) {
+               if (j >= ACPI_NUM_OWNERID_MASKS) {
+                       j = 0;  /* Wraparound to start of mask array */
+               }
+
+               for (k = acpi_gbl_next_owner_id_offset; k < 32; k++) {
+                       if (acpi_gbl_owner_id_mask[j] == ACPI_UINT32_MAX) {
+
+                               /* There are no free IDs in this mask */
+
+                               break;
+                       }
+
+                       if (!(acpi_gbl_owner_id_mask[j] & (1 << k))) {
+                               /*
+                                * Found a free ID. The actual ID is the bit index plus one,
+                                * making zero an invalid Owner ID. Save this as the last ID
+                                * allocated and update the global ID mask.
+                                */
+                               acpi_gbl_owner_id_mask[j] |= (1 << k);
+
+                               acpi_gbl_last_owner_id_index = (u8) j;
+                               acpi_gbl_next_owner_id_offset = (u8) (k + 1);
+
+                               /*
+                                * Construct encoded ID from the index and bit position
+                                *
+                                * Note: Last [j].k (bit 255) is never used and is marked
+                                * permanently allocated (prevents +1 overflow)
+                                */
+                               *owner_id =
+                                   (acpi_owner_id) ((k + 1) + ACPI_MUL_32(j));
+
+                               ACPI_DEBUG_PRINT((ACPI_DB_VALUES,
+                                                 "Allocated OwnerId: %2.2X\n",
+                                                 (unsigned int)*owner_id));
+                               goto exit;
+                       }
+               }
+
+               acpi_gbl_next_owner_id_offset = 0;
+       }
+
+       /*
+        * All owner_ids have been allocated. This typically should
+        * not happen since the IDs are reused after deallocation. The IDs are
+        * allocated upon table load (one per table) and method execution, and
+        * they are released when a table is unloaded or a method completes
+        * execution.
+        *
+        * If this error happens, there may be very deep nesting of invoked control
+        * methods, or there may be a bug where the IDs are not released.
+        */
+       status = AE_OWNER_ID_LIMIT;
+       ACPI_ERROR((AE_INFO,
+                   "Could not allocate new OwnerId (255 max), AE_OWNER_ID_LIMIT"));
+
+      exit:
+       (void)acpi_ut_release_mutex(ACPI_MTX_CACHES);
+       return_ACPI_STATUS(status);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ut_release_owner_id
+ *
+ * PARAMETERS:  owner_id_ptr        - Pointer to a previously allocated owner_iD
+ *
+ * RETURN:      None. No error is returned because we are either exiting a
+ *              control method or unloading a table. Either way, we would
+ *              ignore any error anyway.
+ *
+ * DESCRIPTION: Release a table or method owner ID.  Valid IDs are 1 - 255
+ *
+ ******************************************************************************/
+
+void acpi_ut_release_owner_id(acpi_owner_id * owner_id_ptr)
+{
+       acpi_owner_id owner_id = *owner_id_ptr;
+       acpi_status status;
+       acpi_native_uint index;
+       u32 bit;
+
+       ACPI_FUNCTION_TRACE_U32(ut_release_owner_id, owner_id);
+
+       /* Always clear the input owner_id (zero is an invalid ID) */
+
+       *owner_id_ptr = 0;
+
+       /* Zero is not a valid owner_iD */
+
+       if (owner_id == 0) {
+               ACPI_ERROR((AE_INFO, "Invalid OwnerId: %2.2X", owner_id));
+               return_VOID;
+       }
+
+       /* Mutex for the global ID mask */
+
+       status = acpi_ut_acquire_mutex(ACPI_MTX_CACHES);
+       if (ACPI_FAILURE(status)) {
+               return_VOID;
+       }
+
+       /* Normalize the ID to zero */
+
+       owner_id--;
+
+       /* Decode ID to index/offset pair */
+
+       index = ACPI_DIV_32(owner_id);
+       bit = 1 << ACPI_MOD_32(owner_id);
+
+       /* Free the owner ID only if it is valid */
+
+       if (acpi_gbl_owner_id_mask[index] & bit) {
+               acpi_gbl_owner_id_mask[index] ^= bit;
+       } else {
+               ACPI_ERROR((AE_INFO,
+                           "Release of non-allocated OwnerId: %2.2X",
+                           owner_id + 1));
+       }
+
+       (void)acpi_ut_release_mutex(ACPI_MTX_CACHES);
+       return_VOID;
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ut_strupr (strupr)
+ *
+ * PARAMETERS:  src_string      - The source string to convert
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Convert string to uppercase
+ *
+ * NOTE: This is not a POSIX function, so it appears here, not in utclib.c
+ *
+ ******************************************************************************/
+
+void acpi_ut_strupr(char *src_string)
+{
+       char *string;
+
+       ACPI_FUNCTION_ENTRY();
+
+       if (!src_string) {
+               return;
+       }
+
+       /* Walk entire string, uppercasing the letters */
+
+       for (string = src_string; *string; string++) {
+               *string = (char)ACPI_TOUPPER(*string);
+       }
 
+       return;
+}
 
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ut_print_string
  *
  * PARAMETERS:  String          - Null terminated ASCII string
+ *              max_length      - Maximum output length
  *
  * RETURN:      None
  *
  *
  ******************************************************************************/
 
-void
-acpi_ut_print_string (
-       char                            *string,
-       u8                              max_length)
+void acpi_ut_print_string(char *string, u8 max_length)
 {
-       u32                             i;
-
+       u32 i;
 
        if (!string) {
-               acpi_os_printf ("<\"NULL STRING PTR\">");
+               acpi_os_printf("<\"NULL STRING PTR\">");
                return;
        }
 
-       acpi_os_printf ("\"");
+       acpi_os_printf("\"");
        for (i = 0; string[i] && (i < max_length); i++) {
+
                /* Escape sequences */
 
                switch (string[i]) {
                case 0x07:
-                       acpi_os_printf ("\\a");      /* BELL */
+                       acpi_os_printf("\\a");  /* BELL */
                        break;
 
                case 0x08:
-                       acpi_os_printf ("\\b");     /* BACKSPACE */
+                       acpi_os_printf("\\b");  /* BACKSPACE */
                        break;
 
                case 0x0C:
-                       acpi_os_printf ("\\f");     /* FORMFEED */
+                       acpi_os_printf("\\f");  /* FORMFEED */
                        break;
 
                case 0x0A:
-                       acpi_os_printf ("\\n");     /* LINEFEED */
+                       acpi_os_printf("\\n");  /* LINEFEED */
                        break;
 
                case 0x0D:
-                       acpi_os_printf ("\\r");     /* CARRIAGE RETURN*/
+                       acpi_os_printf("\\r");  /* CARRIAGE RETURN */
                        break;
 
                case 0x09:
-                       acpi_os_printf ("\\t");     /* HORIZONTAL TAB */
+                       acpi_os_printf("\\t");  /* HORIZONTAL TAB */
                        break;
 
                case 0x0B:
-                       acpi_os_printf ("\\v");     /* VERTICAL TAB */
+                       acpi_os_printf("\\v");  /* VERTICAL TAB */
                        break;
 
-               case '\'':                      /* Single Quote */
-               case '\"':                      /* Double Quote */
-               case '\\':                      /* Backslash */
-                       acpi_os_printf ("\\%c", (int) string[i]);
+               case '\'':      /* Single Quote */
+               case '\"':      /* Double Quote */
+               case '\\':      /* Backslash */
+                       acpi_os_printf("\\%c", (int)string[i]);
                        break;
 
                default:
 
                        /* Check for printable character or hex escape */
 
-                       if (ACPI_IS_PRINT (string[i]))
-                       {
+                       if (ACPI_IS_PRINT(string[i])) {
                                /* This is a normal character */
 
-                               acpi_os_printf ("%c", (int) string[i]);
-                       }
-                       else
-                       {
+                               acpi_os_printf("%c", (int)string[i]);
+                       } else {
                                /* All others will be Hex escapes */
 
-                               acpi_os_printf ("\\x%2.2X", (s32) string[i]);
+                               acpi_os_printf("\\x%2.2X", (s32) string[i]);
                        }
                        break;
                }
        }
-       acpi_os_printf ("\"");
+       acpi_os_printf("\"");
 
        if (i == max_length && string[i]) {
-               acpi_os_printf ("...");
+               acpi_os_printf("...");
        }
 }
 
-
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ut_dword_byte_swap
  *
  * PARAMETERS:  Value           - Value to be converted
  *
+ * RETURN:      u32 integer with bytes swapped
+ *
  * DESCRIPTION: Convert a 32-bit value to big-endian (swap the bytes)
  *
  ******************************************************************************/
 
-u32
-acpi_ut_dword_byte_swap (
-       u32                             value)
+u32 acpi_ut_dword_byte_swap(u32 value)
 {
        union {
-               u32                         value;
-               u8                          bytes[4];
+               u32 value;
+               u8 bytes[4];
        } out;
-
        union {
-               u32                         value;
-               u8                          bytes[4];
+               u32 value;
+               u8 bytes[4];
        } in;
 
-
-       ACPI_FUNCTION_ENTRY ();
-
+       ACPI_FUNCTION_ENTRY();
 
        in.value = value;
 
@@ -180,7 +400,6 @@ acpi_ut_dword_byte_swap (
        return (out.value);
 }
 
-
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ut_set_integer_width
@@ -196,30 +415,32 @@ acpi_ut_dword_byte_swap (
  *
  ******************************************************************************/
 
-void
-acpi_ut_set_integer_width (
-       u8                              revision)
+void acpi_ut_set_integer_width(u8 revision)
 {
 
        if (revision <= 1) {
+
+               /* 32-bit case */
+
                acpi_gbl_integer_bit_width = 32;
                acpi_gbl_integer_nybble_width = 8;
                acpi_gbl_integer_byte_width = 4;
-       }
-       else {
+       } else {
+               /* 64-bit case (ACPI 2.0+) */
+
                acpi_gbl_integer_bit_width = 64;
                acpi_gbl_integer_nybble_width = 16;
                acpi_gbl_integer_byte_width = 8;
        }
 }
 
-
 #ifdef ACPI_DEBUG_OUTPUT
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ut_display_init_pathname
  *
- * PARAMETERS:  obj_handle          - Handle whose pathname will be displayed
+ * PARAMETERS:  Type                - Object type of the node
+ *              obj_handle          - Handle whose pathname will be displayed
  *              Path                - Additional path string to be appended.
  *                                      (NULL if no extra path)
  *
@@ -230,17 +451,14 @@ acpi_ut_set_integer_width (
  ******************************************************************************/
 
 void
-acpi_ut_display_init_pathname (
-       u8                              type,
-       struct acpi_namespace_node      *obj_handle,
-       char                            *path)
+acpi_ut_display_init_pathname(u8 type,
+                             struct acpi_namespace_node *obj_handle,
+                             char *path)
 {
-       acpi_status                     status;
-       struct acpi_buffer              buffer;
-
-
-       ACPI_FUNCTION_ENTRY ();
+       acpi_status status;
+       struct acpi_buffer buffer;
 
+       ACPI_FUNCTION_ENTRY();
 
        /* Only print the path if the appropriate debug level is enabled */
 
@@ -251,8 +469,8 @@ acpi_ut_display_init_pathname (
        /* Get the full pathname to the node */
 
        buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
-       status = acpi_ns_handle_to_pathname (obj_handle, &buffer);
-       if (ACPI_FAILURE (status)) {
+       status = acpi_ns_handle_to_pathname(obj_handle, &buffer);
+       if (ACPI_FAILURE(status)) {
                return;
        }
 
@@ -260,37 +478,73 @@ acpi_ut_display_init_pathname (
 
        switch (type) {
        case ACPI_TYPE_METHOD:
-               acpi_os_printf ("Executing  ");
+               acpi_os_printf("Executing  ");
                break;
 
        default:
-               acpi_os_printf ("Initializing ");
+               acpi_os_printf("Initializing ");
                break;
        }
 
        /* Print the object type and pathname */
 
-       acpi_os_printf ("%-12s %s", acpi_ut_get_type_name (type), (char *) buffer.pointer);
+       acpi_os_printf("%-12s %s",
+                      acpi_ut_get_type_name(type), (char *)buffer.pointer);
 
        /* Extra path is used to append names like _STA, _INI, etc. */
 
        if (path) {
-               acpi_os_printf (".%s", path);
+               acpi_os_printf(".%s", path);
        }
-       acpi_os_printf ("\n");
+       acpi_os_printf("\n");
 
-       ACPI_MEM_FREE (buffer.pointer);
+       ACPI_FREE(buffer.pointer);
 }
 #endif
 
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ut_valid_acpi_char
+ *
+ * PARAMETERS:  Char            - The character to be examined
+ *              Position        - Byte position (0-3)
+ *
+ * RETURN:      TRUE if the character is valid, FALSE otherwise
+ *
+ * DESCRIPTION: Check for a valid ACPI character. Must be one of:
+ *              1) Upper case alpha
+ *              2) numeric
+ *              3) underscore
+ *
+ *              We allow a '!' as the last character because of the ASF! table
+ *
+ ******************************************************************************/
+
+u8 acpi_ut_valid_acpi_char(char character, acpi_native_uint position)
+{
+
+       if (!((character >= 'A' && character <= 'Z') ||
+             (character >= '0' && character <= '9') || (character == '_'))) {
+
+               /* Allow a '!' in the last position */
+
+               if (character == '!' && position == 3) {
+                       return (TRUE);
+               }
+
+               return (FALSE);
+       }
+
+       return (TRUE);
+}
 
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ut_valid_acpi_name
  *
- * PARAMETERS:  Character           - The character to be examined
+ * PARAMETERS:  Name            - The name to be examined
  *
- * RETURN:      1 if Character may appear in a name, else 0
+ * RETURN:      TRUE if the name is valid, FALSE otherwise
  *
  * DESCRIPTION: Check for a valid ACPI name.  Each character must be one of:
  *              1) Upper case alpha
@@ -299,25 +553,15 @@ acpi_ut_display_init_pathname (
  *
  ******************************************************************************/
 
-u8
-acpi_ut_valid_acpi_name (
-       u32                             name)
+u8 acpi_ut_valid_acpi_name(u32 name)
 {
-       char                            *name_ptr = (char *) &name;
-       char                            character;
-       acpi_native_uint                i;
-
-
-       ACPI_FUNCTION_ENTRY ();
+       acpi_native_uint i;
 
+       ACPI_FUNCTION_ENTRY();
 
        for (i = 0; i < ACPI_NAME_SIZE; i++) {
-               character = *name_ptr;
-               name_ptr++;
-
-               if (!((character == '_') ||
-                         (character >= 'A' && character <= 'Z') ||
-                         (character >= '0' && character <= '9'))) {
+               if (!acpi_ut_valid_acpi_char
+                   ((ACPI_CAST_PTR(char, &name))[i], i)) {
                        return (FALSE);
                }
        }
@@ -325,952 +569,295 @@ acpi_ut_valid_acpi_name (
        return (TRUE);
 }
 
-
 /*******************************************************************************
  *
- * FUNCTION:    acpi_ut_valid_acpi_character
+ * FUNCTION:    acpi_ut_repair_name
  *
- * PARAMETERS:  Character           - The character to be examined
+ * PARAMETERS:  Name            - The ACPI name to be repaired
  *
- * RETURN:      1 if Character may appear in a name, else 0
+ * RETURN:      Repaired version of the name
  *
- * DESCRIPTION: Check for a printable character
+ * DESCRIPTION: Repair an ACPI name: Change invalid characters to '*' and
+ *              return the new name.
  *
  ******************************************************************************/
 
-u8
-acpi_ut_valid_acpi_character (
-       char                            character)
+acpi_name acpi_ut_repair_name(acpi_name name)
 {
+       char *name_ptr = ACPI_CAST_PTR(char, &name);
+       char new_name[ACPI_NAME_SIZE];
+       acpi_native_uint i;
 
-       ACPI_FUNCTION_ENTRY ();
+       for (i = 0; i < ACPI_NAME_SIZE; i++) {
+               new_name[i] = name_ptr[i];
 
-       return ((u8)   ((character == '_') ||
-                          (character >= 'A' && character <= 'Z') ||
-                          (character >= '0' && character <= '9')));
-}
+               /*
+                * Replace a bad character with something printable, yet technically
+                * still invalid. This prevents any collisions with existing "good"
+                * names in the namespace.
+                */
+               if (!acpi_ut_valid_acpi_char(name_ptr[i], i)) {
+                       new_name[i] = '*';
+               }
+       }
 
+       return (*ACPI_CAST_PTR(u32, new_name));
+}
 
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ut_strtoul64
  *
  * PARAMETERS:  String          - Null terminated string
- *              Terminater      - Where a pointer to the terminating byte is returned
- *              Base            - Radix of the string
+ *              Base            - Radix of the string: 16 or ACPI_ANY_BASE;
+ *                                ACPI_ANY_BASE means 'in behalf of to_integer'
+ *              ret_integer     - Where the converted integer is returned
  *
- * RETURN:      Converted value
+ * RETURN:      Status and Converted value
  *
- * DESCRIPTION: Convert a string into an unsigned value.
+ * DESCRIPTION: Convert a string into an unsigned value. Performs either a
+ *              32-bit or 64-bit conversion, depending on the current mode
+ *              of the interpreter.
+ *              NOTE: Does not support Octal strings, not needed.
  *
  ******************************************************************************/
-#define NEGATIVE    1
-#define POSITIVE    0
 
 acpi_status
-acpi_ut_strtoul64 (
-       char                            *string,
-       u32                             base,
-       acpi_integer                    *ret_integer)
+acpi_ut_strtoul64(char *string, u32 base, acpi_integer * ret_integer)
 {
-       u32                             index;
-       acpi_integer                    return_value = 0;
-       acpi_status                     status = AE_OK;
-       acpi_integer                    dividend;
-       acpi_integer                    quotient;
-
-
-       *ret_integer = 0;
+       u32 this_digit = 0;
+       acpi_integer return_value = 0;
+       acpi_integer quotient;
+       acpi_integer dividend;
+       u32 to_integer_op = (base == ACPI_ANY_BASE);
+       u32 mode32 = (acpi_gbl_integer_byte_width == 4);
+       u8 valid_digits = 0;
+       u8 sign_of0x = 0;
+       u8 term = 0;
+
+       ACPI_FUNCTION_TRACE_STR(ut_stroul64, string);
 
        switch (base) {
-       case 0:
-       case 8:
-       case 10:
+       case ACPI_ANY_BASE:
        case 16:
                break;
 
        default:
-               /*
-                * The specified Base parameter is not in the domain of
-                * this function:
-                */
-               return (AE_BAD_PARAMETER);
+               /* Invalid Base */
+               return_ACPI_STATUS(AE_BAD_PARAMETER);
        }
 
-       /*
-        * skip over any white space in the buffer:
-        */
-       while (ACPI_IS_SPACE (*string) || *string == '\t') {
-               ++string;
+       if (!string) {
+               goto error_exit;
        }
 
-       /*
-        * If the input parameter Base is zero, then we need to
-        * determine if it is octal, decimal, or hexadecimal:
-        */
-       if (base == 0) {
-               if (*string == '0') {
-                       if (ACPI_TOLOWER (*(++string)) == 'x') {
-                               base = 16;
-                               ++string;
-                       }
-                       else {
-                               base = 8;
-                       }
-               }
-               else {
+       /* Skip over any white space in the buffer */
+
+       while ((*string) && (ACPI_IS_SPACE(*string) || *string == '\t')) {
+               string++;
+       }
+
+       if (to_integer_op) {
+               /*
+                * Base equal to ACPI_ANY_BASE means 'to_integer operation case'.
+                * We need to determine if it is decimal or hexadecimal.
+                */
+               if ((*string == '0') && (ACPI_TOLOWER(*(string + 1)) == 'x')) {
+                       sign_of0x = 1;
+                       base = 16;
+
+                       /* Skip over the leading '0x' */
+                       string += 2;
+               } else {
                        base = 10;
                }
        }
 
-       /*
-        * For octal and hexadecimal bases, skip over the leading
-        * 0 or 0x, if they are present.
-        */
-       if (base == 8 && *string == '0') {
-               string++;
-       }
+       /* Any string left? Check that '0x' is not followed by white space. */
 
-       if (base == 16 &&
-               *string == '0' &&
-               ACPI_TOLOWER (*(++string)) == 'x') {
-               string++;
+       if (!(*string) || ACPI_IS_SPACE(*string) || *string == '\t') {
+               if (to_integer_op) {
+                       goto error_exit;
+               } else {
+                       goto all_done;
+               }
        }
 
-       /* Main loop: convert the string to an unsigned long */
+       /*
+        * Perform a 32-bit or 64-bit conversion, depending upon the current
+        * execution mode of the interpreter
+        */
+       dividend = (mode32) ? ACPI_UINT32_MAX : ACPI_UINT64_MAX;
+
+       /* Main loop: convert the string to a 32- or 64-bit integer */
 
        while (*string) {
-               if (ACPI_IS_DIGIT (*string)) {
-                       index = ((u8) *string) - '0';
-               }
-               else {
-                       index = (u8) ACPI_TOUPPER (*string);
-                       if (ACPI_IS_UPPER ((char) index)) {
-                               index = index - 'A' + 10;
+               if (ACPI_IS_DIGIT(*string)) {
+
+                       /* Convert ASCII 0-9 to Decimal value */
+
+                       this_digit = ((u8) * string) - '0';
+               } else if (base == 10) {
+
+                       /* Digit is out of range; possible in to_integer case only */
+
+                       term = 1;
+               } else {
+                       this_digit = (u8) ACPI_TOUPPER(*string);
+                       if (ACPI_IS_XDIGIT((char)this_digit)) {
+
+                               /* Convert ASCII Hex char to value */
+
+                               this_digit = this_digit - 'A' + 10;
+                       } else {
+                               term = 1;
                        }
-                       else {
+               }
+
+               if (term) {
+                       if (to_integer_op) {
                                goto error_exit;
+                       } else {
+                               break;
                        }
+               } else if ((valid_digits == 0) && (this_digit == 0)
+                          && !sign_of0x) {
+
+                       /* Skip zeros */
+                       string++;
+                       continue;
                }
 
-               if (index >= base) {
+               valid_digits++;
+
+               if (sign_of0x
+                   && ((valid_digits > 16)
+                       || ((valid_digits > 8) && mode32))) {
+                       /*
+                        * This is to_integer operation case.
+                        * No any restrictions for string-to-integer conversion,
+                        * see ACPI spec.
+                        */
                        goto error_exit;
                }
 
-               /* Check to see if value is out of range: */
+               /* Divide the digit into the correct position */
+
+               (void)
+                   acpi_ut_short_divide((dividend - (acpi_integer) this_digit),
+                                        base, &quotient, NULL);
 
-               dividend = ACPI_INTEGER_MAX - (acpi_integer) index;
-               (void) acpi_ut_short_divide (&dividend, base, &quotient, NULL);
                if (return_value > quotient) {
-                       goto error_exit;
+                       if (to_integer_op) {
+                               goto error_exit;
+                       } else {
+                               break;
+                       }
                }
 
                return_value *= base;
-               return_value += index;
-               ++string;
+               return_value += this_digit;
+               string++;
        }
 
-       *ret_integer = return_value;
-       return (status);
+       /* All done, normal exit */
 
+      all_done:
 
-error_exit:
-       switch (base) {
-       case 8:
-               status = AE_BAD_OCTAL_CONSTANT;
-               break;
+       ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Converted value: %8.8X%8.8X\n",
+                         ACPI_FORMAT_UINT64(return_value)));
 
-       case 10:
-               status = AE_BAD_DECIMAL_CONSTANT;
-               break;
+       *ret_integer = return_value;
+       return_ACPI_STATUS(AE_OK);
 
-       case 16:
-               status = AE_BAD_HEX_CONSTANT;
-               break;
+      error_exit:
+       /* Base was set/validated above */
 
-       default:
-               /* Base validated above */
-               break;
+       if (base == 10) {
+               return_ACPI_STATUS(AE_BAD_DECIMAL_CONSTANT);
+       } else {
+               return_ACPI_STATUS(AE_BAD_HEX_CONSTANT);
        }
-
-       return (status);
 }
 
-
 /*******************************************************************************
  *
- * FUNCTION:    acpi_ut_strupr
+ * FUNCTION:    acpi_ut_create_update_state_and_push
  *
- * PARAMETERS:  src_string      - The source string to convert to
+ * PARAMETERS:  Object          - Object to be added to the new state
+ *              Action          - Increment/Decrement
+ *              state_list      - List the state will be added to
  *
- * RETURN:      src_string
+ * RETURN:      Status
  *
- * DESCRIPTION: Convert string to uppercase
+ * DESCRIPTION: Create a new state and push it
  *
  ******************************************************************************/
 
-char *
-acpi_ut_strupr (
-       char                            *src_string)
+acpi_status
+acpi_ut_create_update_state_and_push(union acpi_operand_object *object,
+                                    u16 action,
+                                    union acpi_generic_state **state_list)
 {
-       char                            *string;
+       union acpi_generic_state *state;
 
+       ACPI_FUNCTION_ENTRY();
 
-       ACPI_FUNCTION_ENTRY ();
-
+       /* Ignore null objects; these are expected */
 
-       /* Walk entire string, uppercasing the letters */
+       if (!object) {
+               return (AE_OK);
+       }
 
-       for (string = src_string; *string; ) {
-               *string = (char) ACPI_TOUPPER (*string);
-               string++;
+       state = acpi_ut_create_update_state(object, action);
+       if (!state) {
+               return (AE_NO_MEMORY);
        }
 
-       return (src_string);
+       acpi_ut_push_generic_state(state_list, state);
+       return (AE_OK);
 }
 
-
 /*******************************************************************************
  *
- * FUNCTION:    acpi_ut_mutex_initialize
+ * FUNCTION:    acpi_ut_walk_package_tree
  *
- * PARAMETERS:  None.
+ * PARAMETERS:  source_object       - The package to walk
+ *              target_object       - Target object (if package is being copied)
+ *              walk_callback       - Called once for each package element
+ *              Context             - Passed to the callback function
  *
  * RETURN:      Status
  *
- * DESCRIPTION: Create the system mutex objects.
+ * DESCRIPTION: Walk through a package
  *
  ******************************************************************************/
 
 acpi_status
-acpi_ut_mutex_initialize (
-       void)
+acpi_ut_walk_package_tree(union acpi_operand_object * source_object,
+                         void *target_object,
+                         acpi_pkg_callback walk_callback, void *context)
 {
-       u32                             i;
-       acpi_status                     status;
-
+       acpi_status status = AE_OK;
+       union acpi_generic_state *state_list = NULL;
+       union acpi_generic_state *state;
+       u32 this_index;
+       union acpi_operand_object *this_source_obj;
 
-       ACPI_FUNCTION_TRACE ("ut_mutex_initialize");
+       ACPI_FUNCTION_TRACE(ut_walk_package_tree);
 
-
-       /*
-        * Create each of the predefined mutex objects
-        */
-       for (i = 0; i < NUM_MUTEX; i++) {
-               status = acpi_ut_create_mutex (i);
-               if (ACPI_FAILURE (status)) {
-                       return_ACPI_STATUS (status);
-               }
+       state = acpi_ut_create_pkg_state(source_object, target_object, 0);
+       if (!state) {
+               return_ACPI_STATUS(AE_NO_MEMORY);
        }
 
-       status = acpi_os_create_lock (&acpi_gbl_gpe_lock);
-       return_ACPI_STATUS (status);
-}
+       while (state) {
 
+               /* Get one element of the package */
 
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_mutex_terminate
- *
- * PARAMETERS:  None.
- *
- * RETURN:      None.
- *
- * DESCRIPTION: Delete all of the system mutex objects.
- *
- ******************************************************************************/
-
-void
-acpi_ut_mutex_terminate (
-       void)
-{
-       u32                             i;
-
-
-       ACPI_FUNCTION_TRACE ("ut_mutex_terminate");
-
-
-       /*
-        * Delete each predefined mutex object
-        */
-       for (i = 0; i < NUM_MUTEX; i++) {
-               (void) acpi_ut_delete_mutex (i);
-       }
-
-       acpi_os_delete_lock (acpi_gbl_gpe_lock);
-       return_VOID;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_create_mutex
- *
- * PARAMETERS:  mutex_iD        - ID of the mutex to be created
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Create a mutex object.
- *
- ******************************************************************************/
-
-acpi_status
-acpi_ut_create_mutex (
-       acpi_mutex_handle               mutex_id)
-{
-       acpi_status                     status = AE_OK;
-
-
-       ACPI_FUNCTION_TRACE_U32 ("ut_create_mutex", mutex_id);
-
-
-       if (mutex_id > MAX_MUTEX) {
-               return_ACPI_STATUS (AE_BAD_PARAMETER);
-       }
-
-       if (!acpi_gbl_mutex_info[mutex_id].mutex) {
-               status = acpi_os_create_semaphore (1, 1,
-                                 &acpi_gbl_mutex_info[mutex_id].mutex);
-               acpi_gbl_mutex_info[mutex_id].owner_id = ACPI_MUTEX_NOT_ACQUIRED;
-               acpi_gbl_mutex_info[mutex_id].use_count = 0;
-       }
-
-       return_ACPI_STATUS (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_delete_mutex
- *
- * PARAMETERS:  mutex_iD        - ID of the mutex to be deleted
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Delete a mutex object.
- *
- ******************************************************************************/
-
-acpi_status
-acpi_ut_delete_mutex (
-       acpi_mutex_handle               mutex_id)
-{
-       acpi_status                     status;
-
-
-       ACPI_FUNCTION_TRACE_U32 ("ut_delete_mutex", mutex_id);
-
-
-       if (mutex_id > MAX_MUTEX) {
-               return_ACPI_STATUS (AE_BAD_PARAMETER);
-       }
-
-       status = acpi_os_delete_semaphore (acpi_gbl_mutex_info[mutex_id].mutex);
-
-       acpi_gbl_mutex_info[mutex_id].mutex = NULL;
-       acpi_gbl_mutex_info[mutex_id].owner_id = ACPI_MUTEX_NOT_ACQUIRED;
-
-       return_ACPI_STATUS (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_acquire_mutex
- *
- * PARAMETERS:  mutex_iD        - ID of the mutex to be acquired
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Acquire a mutex object.
- *
- ******************************************************************************/
-
-acpi_status
-acpi_ut_acquire_mutex (
-       acpi_mutex_handle               mutex_id)
-{
-       acpi_status                     status;
-       u32                             i;
-       u32                             this_thread_id;
-
-
-       ACPI_FUNCTION_NAME ("ut_acquire_mutex");
-
-
-       if (mutex_id > MAX_MUTEX) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       this_thread_id = acpi_os_get_thread_id ();
-
-       /*
-        * Deadlock prevention.  Check if this thread owns any mutexes of value
-        * greater than or equal to this one.  If so, the thread has violated
-        * the mutex ordering rule.  This indicates a coding error somewhere in
-        * the ACPI subsystem code.
-        */
-       for (i = mutex_id; i < MAX_MUTEX; i++) {
-               if (acpi_gbl_mutex_info[i].owner_id == this_thread_id) {
-                       if (i == mutex_id) {
-                               ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
-                                               "Mutex [%s] already acquired by this thread [%X]\n",
-                                               acpi_ut_get_mutex_name (mutex_id), this_thread_id));
-
-                               return (AE_ALREADY_ACQUIRED);
-                       }
-
-                       ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
-                                       "Invalid acquire order: Thread %X owns [%s], wants [%s]\n",
-                                       this_thread_id, acpi_ut_get_mutex_name (i),
-                                       acpi_ut_get_mutex_name (mutex_id)));
-
-                       return (AE_ACQUIRE_DEADLOCK);
-               }
-       }
-
-       ACPI_DEBUG_PRINT ((ACPI_DB_MUTEX,
-                        "Thread %X attempting to acquire Mutex [%s]\n",
-                        this_thread_id, acpi_ut_get_mutex_name (mutex_id)));
-
-       status = acpi_os_wait_semaphore (acpi_gbl_mutex_info[mutex_id].mutex,
-                          1, ACPI_WAIT_FOREVER);
-       if (ACPI_SUCCESS (status)) {
-               ACPI_DEBUG_PRINT ((ACPI_DB_MUTEX, "Thread %X acquired Mutex [%s]\n",
-                                this_thread_id, acpi_ut_get_mutex_name (mutex_id)));
-
-               acpi_gbl_mutex_info[mutex_id].use_count++;
-               acpi_gbl_mutex_info[mutex_id].owner_id = this_thread_id;
-       }
-       else {
-               ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Thread %X could not acquire Mutex [%s] %s\n",
-                                this_thread_id, acpi_ut_get_mutex_name (mutex_id),
-                                acpi_format_exception (status)));
-       }
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_release_mutex
- *
- * PARAMETERS:  mutex_iD        - ID of the mutex to be released
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Release a mutex object.
- *
- ******************************************************************************/
-
-acpi_status
-acpi_ut_release_mutex (
-       acpi_mutex_handle               mutex_id)
-{
-       acpi_status                     status;
-       u32                             i;
-       u32                             this_thread_id;
-
-
-       ACPI_FUNCTION_NAME ("ut_release_mutex");
-
-
-       this_thread_id = acpi_os_get_thread_id ();
-       ACPI_DEBUG_PRINT ((ACPI_DB_MUTEX,
-               "Thread %X releasing Mutex [%s]\n", this_thread_id,
-               acpi_ut_get_mutex_name (mutex_id)));
-
-       if (mutex_id > MAX_MUTEX) {
-               return (AE_BAD_PARAMETER);
-       }
-
-       /*
-        * Mutex must be acquired in order to release it!
-        */
-       if (acpi_gbl_mutex_info[mutex_id].owner_id == ACPI_MUTEX_NOT_ACQUIRED) {
-               ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
-                               "Mutex [%s] is not acquired, cannot release\n",
-                               acpi_ut_get_mutex_name (mutex_id)));
-
-               return (AE_NOT_ACQUIRED);
-       }
-
-       /*
-        * Deadlock prevention.  Check if this thread owns any mutexes of value
-        * greater than this one.  If so, the thread has violated the mutex
-        * ordering rule.  This indicates a coding error somewhere in
-        * the ACPI subsystem code.
-        */
-       for (i = mutex_id; i < MAX_MUTEX; i++) {
-               if (acpi_gbl_mutex_info[i].owner_id == this_thread_id) {
-                       if (i == mutex_id) {
-                               continue;
-                       }
-
-                       ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
-                                       "Invalid release order: owns [%s], releasing [%s]\n",
-                                       acpi_ut_get_mutex_name (i), acpi_ut_get_mutex_name (mutex_id)));
-
-                       return (AE_RELEASE_DEADLOCK);
-               }
-       }
-
-       /* Mark unlocked FIRST */
-
-       acpi_gbl_mutex_info[mutex_id].owner_id = ACPI_MUTEX_NOT_ACQUIRED;
-
-       status = acpi_os_signal_semaphore (acpi_gbl_mutex_info[mutex_id].mutex, 1);
-
-       if (ACPI_FAILURE (status)) {
-               ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Thread %X could not release Mutex [%s] %s\n",
-                                this_thread_id, acpi_ut_get_mutex_name (mutex_id),
-                                acpi_format_exception (status)));
-       }
-       else {
-               ACPI_DEBUG_PRINT ((ACPI_DB_MUTEX, "Thread %X released Mutex [%s]\n",
-                                this_thread_id, acpi_ut_get_mutex_name (mutex_id)));
-       }
-
-       return (status);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_create_update_state_and_push
- *
- * PARAMETERS:  *Object         - Object to be added to the new state
- *              Action          - Increment/Decrement
- *              state_list      - List the state will be added to
- *
- * RETURN:      None
- *
- * DESCRIPTION: Create a new state and push it
- *
- ******************************************************************************/
-
-acpi_status
-acpi_ut_create_update_state_and_push (
-       union acpi_operand_object       *object,
-       u16                             action,
-       union acpi_generic_state        **state_list)
-{
-       union acpi_generic_state         *state;
-
-
-       ACPI_FUNCTION_ENTRY ();
-
-
-       /* Ignore null objects; these are expected */
-
-       if (!object) {
-               return (AE_OK);
-       }
-
-       state = acpi_ut_create_update_state (object, action);
-       if (!state) {
-               return (AE_NO_MEMORY);
-       }
-
-       acpi_ut_push_generic_state (state_list, state);
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_create_pkg_state_and_push
- *
- * PARAMETERS:  *Object         - Object to be added to the new state
- *              Action          - Increment/Decrement
- *              state_list      - List the state will be added to
- *
- * RETURN:      None
- *
- * DESCRIPTION: Create a new state and push it
- *
- ******************************************************************************/
-
-acpi_status
-acpi_ut_create_pkg_state_and_push (
-       void                            *internal_object,
-       void                            *external_object,
-       u16                             index,
-       union acpi_generic_state        **state_list)
-{
-       union acpi_generic_state         *state;
-
-
-       ACPI_FUNCTION_ENTRY ();
-
-
-       state = acpi_ut_create_pkg_state (internal_object, external_object, index);
-       if (!state) {
-               return (AE_NO_MEMORY);
-       }
-
-       acpi_ut_push_generic_state (state_list, state);
-       return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_push_generic_state
- *
- * PARAMETERS:  list_head           - Head of the state stack
- *              State               - State object to push
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Push a state object onto a state stack
- *
- ******************************************************************************/
-
-void
-acpi_ut_push_generic_state (
-       union acpi_generic_state        **list_head,
-       union acpi_generic_state        *state)
-{
-       ACPI_FUNCTION_TRACE ("ut_push_generic_state");
-
-
-       /* Push the state object onto the front of the list (stack) */
-
-       state->common.next = *list_head;
-       *list_head = state;
-
-       return_VOID;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_pop_generic_state
- *
- * PARAMETERS:  list_head           - Head of the state stack
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Pop a state object from a state stack
- *
- ******************************************************************************/
-
-union acpi_generic_state *
-acpi_ut_pop_generic_state (
-       union acpi_generic_state        **list_head)
-{
-       union acpi_generic_state        *state;
-
-
-       ACPI_FUNCTION_TRACE ("ut_pop_generic_state");
-
-
-       /* Remove the state object at the head of the list (stack) */
-
-       state = *list_head;
-       if (state) {
-               /* Update the list head */
-
-               *list_head = state->common.next;
-       }
-
-       return_PTR (state);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_create_generic_state
- *
- * PARAMETERS:  None
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Create a generic state object.  Attempt to obtain one from
- *              the global state cache;  If none available, create a new one.
- *
- ******************************************************************************/
-
-union acpi_generic_state *
-acpi_ut_create_generic_state (void)
-{
-       union acpi_generic_state        *state;
-
-
-       ACPI_FUNCTION_ENTRY ();
-
-
-       state = acpi_ut_acquire_from_cache (ACPI_MEM_LIST_STATE);
-
-       /* Initialize */
-
-       if (state) {
-               state->common.data_type = ACPI_DESC_TYPE_STATE;
-       }
-
-       return (state);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_create_thread_state
- *
- * PARAMETERS:  None
- *
- * RETURN:      Thread State
- *
- * DESCRIPTION: Create a "Thread State" - a flavor of the generic state used
- *              to track per-thread info during method execution
- *
- ******************************************************************************/
-
-struct acpi_thread_state *
-acpi_ut_create_thread_state (
-       void)
-{
-       union acpi_generic_state        *state;
-
-
-       ACPI_FUNCTION_TRACE ("ut_create_thread_state");
-
-
-       /* Create the generic state object */
-
-       state = acpi_ut_create_generic_state ();
-       if (!state) {
-               return_PTR (NULL);
-       }
-
-       /* Init fields specific to the update struct */
-
-       state->common.data_type = ACPI_DESC_TYPE_STATE_THREAD;
-       state->thread.thread_id = acpi_os_get_thread_id ();
-
-       return_PTR ((struct acpi_thread_state *) state);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_create_update_state
- *
- * PARAMETERS:  Object              - Initial Object to be installed in the
- *                                    state
- *              Action              - Update action to be performed
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Create an "Update State" - a flavor of the generic state used
- *              to update reference counts and delete complex objects such
- *              as packages.
- *
- ******************************************************************************/
-
-union acpi_generic_state *
-acpi_ut_create_update_state (
-       union acpi_operand_object       *object,
-       u16                             action)
-{
-       union acpi_generic_state        *state;
-
-
-       ACPI_FUNCTION_TRACE_PTR ("ut_create_update_state", object);
-
-
-       /* Create the generic state object */
-
-       state = acpi_ut_create_generic_state ();
-       if (!state) {
-               return_PTR (NULL);
-       }
-
-       /* Init fields specific to the update struct */
-
-       state->common.data_type = ACPI_DESC_TYPE_STATE_UPDATE;
-       state->update.object = object;
-       state->update.value  = action;
-
-       return_PTR (state);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_create_pkg_state
- *
- * PARAMETERS:  Object              - Initial Object to be installed in the
- *                                    state
- *              Action              - Update action to be performed
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Create a "Package State"
- *
- ******************************************************************************/
-
-union acpi_generic_state *
-acpi_ut_create_pkg_state (
-       void                            *internal_object,
-       void                            *external_object,
-       u16                             index)
-{
-       union acpi_generic_state        *state;
-
-
-       ACPI_FUNCTION_TRACE_PTR ("ut_create_pkg_state", internal_object);
-
-
-       /* Create the generic state object */
-
-       state = acpi_ut_create_generic_state ();
-       if (!state) {
-               return_PTR (NULL);
-       }
-
-       /* Init fields specific to the update struct */
-
-       state->common.data_type = ACPI_DESC_TYPE_STATE_PACKAGE;
-       state->pkg.source_object = (union acpi_operand_object *) internal_object;
-       state->pkg.dest_object  = external_object;
-       state->pkg.index        = index;
-       state->pkg.num_packages = 1;
-
-       return_PTR (state);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_create_control_state
- *
- * PARAMETERS:  None
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Create a "Control State" - a flavor of the generic state used
- *              to support nested IF/WHILE constructs in the AML.
- *
- ******************************************************************************/
-
-union acpi_generic_state *
-acpi_ut_create_control_state (
-       void)
-{
-       union acpi_generic_state        *state;
-
-
-       ACPI_FUNCTION_TRACE ("ut_create_control_state");
-
-
-       /* Create the generic state object */
-
-       state = acpi_ut_create_generic_state ();
-       if (!state) {
-               return_PTR (NULL);
-       }
-
-       /* Init fields specific to the control struct */
-
-       state->common.data_type = ACPI_DESC_TYPE_STATE_CONTROL;
-       state->common.state     = ACPI_CONTROL_CONDITIONAL_EXECUTING;
-
-       return_PTR (state);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_delete_generic_state
- *
- * PARAMETERS:  State               - The state object to be deleted
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Put a state object back into the global state cache.  The object
- *              is not actually freed at this time.
- *
- ******************************************************************************/
-
-void
-acpi_ut_delete_generic_state (
-       union acpi_generic_state        *state)
-{
-       ACPI_FUNCTION_TRACE ("ut_delete_generic_state");
-
-
-       acpi_ut_release_to_cache (ACPI_MEM_LIST_STATE, state);
-       return_VOID;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_delete_generic_state_cache
- *
- * PARAMETERS:  None
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Purge the global state object cache.  Used during subsystem
- *              termination.
- *
- ******************************************************************************/
-
-void
-acpi_ut_delete_generic_state_cache (
-       void)
-{
-       ACPI_FUNCTION_TRACE ("ut_delete_generic_state_cache");
-
-
-       acpi_ut_delete_generic_cache (ACPI_MEM_LIST_STATE);
-       return_VOID;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_walk_package_tree
- *
- * PARAMETERS:  obj_desc        - The Package object on which to resolve refs
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Walk through a package
- *
- ******************************************************************************/
-
-acpi_status
-acpi_ut_walk_package_tree (
-       union acpi_operand_object       *source_object,
-       void                            *target_object,
-       acpi_pkg_callback               walk_callback,
-       void                            *context)
-{
-       acpi_status                     status = AE_OK;
-       union acpi_generic_state        *state_list = NULL;
-       union acpi_generic_state        *state;
-       u32                             this_index;
-       union acpi_operand_object       *this_source_obj;
-
-
-       ACPI_FUNCTION_TRACE ("ut_walk_package_tree");
-
-
-       state = acpi_ut_create_pkg_state (source_object, target_object, 0);
-       if (!state) {
-               return_ACPI_STATUS (AE_NO_MEMORY);
-       }
-
-       while (state) {
-               /* Get one element of the package */
-
-               this_index    = state->pkg.index;
-               this_source_obj = (union acpi_operand_object *)
-                                 state->pkg.source_object->package.elements[this_index];
+               this_index = state->pkg.index;
+               this_source_obj = (union acpi_operand_object *)
+                   state->pkg.source_object->package.elements[this_index];
 
                /*
                 * Check for:
@@ -1281,16 +868,20 @@ acpi_ut_walk_package_tree (
                 *    case below.
                 */
                if ((!this_source_obj) ||
-                       (ACPI_GET_DESCRIPTOR_TYPE (this_source_obj) != ACPI_DESC_TYPE_OPERAND) ||
-                       (ACPI_GET_OBJECT_TYPE (this_source_obj) != ACPI_TYPE_PACKAGE)) {
-                       status = walk_callback (ACPI_COPY_TYPE_SIMPLE, this_source_obj,
-                                        state, context);
-                       if (ACPI_FAILURE (status)) {
-                               return_ACPI_STATUS (status);
+                   (ACPI_GET_DESCRIPTOR_TYPE(this_source_obj) !=
+                    ACPI_DESC_TYPE_OPERAND)
+                   || (ACPI_GET_OBJECT_TYPE(this_source_obj) !=
+                       ACPI_TYPE_PACKAGE)) {
+                       status =
+                           walk_callback(ACPI_COPY_TYPE_SIMPLE,
+                                         this_source_obj, state, context);
+                       if (ACPI_FAILURE(status)) {
+                               return_ACPI_STATUS(status);
                        }
 
                        state->pkg.index++;
-                       while (state->pkg.index >= state->pkg.source_object->package.count) {
+                       while (state->pkg.index >=
+                              state->pkg.source_object->package.count) {
                                /*
                                 * We've handled all of the objects at this level,  This means
                                 * that we have just completed a package.  That package may
@@ -1298,8 +889,8 @@ acpi_ut_walk_package_tree (
                                 *
                                 * Delete this state and pop the previous state (package).
                                 */
-                               acpi_ut_delete_generic_state (state);
-                               state = acpi_ut_pop_generic_state (&state_list);
+                               acpi_ut_delete_generic_state(state);
+                               state = acpi_ut_pop_generic_state(&state_list);
 
                                /* Finished when there are no more states */
 
@@ -1309,7 +900,7 @@ acpi_ut_walk_package_tree (
                                         * package just add the length of the package objects
                                         * and exit
                                         */
-                                       return_ACPI_STATUS (AE_OK);
+                                       return_ACPI_STATUS(AE_OK);
                                }
 
                                /*
@@ -1318,194 +909,96 @@ acpi_ut_walk_package_tree (
                                 */
                                state->pkg.index++;
                        }
-               }
-               else {
+               } else {
                        /* This is a subobject of type package */
 
-                       status = walk_callback (ACPI_COPY_TYPE_PACKAGE, this_source_obj,
-                                         state, context);
-                       if (ACPI_FAILURE (status)) {
-                               return_ACPI_STATUS (status);
+                       status =
+                           walk_callback(ACPI_COPY_TYPE_PACKAGE,
+                                         this_source_obj, state, context);
+                       if (ACPI_FAILURE(status)) {
+                               return_ACPI_STATUS(status);
                        }
 
                        /*
                         * Push the current state and create a new one
                         * The callback above returned a new target package object.
                         */
-                       acpi_ut_push_generic_state (&state_list, state);
-                       state = acpi_ut_create_pkg_state (this_source_obj,
-                                          state->pkg.this_target_obj, 0);
+                       acpi_ut_push_generic_state(&state_list, state);
+                       state = acpi_ut_create_pkg_state(this_source_obj,
+                                                        state->pkg.
+                                                        this_target_obj, 0);
                        if (!state) {
-                               return_ACPI_STATUS (AE_NO_MEMORY);
+                               return_ACPI_STATUS(AE_NO_MEMORY);
                        }
                }
        }
 
        /* We should never get here */
 
-       return_ACPI_STATUS (AE_AML_INTERNAL);
+       return_ACPI_STATUS(AE_AML_INTERNAL);
 }
 
-
 /*******************************************************************************
  *
- * FUNCTION:    acpi_ut_generate_checksum
+ * FUNCTION:    acpi_ut_error, acpi_ut_warning, acpi_ut_info
  *
- * PARAMETERS:  Buffer          - Buffer to be scanned
- *              Length          - number of bytes to examine
+ * PARAMETERS:  module_name         - Caller's module name (for error output)
+ *              line_number         - Caller's line number (for error output)
+ *              Format              - Printf format string + additional args
  *
- * RETURN:      checksum
+ * RETURN:      None
  *
- * DESCRIPTION: Generate a checksum on a raw buffer
+ * DESCRIPTION: Print message with module/line/version info
  *
  ******************************************************************************/
 
-u8
-acpi_ut_generate_checksum (
-       u8                              *buffer,
-       u32                             length)
+void ACPI_INTERNAL_VAR_XFACE
+acpi_ut_error(char *module_name, u32 line_number, char *format, ...)
 {
-       u32                             i;
-       signed char                     sum = 0;
-
+       va_list args;
 
-       for (i = 0; i < length; i++) {
-               sum = (signed char) (sum + buffer[i]);
-       }
+       acpi_os_printf("ACPI Error (%s-%04d): ", module_name, line_number);
 
-       return ((u8) (0 - sum));
+       va_start(args, format);
+       acpi_os_vprintf(format, args);
+       acpi_os_printf(" [%X]\n", ACPI_CA_VERSION);
 }
 
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_get_resource_end_tag
- *
- * PARAMETERS:  obj_desc        - The resource template buffer object
- *
- * RETURN:      Pointer to the end tag
- *
- * DESCRIPTION: Find the END_TAG resource descriptor in a resource template
- *
- ******************************************************************************/
-
-
-u8 *
-acpi_ut_get_resource_end_tag (
-       union acpi_operand_object       *obj_desc)
+void ACPI_INTERNAL_VAR_XFACE
+acpi_ut_exception(char *module_name,
+                 u32 line_number, acpi_status status, char *format, ...)
 {
-       u8                              buffer_byte;
-       u8                              *buffer;
-       u8                              *end_buffer;
-
-
-       buffer    = obj_desc->buffer.pointer;
-       end_buffer = buffer + obj_desc->buffer.length;
-
-       while (buffer < end_buffer) {
-               buffer_byte = *buffer;
-               if (buffer_byte & ACPI_RDESC_TYPE_MASK) {
-                       /* Large Descriptor - Length is next 2 bytes */
-
-                       buffer += ((*(buffer+1) | (*(buffer+2) << 8)) + 3);
-               }
-               else {
-                       /* Small Descriptor.  End Tag will be found here */
-
-                       if ((buffer_byte & ACPI_RDESC_SMALL_MASK) == ACPI_RDESC_TYPE_END_TAG) {
-                               /* Found the end tag descriptor, all done. */
-
-                               return (buffer);
-                       }
-
-                       /* Length is in the header */
-
-                       buffer += ((buffer_byte & 0x07) + 1);
-               }
-       }
+       va_list args;
 
-       /* End tag not found */
+       acpi_os_printf("ACPI Exception (%s-%04d): %s, ", module_name,
+                      line_number, acpi_format_exception(status));
 
-       return (NULL);
+       va_start(args, format);
+       acpi_os_vprintf(format, args);
+       acpi_os_printf(" [%X]\n", ACPI_CA_VERSION);
 }
+EXPORT_SYMBOL(acpi_ut_exception);
 
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_report_error
- *
- * PARAMETERS:  module_name         - Caller's module name (for error output)
- *              line_number         - Caller's line number (for error output)
- *              component_id        - Caller's component ID (for error output)
- *              Message             - Error message to use on failure
- *
- * RETURN:      None
- *
- * DESCRIPTION: Print error message
- *
- ******************************************************************************/
-
-void
-acpi_ut_report_error (
-       char                            *module_name,
-       u32                             line_number,
-       u32                             component_id)
+void ACPI_INTERNAL_VAR_XFACE
+acpi_ut_warning(char *module_name, u32 line_number, char *format, ...)
 {
+       va_list args;
 
+       acpi_os_printf("ACPI Warning (%s-%04d): ", module_name, line_number);
 
-       acpi_os_printf ("%8s-%04d: *** Error: ", module_name, line_number);
+       va_start(args, format);
+       acpi_os_vprintf(format, args);
+       acpi_os_printf(" [%X]\n", ACPI_CA_VERSION);
 }
 
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_report_warning
- *
- * PARAMETERS:  module_name         - Caller's module name (for error output)
- *              line_number         - Caller's line number (for error output)
- *              component_id        - Caller's component ID (for error output)
- *              Message             - Error message to use on failure
- *
- * RETURN:      None
- *
- * DESCRIPTION: Print warning message
- *
- ******************************************************************************/
-
-void
-acpi_ut_report_warning (
-       char                            *module_name,
-       u32                             line_number,
-       u32                             component_id)
+void ACPI_INTERNAL_VAR_XFACE
+acpi_ut_info(char *module_name, u32 line_number, char *format, ...)
 {
+       va_list args;
 
-       acpi_os_printf ("%8s-%04d: *** Warning: ", module_name, line_number);
-}
+       acpi_os_printf("ACPI (%s-%04d): ", module_name, line_number);
 
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_report_info
- *
- * PARAMETERS:  module_name         - Caller's module name (for error output)
- *              line_number         - Caller's line number (for error output)
- *              component_id        - Caller's component ID (for error output)
- *              Message             - Error message to use on failure
- *
- * RETURN:      None
- *
- * DESCRIPTION: Print information message
- *
- ******************************************************************************/
-
-void
-acpi_ut_report_info (
-       char                            *module_name,
-       u32                             line_number,
-       u32                             component_id)
-{
-
-       acpi_os_printf ("%8s-%04d: *** Info: ", module_name, line_number);
+       va_start(args, format);
+       acpi_os_vprintf(format, args);
+       acpi_os_printf(" [%X]\n", ACPI_CA_VERSION);
 }
-
-