patch-2.4.22 linux-2.4.22/drivers/acpi/utilities/utmisc.c
Next file: linux-2.4.22/drivers/acpi/utilities/utobject.c
Previous file: linux-2.4.22/drivers/acpi/utilities/utmath.c
Back to the patch index
Back to the overall index
- Lines: 1638
- Date:
2003-08-25 04:44:41.000000000 -0700
- Orig file:
linux-2.4.21/drivers/acpi/utilities/utmisc.c
- Orig date:
2001-10-24 14:06:22.000000000 -0700
diff -urN linux-2.4.21/drivers/acpi/utilities/utmisc.c linux-2.4.22/drivers/acpi/utilities/utmisc.c
@@ -1,45 +1,292 @@
/*******************************************************************************
*
* Module Name: utmisc - common utility procedures
- * $Revision: 52 $
*
******************************************************************************/
/*
- * Copyright (C) 2000, 2001 R. Byron Moore
+ * Copyright (C) 2000 - 2003, R. Byron Moore
+ * All rights reserved.
*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions, and the following disclaimer,
+ * without modification.
+ * 2. Redistributions in binary form must reproduce at minimum a disclaimer
+ * substantially similar to the "NO WARRANTY" disclaimer below
+ * ("Disclaimer") and any redistribution must be conditioned upon
+ * including a substantially similar Disclaimer requirement for further
+ * binary redistribution.
+ * 3. Neither the names of the above-listed copyright holders nor the names
+ * of any contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * Alternatively, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") version 2 as published by the Free
+ * Software Foundation.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
*/
-#include "acpi.h"
-#include "acevents.h"
-#include "achware.h"
-#include "acnamesp.h"
-#include "acinterp.h"
-#include "amlcode.h"
-#include "acdebug.h"
+#include <acpi/acpi.h>
+#include <acpi/acnamesp.h>
#define _COMPONENT ACPI_UTILITIES
- MODULE_NAME ("utmisc")
+ ACPI_MODULE_NAME ("utmisc")
/*******************************************************************************
*
- * FUNCTION: Acpi_ut_valid_acpi_name
+ * FUNCTION: acpi_ut_print_string
+ *
+ * PARAMETERS: String - Null terminated ASCII string
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Dump an ASCII string with support for ACPI-defined escape
+ * sequences.
+ *
+ ******************************************************************************/
+
+void
+acpi_ut_print_string (
+ char *string,
+ u8 max_length)
+{
+ u32 i;
+
+
+ if (!string) {
+ acpi_os_printf ("<\"NULL STRING PTR\">");
+ return;
+ }
+
+ acpi_os_printf ("\"");
+ for (i = 0; string[i] && (i < max_length); i++) {
+ /* Escape sequences */
+
+ switch (string[i]) {
+ case 0x07:
+ acpi_os_printf ("\\a"); /* BELL */
+ break;
+
+ case 0x08:
+ acpi_os_printf ("\\b"); /* BACKSPACE */
+ break;
+
+ case 0x0C:
+ acpi_os_printf ("\\f"); /* FORMFEED */
+ break;
+
+ case 0x0A:
+ acpi_os_printf ("\\n"); /* LINEFEED */
+ break;
+
+ case 0x0D:
+ acpi_os_printf ("\\r"); /* CARRIAGE RETURN*/
+ break;
+
+ case 0x09:
+ acpi_os_printf ("\\t"); /* HORIZONTAL TAB */
+ break;
+
+ case 0x0B:
+ acpi_os_printf ("\\v"); /* VERTICAL TAB */
+ break;
+
+ 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]))
+ {
+ /* This is a normal character */
+
+ acpi_os_printf ("%c", (int) string[i]);
+ }
+ else
+ {
+ /* All others will be Hex escapes */
+
+ acpi_os_printf ("\\x%2.2X", (s32) string[i]);
+ }
+ break;
+ }
+ }
+ acpi_os_printf ("\"");
+
+ if (i == max_length && string[i]) {
+ acpi_os_printf ("...");
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: acpi_ut_dword_byte_swap
+ *
+ * PARAMETERS: Value - Value to be converted
+ *
+ * DESCRIPTION: Convert a 32-bit value to big-endian (swap the bytes)
+ *
+ ******************************************************************************/
+
+u32
+acpi_ut_dword_byte_swap (
+ u32 value)
+{
+ union {
+ u32 value;
+ u8 bytes[4];
+ } out;
+
+ union {
+ u32 value;
+ u8 bytes[4];
+ } in;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ in.value = value;
+
+ out.bytes[0] = in.bytes[3];
+ out.bytes[1] = in.bytes[2];
+ out.bytes[2] = in.bytes[1];
+ out.bytes[3] = in.bytes[0];
+
+ return (out.value);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: acpi_ut_set_integer_width
+ *
+ * PARAMETERS: Revision From DSDT header
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Set the global integer bit width based upon the revision
+ * of the DSDT. For Revision 1 and 0, Integers are 32 bits.
+ * For Revision 2 and above, Integers are 64 bits. Yes, this
+ * makes a difference.
+ *
+ ******************************************************************************/
+
+void
+acpi_ut_set_integer_width (
+ u8 revision)
+{
+
+ if (revision <= 1) {
+ acpi_gbl_integer_bit_width = 32;
+ acpi_gbl_integer_nybble_width = 8;
+ acpi_gbl_integer_byte_width = 4;
+ }
+ else {
+ 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
+ * Path - Additional path string to be appended.
+ * (NULL if no extra path)
+ *
+ * RETURN: acpi_status
+ *
+ * DESCRIPTION: Display full pathname of an object, DEBUG ONLY
+ *
+ ******************************************************************************/
+
+void
+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 ();
+
+
+ /* Only print the path if the appropriate debug level is enabled */
+
+ if (!(acpi_dbg_level & ACPI_LV_INIT_NAMES)) {
+ return;
+ }
+
+ /* 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)) {
+ return;
+ }
+
+ /* Print what we're doing */
+
+ switch (type) {
+ case ACPI_TYPE_METHOD:
+ acpi_os_printf ("Executing ");
+ break;
+
+ default:
+ 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);
+
+ /* Extra path is used to append names like _STA, _INI, etc. */
+
+ if (path) {
+ acpi_os_printf (".%s", path);
+ }
+ acpi_os_printf ("\n");
+
+ ACPI_MEM_FREE (buffer.pointer);
+}
+#endif
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: acpi_ut_valid_acpi_name
*
* PARAMETERS: Character - The character to be examined
*
@@ -54,13 +301,13 @@
u8
acpi_ut_valid_acpi_name (
- u32 name)
+ u32 name)
{
- NATIVE_CHAR *name_ptr = (NATIVE_CHAR *) &name;
- u32 i;
+ char *name_ptr = (char *) &name;
+ u32 i;
- FUNCTION_ENTRY ();
+ ACPI_FUNCTION_ENTRY ();
for (i = 0; i < ACPI_NAME_SIZE; i++) {
@@ -77,7 +324,7 @@
/*******************************************************************************
*
- * FUNCTION: Acpi_ut_valid_acpi_character
+ * FUNCTION: acpi_ut_valid_acpi_character
*
* PARAMETERS: Character - The character to be examined
*
@@ -89,10 +336,10 @@
u8
acpi_ut_valid_acpi_character (
- NATIVE_CHAR character)
+ char character)
{
- FUNCTION_ENTRY ();
+ ACPI_FUNCTION_ENTRY ();
return ((u8) ((character == '_') ||
(character >= 'A' && character <= 'Z') ||
@@ -102,40 +349,185 @@
/*******************************************************************************
*
- * FUNCTION: Acpi_ut_strupr
+ * FUNCTION: acpi_ut_strtoul64
+ *
+ * PARAMETERS: String - Null terminated string
+ * Terminater - Where a pointer to the terminating byte is returned
+ * Base - Radix of the string
+ *
+ * RETURN: Converted value
+ *
+ * DESCRIPTION: Convert a string into an unsigned value.
+ *
+ ******************************************************************************/
+#define NEGATIVE 1
+#define POSITIVE 0
+
+acpi_status
+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;
+
+ switch (base) {
+ case 0:
+ case 8:
+ case 10:
+ case 16:
+ break;
+
+ default:
+ /*
+ * The specified Base parameter is not in the domain of
+ * this function:
+ */
+ return (AE_BAD_PARAMETER);
+ }
+
+ /*
+ * skip over any white space in the buffer:
+ */
+ while (ACPI_IS_SPACE (*string) || *string == '\t') {
+ ++string;
+ }
+
+ /*
+ * 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 {
+ base = 10;
+ }
+ }
+
+ /*
+ * For octal and hexadecimal bases, skip over the leading
+ * 0 or 0x, if they are present.
+ */
+ if (base == 8 && *string == '0') {
+ string++;
+ }
+
+ if (base == 16 &&
+ *string == '0' &&
+ ACPI_TOLOWER (*(++string)) == 'x') {
+ string++;
+ }
+
+ /* Main loop: convert the string to an unsigned long */
+
+ 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;
+ }
+ else {
+ goto error_exit;
+ }
+ }
+
+ if (index >= base) {
+ goto error_exit;
+ }
+
+ /* Check to see if value is out of range: */
+
+ dividend = ACPI_INTEGER_MAX - (acpi_integer) index;
+ (void) acpi_ut_short_divide (÷nd, base, "ient, NULL);
+ if (return_value > quotient) {
+ goto error_exit;
+ }
+
+ return_value *= base;
+ return_value += index;
+ ++string;
+ }
+
+ *ret_integer = return_value;
+ return (status);
+
+
+error_exit:
+ switch (base) {
+ case 8:
+ status = AE_BAD_OCTAL_CONSTANT;
+ break;
+
+ case 10:
+ status = AE_BAD_DECIMAL_CONSTANT;
+ break;
+
+ case 16:
+ status = AE_BAD_HEX_CONSTANT;
+ break;
+
+ default:
+ /* Base validated above */
+ break;
+ }
+
+ return (status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: acpi_ut_strupr
*
- * PARAMETERS: Src_string - The source string to convert to
+ * PARAMETERS: src_string - The source string to convert to
*
- * RETURN: Src_string
+ * RETURN: src_string
*
* DESCRIPTION: Convert string to uppercase
*
******************************************************************************/
-NATIVE_CHAR *
+char *
acpi_ut_strupr (
- NATIVE_CHAR *src_string)
+ char *src_string)
{
- NATIVE_CHAR *string;
+ char *string;
- FUNCTION_ENTRY ();
+ ACPI_FUNCTION_ENTRY ();
/* Walk entire string, uppercasing the letters */
for (string = src_string; *string; ) {
- *string = (char) TOUPPER (*string);
+ *string = (char) ACPI_TOUPPER (*string);
string++;
}
-
return (src_string);
}
/*******************************************************************************
*
- * FUNCTION: Acpi_ut_mutex_initialize
+ * FUNCTION: acpi_ut_mutex_initialize
*
* PARAMETERS: None.
*
@@ -149,30 +541,33 @@
acpi_ut_mutex_initialize (
void)
{
- u32 i;
- acpi_status status;
+ u32 i;
+ acpi_status status;
- FUNCTION_TRACE ("Ut_mutex_initialize");
+ ACPI_FUNCTION_TRACE ("ut_mutex_initialize");
/*
* Create each of the predefined mutex objects
*/
- for (i = 0; i < NUM_MTX; i++) {
+ for (i = 0; i < NUM_MUTEX; i++) {
status = acpi_ut_create_mutex (i);
if (ACPI_FAILURE (status)) {
return_ACPI_STATUS (status);
}
}
+
+ status = acpi_os_create_lock (&acpi_gbl_gpe_lock);
+
return_ACPI_STATUS (AE_OK);
}
/*******************************************************************************
*
- * FUNCTION: Acpi_ut_mutex_terminate
+ * FUNCTION: acpi_ut_mutex_terminate
*
* PARAMETERS: None.
*
@@ -186,28 +581,29 @@
acpi_ut_mutex_terminate (
void)
{
- u32 i;
+ u32 i;
- FUNCTION_TRACE ("Ut_mutex_terminate");
+ ACPI_FUNCTION_TRACE ("ut_mutex_terminate");
/*
* Delete each predefined mutex object
*/
- for (i = 0; i < NUM_MTX; i++) {
- acpi_ut_delete_mutex (i);
+ 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
+ * FUNCTION: acpi_ut_create_mutex
*
- * PARAMETERS: Mutex_iD - ID of the mutex to be created
+ * PARAMETERS: mutex_iD - ID of the mutex to be created
*
* RETURN: Status
*
@@ -217,24 +613,23 @@
acpi_status
acpi_ut_create_mutex (
- ACPI_MUTEX_HANDLE mutex_id)
+ acpi_mutex_handle mutex_id)
{
- acpi_status status = AE_OK;
+ acpi_status status = AE_OK;
- FUNCTION_TRACE_U32 ("Ut_create_mutex", mutex_id);
+ ACPI_FUNCTION_TRACE_U32 ("ut_create_mutex", mutex_id);
- if (mutex_id > MAX_MTX) {
+ if (mutex_id > MAX_MUTEX) {
return_ACPI_STATUS (AE_BAD_PARAMETER);
}
-
- if (!acpi_gbl_acpi_mutex_info[mutex_id].mutex) {
+ if (!acpi_gbl_mutex_info[mutex_id].mutex) {
status = acpi_os_create_semaphore (1, 1,
- &acpi_gbl_acpi_mutex_info[mutex_id].mutex);
- acpi_gbl_acpi_mutex_info[mutex_id].owner_id = ACPI_MUTEX_NOT_ACQUIRED;
- acpi_gbl_acpi_mutex_info[mutex_id].use_count = 0;
+ &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);
@@ -243,9 +638,9 @@
/*******************************************************************************
*
- * FUNCTION: Acpi_ut_delete_mutex
+ * FUNCTION: acpi_ut_delete_mutex
*
- * PARAMETERS: Mutex_iD - ID of the mutex to be deleted
+ * PARAMETERS: mutex_iD - ID of the mutex to be deleted
*
* RETURN: Status
*
@@ -255,23 +650,22 @@
acpi_status
acpi_ut_delete_mutex (
- ACPI_MUTEX_HANDLE mutex_id)
+ acpi_mutex_handle mutex_id)
{
- acpi_status status;
+ acpi_status status;
- FUNCTION_TRACE_U32 ("Ut_delete_mutex", mutex_id);
+ ACPI_FUNCTION_TRACE_U32 ("ut_delete_mutex", mutex_id);
- if (mutex_id > MAX_MTX) {
+ if (mutex_id > MAX_MUTEX) {
return_ACPI_STATUS (AE_BAD_PARAMETER);
}
+ status = acpi_os_delete_semaphore (acpi_gbl_mutex_info[mutex_id].mutex);
- status = acpi_os_delete_semaphore (acpi_gbl_acpi_mutex_info[mutex_id].mutex);
-
- acpi_gbl_acpi_mutex_info[mutex_id].mutex = NULL;
- acpi_gbl_acpi_mutex_info[mutex_id].owner_id = ACPI_MUTEX_NOT_ACQUIRED;
+ acpi_gbl_mutex_info[mutex_id].mutex = NULL;
+ acpi_gbl_mutex_info[mutex_id].owner_id = ACPI_MUTEX_NOT_ACQUIRED;
return_ACPI_STATUS (status);
}
@@ -279,9 +673,9 @@
/*******************************************************************************
*
- * FUNCTION: Acpi_ut_acquire_mutex
+ * FUNCTION: acpi_ut_acquire_mutex
*
- * PARAMETERS: Mutex_iD - ID of the mutex to be acquired
+ * PARAMETERS: mutex_iD - ID of the mutex to be acquired
*
* RETURN: Status
*
@@ -291,21 +685,20 @@
acpi_status
acpi_ut_acquire_mutex (
- ACPI_MUTEX_HANDLE mutex_id)
+ acpi_mutex_handle mutex_id)
{
- acpi_status status;
- u32 i;
- u32 this_thread_id;
+ acpi_status status;
+ u32 i;
+ u32 this_thread_id;
- PROC_NAME ("Ut_acquire_mutex");
+ ACPI_FUNCTION_NAME ("ut_acquire_mutex");
- if (mutex_id > MAX_MTX) {
+ if (mutex_id > MAX_MUTEX) {
return (AE_BAD_PARAMETER);
}
-
this_thread_id = acpi_os_get_thread_id ();
/*
@@ -314,8 +707,8 @@
* the mutex ordering rule. This indicates a coding error somewhere in
* the ACPI subsystem code.
*/
- for (i = mutex_id; i < MAX_MTX; i++) {
- if (acpi_gbl_acpi_mutex_info[i].owner_id == this_thread_id) {
+ 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",
@@ -333,22 +726,19 @@
}
}
-
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_acpi_mutex_info[mutex_id].mutex,
- 1, WAIT_FOREVER);
-
+ 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_acpi_mutex_info[mutex_id].use_count++;
- acpi_gbl_acpi_mutex_info[mutex_id].owner_id = this_thread_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),
@@ -361,9 +751,9 @@
/*******************************************************************************
*
- * FUNCTION: Acpi_ut_release_mutex
+ * FUNCTION: acpi_ut_release_mutex
*
- * PARAMETERS: Mutex_iD - ID of the mutex to be released
+ * PARAMETERS: mutex_iD - ID of the mutex to be released
*
* RETURN: Status
*
@@ -373,14 +763,14 @@
acpi_status
acpi_ut_release_mutex (
- ACPI_MUTEX_HANDLE mutex_id)
+ acpi_mutex_handle mutex_id)
{
- acpi_status status;
- u32 i;
- u32 this_thread_id;
+ acpi_status status;
+ u32 i;
+ u32 this_thread_id;
- PROC_NAME ("Ut_release_mutex");
+ ACPI_FUNCTION_NAME ("ut_release_mutex");
this_thread_id = acpi_os_get_thread_id ();
@@ -388,15 +778,14 @@
"Thread %X releasing Mutex [%s]\n", this_thread_id,
acpi_ut_get_mutex_name (mutex_id)));
- if (mutex_id > MAX_MTX) {
+ if (mutex_id > MAX_MUTEX) {
return (AE_BAD_PARAMETER);
}
-
/*
* Mutex must be acquired in order to release it!
*/
- if (acpi_gbl_acpi_mutex_info[mutex_id].owner_id == ACPI_MUTEX_NOT_ACQUIRED) {
+ 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)));
@@ -404,15 +793,14 @@
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_MTX; i++) {
- if (acpi_gbl_acpi_mutex_info[i].owner_id == this_thread_id) {
+ for (i = mutex_id; i < MAX_MUTEX; i++) {
+ if (acpi_gbl_mutex_info[i].owner_id == this_thread_id) {
if (i == mutex_id) {
continue;
}
@@ -425,12 +813,11 @@
}
}
-
/* Mark unlocked FIRST */
- acpi_gbl_acpi_mutex_info[mutex_id].owner_id = ACPI_MUTEX_NOT_ACQUIRED;
+ acpi_gbl_mutex_info[mutex_id].owner_id = ACPI_MUTEX_NOT_ACQUIRED;
- status = acpi_os_signal_semaphore (acpi_gbl_acpi_mutex_info[mutex_id].mutex, 1);
+ 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",
@@ -448,11 +835,11 @@
/*******************************************************************************
*
- * FUNCTION: Acpi_ut_create_update_state_and_push
+ * 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
+ * state_list - List the state will be added to
*
* RETURN: None
*
@@ -462,14 +849,14 @@
acpi_status
acpi_ut_create_update_state_and_push (
- acpi_operand_object *object,
- u16 action,
- acpi_generic_state **state_list)
+ union acpi_operand_object *object,
+ u16 action,
+ union acpi_generic_state **state_list)
{
- acpi_generic_state *state;
+ union acpi_generic_state *state;
- FUNCTION_ENTRY ();
+ ACPI_FUNCTION_ENTRY ();
/* Ignore null objects; these are expected */
@@ -483,7 +870,6 @@
return (AE_NO_MEMORY);
}
-
acpi_ut_push_generic_state (state_list, state);
return (AE_OK);
}
@@ -491,11 +877,11 @@
/*******************************************************************************
*
- * FUNCTION: Acpi_ut_create_pkg_state_and_push
+ * 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
+ * state_list - List the state will be added to
*
* RETURN: None
*
@@ -505,15 +891,15 @@
acpi_status
acpi_ut_create_pkg_state_and_push (
- void *internal_object,
- void *external_object,
- u16 index,
- acpi_generic_state **state_list)
+ void *internal_object,
+ void *external_object,
+ u16 index,
+ union acpi_generic_state **state_list)
{
- acpi_generic_state *state;
+ union acpi_generic_state *state;
- FUNCTION_ENTRY ();
+ ACPI_FUNCTION_ENTRY ();
state = acpi_ut_create_pkg_state (internal_object, external_object, index);
@@ -521,7 +907,6 @@
return (AE_NO_MEMORY);
}
-
acpi_ut_push_generic_state (state_list, state);
return (AE_OK);
}
@@ -529,9 +914,9 @@
/*******************************************************************************
*
- * FUNCTION: Acpi_ut_push_generic_state
+ * FUNCTION: acpi_ut_push_generic_state
*
- * PARAMETERS: List_head - Head of the state stack
+ * PARAMETERS: list_head - Head of the state stack
* State - State object to push
*
* RETURN: Status
@@ -542,10 +927,10 @@
void
acpi_ut_push_generic_state (
- acpi_generic_state **list_head,
- acpi_generic_state *state)
+ union acpi_generic_state **list_head,
+ union acpi_generic_state *state)
{
- FUNCTION_TRACE ("Ut_push_generic_state");
+ ACPI_FUNCTION_TRACE ("ut_push_generic_state");
/* Push the state object onto the front of the list (stack) */
@@ -559,9 +944,9 @@
/*******************************************************************************
*
- * FUNCTION: Acpi_ut_pop_generic_state
+ * FUNCTION: acpi_ut_pop_generic_state
*
- * PARAMETERS: List_head - Head of the state stack
+ * PARAMETERS: list_head - Head of the state stack
*
* RETURN: Status
*
@@ -569,14 +954,14 @@
*
******************************************************************************/
-acpi_generic_state *
+union acpi_generic_state *
acpi_ut_pop_generic_state (
- acpi_generic_state **list_head)
+ union acpi_generic_state **list_head)
{
- acpi_generic_state *state;
+ union acpi_generic_state *state;
- FUNCTION_TRACE ("Ut_pop_generic_state");
+ ACPI_FUNCTION_TRACE ("ut_pop_generic_state");
/* Remove the state object at the head of the list (stack) */
@@ -594,7 +979,7 @@
/*******************************************************************************
*
- * FUNCTION: Acpi_ut_create_generic_state
+ * FUNCTION: acpi_ut_create_generic_state
*
* PARAMETERS: None
*
@@ -605,13 +990,13 @@
*
******************************************************************************/
-acpi_generic_state *
+union acpi_generic_state *
acpi_ut_create_generic_state (void)
{
- acpi_generic_state *state;
+ union acpi_generic_state *state;
- FUNCTION_ENTRY ();
+ ACPI_FUNCTION_ENTRY ();
state = acpi_ut_acquire_from_cache (ACPI_MEM_LIST_STATE);
@@ -628,7 +1013,46 @@
/*******************************************************************************
*
- * FUNCTION: Acpi_ut_create_update_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
@@ -642,22 +1066,22 @@
*
******************************************************************************/
-acpi_generic_state *
+union acpi_generic_state *
acpi_ut_create_update_state (
- acpi_operand_object *object,
- u16 action)
+ union acpi_operand_object *object,
+ u16 action)
{
- acpi_generic_state *state;
+ union acpi_generic_state *state;
- FUNCTION_TRACE_PTR ("Ut_create_update_state", object);
+ ACPI_FUNCTION_TRACE_PTR ("ut_create_update_state", object);
/* Create the generic state object */
state = acpi_ut_create_generic_state ();
if (!state) {
- return (NULL);
+ return_PTR (NULL);
}
/* Init fields specific to the update struct */
@@ -672,7 +1096,7 @@
/*******************************************************************************
*
- * FUNCTION: Acpi_ut_create_pkg_state
+ * FUNCTION: acpi_ut_create_pkg_state
*
* PARAMETERS: Object - Initial Object to be installed in the
* state
@@ -684,29 +1108,29 @@
*
******************************************************************************/
-acpi_generic_state *
+union acpi_generic_state *
acpi_ut_create_pkg_state (
- void *internal_object,
- void *external_object,
- u16 index)
+ void *internal_object,
+ void *external_object,
+ u16 index)
{
- acpi_generic_state *state;
+ union acpi_generic_state *state;
- FUNCTION_TRACE_PTR ("Ut_create_pkg_state", internal_object);
+ ACPI_FUNCTION_TRACE_PTR ("ut_create_pkg_state", internal_object);
/* Create the generic state object */
state = acpi_ut_create_generic_state ();
if (!state) {
- return (NULL);
+ return_PTR (NULL);
}
/* Init fields specific to the update struct */
state->common.data_type = ACPI_DESC_TYPE_STATE_PACKAGE;
- state->pkg.source_object = (acpi_operand_object *) internal_object;
+ 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;
@@ -717,7 +1141,7 @@
/*******************************************************************************
*
- * FUNCTION: Acpi_ut_create_control_state
+ * FUNCTION: acpi_ut_create_control_state
*
* PARAMETERS: None
*
@@ -728,28 +1152,27 @@
*
******************************************************************************/
-acpi_generic_state *
+union acpi_generic_state *
acpi_ut_create_control_state (
void)
{
- acpi_generic_state *state;
+ union acpi_generic_state *state;
- FUNCTION_TRACE ("Ut_create_control_state");
+ ACPI_FUNCTION_TRACE ("ut_create_control_state");
/* Create the generic state object */
state = acpi_ut_create_generic_state ();
if (!state) {
- return (NULL);
+ return_PTR (NULL);
}
-
/* Init fields specific to the control struct */
state->common.data_type = ACPI_DESC_TYPE_STATE_CONTROL;
- state->common.state = CONTROL_CONDITIONAL_EXECUTING;
+ state->common.state = ACPI_CONTROL_CONDITIONAL_EXECUTING;
return_PTR (state);
}
@@ -757,7 +1180,7 @@
/*******************************************************************************
*
- * FUNCTION: Acpi_ut_delete_generic_state
+ * FUNCTION: acpi_ut_delete_generic_state
*
* PARAMETERS: State - The state object to be deleted
*
@@ -770,9 +1193,9 @@
void
acpi_ut_delete_generic_state (
- acpi_generic_state *state)
+ union acpi_generic_state *state)
{
- FUNCTION_TRACE ("Ut_delete_generic_state");
+ ACPI_FUNCTION_TRACE ("ut_delete_generic_state");
acpi_ut_release_to_cache (ACPI_MEM_LIST_STATE, state);
@@ -782,7 +1205,7 @@
/*******************************************************************************
*
- * FUNCTION: Acpi_ut_delete_generic_state_cache
+ * FUNCTION: acpi_ut_delete_generic_state_cache
*
* PARAMETERS: None
*
@@ -797,7 +1220,7 @@
acpi_ut_delete_generic_state_cache (
void)
{
- FUNCTION_TRACE ("Ut_delete_generic_state_cache");
+ ACPI_FUNCTION_TRACE ("ut_delete_generic_state_cache");
acpi_ut_delete_generic_cache (ACPI_MEM_LIST_STATE);
@@ -807,106 +1230,9 @@
/*******************************************************************************
*
- * FUNCTION: Acpi_ut_resolve_package_references
- *
- * PARAMETERS: Obj_desc - The Package object on which to resolve refs
- *
- * RETURN: Status
- *
- * DESCRIPTION: Walk through a package and turn internal references into values
- *
- ******************************************************************************/
-
-acpi_status
-acpi_ut_resolve_package_references (
- acpi_operand_object *obj_desc)
-{
- u32 count;
- acpi_operand_object *sub_object;
-
-
- FUNCTION_TRACE ("Ut_resolve_package_references");
-
-
- if (obj_desc->common.type != ACPI_TYPE_PACKAGE) {
- /* The object must be a package */
-
- REPORT_ERROR (("Must resolve Package Refs on a Package\n"));
- return_ACPI_STATUS(AE_ERROR);
- }
-
- /*
- * TBD: what about nested packages? */
-
- for (count = 0; count < obj_desc->package.count; count++) {
- sub_object = obj_desc->package.elements[count];
-
- if (sub_object->common.type == INTERNAL_TYPE_REFERENCE) {
- if (sub_object->reference.opcode == AML_ZERO_OP) {
- sub_object->common.type = ACPI_TYPE_INTEGER;
- sub_object->integer.value = 0;
- }
-
- else if (sub_object->reference.opcode == AML_ONE_OP) {
- sub_object->common.type = ACPI_TYPE_INTEGER;
- sub_object->integer.value = 1;
- }
-
- else if (sub_object->reference.opcode == AML_ONES_OP) {
- sub_object->common.type = ACPI_TYPE_INTEGER;
- sub_object->integer.value = ACPI_INTEGER_MAX;
- }
- }
- }
-
- return_ACPI_STATUS(AE_OK);
-}
-
-#ifdef ACPI_DEBUG
-
-/*******************************************************************************
- *
- * FUNCTION: Acpi_ut_display_init_pathname
- *
- * PARAMETERS: Obj_handle - Handle whose pathname will be displayed
- * Path - Additional path string to be appended
- *
- * RETURN: acpi_status
- *
- * DESCRIPTION: Display full pathnbame of an object, DEBUG ONLY
- *
- ******************************************************************************/
-
-void
-acpi_ut_display_init_pathname (
- acpi_handle obj_handle,
- char *path)
-{
- acpi_status status;
- u32 length = 128;
- char buffer[128];
-
-
- PROC_NAME ("Ut_display_init_pathname");
-
-
- status = acpi_ns_handle_to_pathname (obj_handle, &length, buffer);
- if (ACPI_SUCCESS (status)) {
- if (path) {
- ACPI_DEBUG_PRINT ((ACPI_DB_INIT, "%s.%s\n", buffer, path));
- }
- else {
- ACPI_DEBUG_PRINT ((ACPI_DB_INIT, "%s\n", buffer));
- }
- }
-}
-#endif
-
-/*******************************************************************************
- *
- * FUNCTION: Acpi_ut_walk_package_tree
+ * FUNCTION: acpi_ut_walk_package_tree
*
- * PARAMETERS: Obj_desc - The Package object on which to resolve refs
+ * PARAMETERS: obj_desc - The Package object on which to resolve refs
*
* RETURN: Status
*
@@ -916,19 +1242,19 @@
acpi_status
acpi_ut_walk_package_tree (
- acpi_operand_object *source_object,
- void *target_object,
- ACPI_PKG_CALLBACK walk_callback,
- void *context)
-{
- acpi_status status = AE_OK;
- acpi_generic_state *state_list = NULL;
- acpi_generic_state *state;
- u32 this_index;
- acpi_operand_object *this_source_obj;
+ 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;
- FUNCTION_TRACE ("Ut_walk_package_tree");
+ ACPI_FUNCTION_TRACE ("ut_walk_package_tree");
state = acpi_ut_create_pkg_state (source_object, target_object, 0);
@@ -937,29 +1263,26 @@
}
while (state) {
+ /* Get one element of the package */
+
this_index = state->pkg.index;
- this_source_obj = (acpi_operand_object *)
+ this_source_obj = (union acpi_operand_object *)
state->pkg.source_object->package.elements[this_index];
/*
- * Check for
+ * Check for:
* 1) An uninitialized package element. It is completely
- * legal to declare a package and leave it uninitialized
+ * legal to declare a package and leave it uninitialized
* 2) Not an internal object - can be a namespace node instead
* 3) Any type other than a package. Packages are handled in else
- * case below.
+ * case below.
*/
if ((!this_source_obj) ||
- (!VALID_DESCRIPTOR_TYPE (
- this_source_obj, ACPI_DESC_TYPE_INTERNAL)) ||
- (!IS_THIS_OBJECT_TYPE (
- this_source_obj, ACPI_TYPE_PACKAGE))) {
-
+ (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)) {
- /* TBD: must delete package created up to this point */
-
return_ACPI_STATUS (status);
}
@@ -975,7 +1298,6 @@
acpi_ut_delete_generic_state (state);
state = acpi_ut_pop_generic_state (&state_list);
-
/* Finished when there are no more states */
if (!state) {
@@ -994,32 +1316,23 @@
state->pkg.index++;
}
}
-
else {
- /* This is a sub-object of type package */
+ /* This is a subobject of type package */
status = walk_callback (ACPI_COPY_TYPE_PACKAGE, this_source_obj,
state, context);
if (ACPI_FAILURE (status)) {
- /* TBD: must delete package created up to this point */
-
return_ACPI_STATUS (status);
}
-
- /*
- * The callback above returned a new target package object.
- */
-
/*
* 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);
if (!state) {
- /* TBD: must delete package created up to this point */
-
return_ACPI_STATUS (AE_NO_MEMORY);
}
}
@@ -1027,17 +1340,100 @@
/* We should never get here */
- return (AE_AML_INTERNAL);
+ return_ACPI_STATUS (AE_AML_INTERNAL);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: acpi_ut_generate_checksum
+ *
+ * PARAMETERS: Buffer - Buffer to be scanned
+ * Length - number of bytes to examine
+ *
+ * RETURN: checksum
+ *
+ * DESCRIPTION: Generate a checksum on a raw buffer
+ *
+ ******************************************************************************/
+
+u8
+acpi_ut_generate_checksum (
+ u8 *buffer,
+ u32 length)
+{
+ u32 i;
+ signed char sum = 0;
+
+
+ for (i = 0; i < length; i++) {
+ sum = (signed char) (sum + buffer[i]);
+ }
+
+ return ((u8) (0 - sum));
+}
+
+
+/*******************************************************************************
+ *
+ * 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)
+{
+ 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);
+ }
+ }
+
+ /* End tag not found */
+
+ return (NULL);
}
/*******************************************************************************
*
- * FUNCTION: Acpi_ut_report_error
+ * 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)
+ * 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
@@ -1048,9 +1444,9 @@
void
acpi_ut_report_error (
- NATIVE_CHAR *module_name,
- u32 line_number,
- u32 component_id)
+ char *module_name,
+ u32 line_number,
+ u32 component_id)
{
@@ -1060,11 +1456,11 @@
/*******************************************************************************
*
- * FUNCTION: Acpi_ut_report_warning
+ * 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)
+ * 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
@@ -1075,9 +1471,9 @@
void
acpi_ut_report_warning (
- NATIVE_CHAR *module_name,
- u32 line_number,
- u32 component_id)
+ char *module_name,
+ u32 line_number,
+ u32 component_id)
{
acpi_os_printf ("%8s-%04d: *** Warning: ", module_name, line_number);
@@ -1086,11 +1482,11 @@
/*******************************************************************************
*
- * FUNCTION: Acpi_ut_report_info
+ * 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)
+ * 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
@@ -1101,9 +1497,9 @@
void
acpi_ut_report_info (
- NATIVE_CHAR *module_name,
- u32 line_number,
- u32 component_id)
+ char *module_name,
+ u32 line_number,
+ u32 component_id)
{
acpi_os_printf ("%8s-%04d: *** Info: ", module_name, line_number);
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)