patch-2.4.22 linux-2.4.22/drivers/acpi/executer/exconvrt.c
Next file: linux-2.4.22/drivers/acpi/executer/excreate.c
Previous file: linux-2.4.22/drivers/acpi/executer/exconfig.c
Back to the patch index
Back to the overall index
- Lines: 883
- Date:
2003-08-25 04:44:41.000000000 -0700
- Orig file:
linux-2.4.21/drivers/acpi/executer/exconvrt.c
- Orig date:
2001-10-24 14:06:22.000000000 -0700
diff -urN linux-2.4.21/drivers/acpi/executer/exconvrt.c linux-2.4.22/drivers/acpi/executer/exconvrt.c
@@ -1,49 +1,63 @@
/******************************************************************************
*
* Module Name: exconvrt - Object conversion routines
- * $Revision: 24 $
*
*****************************************************************************/
/*
- * 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 "acparser.h"
-#include "acnamesp.h"
-#include "acinterp.h"
-#include "acevents.h"
-#include "amlcode.h"
-#include "acdispat.h"
+#include <acpi/acpi.h>
+#include <acpi/acinterp.h>
+#include <acpi/amlcode.h>
#define _COMPONENT ACPI_EXECUTER
- MODULE_NAME ("exconvrt")
+ ACPI_MODULE_NAME ("exconvrt")
/*******************************************************************************
*
- * FUNCTION: Acpi_ex_convert_to_integer
+ * FUNCTION: acpi_ex_convert_to_integer
*
- * PARAMETERS: *Obj_desc - Object to be converted. Must be an
+ * PARAMETERS: *obj_desc - Object to be converted. Must be an
* Integer, Buffer, or String
- * Walk_state - Current method state
+ * walk_state - Current method state
*
* RETURN: Status
*
@@ -53,60 +67,40 @@
acpi_status
acpi_ex_convert_to_integer (
- acpi_operand_object *obj_desc,
- acpi_operand_object **result_desc,
- acpi_walk_state *walk_state)
+ union acpi_operand_object *obj_desc,
+ union acpi_operand_object **result_desc,
+ struct acpi_walk_state *walk_state)
{
- u32 i;
- acpi_operand_object *ret_desc;
- u32 count;
- char *pointer;
- acpi_integer result;
- u32 integer_size = sizeof (acpi_integer);
+ u32 i;
+ union acpi_operand_object *ret_desc;
+ u32 count;
+ u8 *pointer;
+ acpi_integer result;
+ acpi_status status;
- FUNCTION_ENTRY ();
+ ACPI_FUNCTION_TRACE_PTR ("ex_convert_to_integer", obj_desc);
- switch (obj_desc->common.type) {
+ switch (ACPI_GET_OBJECT_TYPE (obj_desc)) {
case ACPI_TYPE_INTEGER:
*result_desc = obj_desc;
- return (AE_OK);
+ return_ACPI_STATUS (AE_OK);
case ACPI_TYPE_STRING:
- pointer = obj_desc->string.pointer;
+ pointer = (u8 *) obj_desc->string.pointer;
count = obj_desc->string.length;
break;
case ACPI_TYPE_BUFFER:
- pointer = (char *) obj_desc->buffer.pointer;
+ pointer = obj_desc->buffer.pointer;
count = obj_desc->buffer.length;
break;
default:
- return (AE_TYPE);
- }
-
- /*
- * Create a new integer
- */
- ret_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER);
- if (!ret_desc) {
- return (AE_NO_MEMORY);
- }
-
-
- /* Handle both ACPI 1.0 and ACPI 2.0 Integer widths */
-
- if (walk_state->method_node->flags & ANOBJ_DATA_WIDTH_32) {
- /*
- * We are running a method that exists in a 32-bit ACPI table.
- * Truncate the value to 32 bits by zeroing out the upper 32-bit field
- */
- integer_size = sizeof (u32);
+ return_ACPI_STATUS (AE_TYPE);
}
-
/*
* Convert the buffer/string to an integer. Note that both buffers and
* strings are treated as raw data - we don't convert ascii to hex for
@@ -120,23 +114,24 @@
/* Transfer no more than an integer's worth of data */
- if (count > integer_size) {
- count = integer_size;
+ if (count > acpi_gbl_integer_byte_width) {
+ count = acpi_gbl_integer_byte_width;
}
/*
* String conversion is different than Buffer conversion
*/
- switch (obj_desc->common.type) {
+ switch (ACPI_GET_OBJECT_TYPE (obj_desc)) {
case ACPI_TYPE_STRING:
- /* TBD: Need to use 64-bit STRTOUL */
-
/*
* Convert string to an integer
* String must be hexadecimal as per the ACPI specification
*/
- result = STRTOUL (pointer, NULL, 16);
+ status = acpi_ut_strtoul64 ((char *) pointer, 16, &result);
+ if (ACPI_FAILURE (status)) {
+ return_ACPI_STATUS (status);
+ }
break;
@@ -154,14 +149,31 @@
*/
result |= (((acpi_integer) pointer[i]) << (i * 8));
}
+ break;
+
+ default:
+ /* No other types can get here */
break;
}
- /* Save the Result, delete original descriptor, store new descriptor */
+ /*
+ * Create a new integer
+ */
+ ret_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER);
+ if (!ret_desc) {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ /* Save the Result */
ret_desc->integer.value = result;
+ /*
+ * If we are about to overwrite the original object on the operand stack,
+ * we must remove a reference on the original object because we are
+ * essentially removing it from the stack.
+ */
if (*result_desc == obj_desc) {
if (walk_state->opcode != AML_STORE_OP) {
acpi_ut_remove_reference (obj_desc);
@@ -169,139 +181,152 @@
}
*result_desc = ret_desc;
- return (AE_OK);
+ return_ACPI_STATUS (AE_OK);
}
/*******************************************************************************
*
- * FUNCTION: Acpi_ex_convert_to_buffer
+ * FUNCTION: acpi_ex_convert_to_buffer
*
- * PARAMETERS: *Obj_desc - Object to be converted. Must be an
+ * PARAMETERS: *obj_desc - Object to be converted. Must be an
* Integer, Buffer, or String
- * Walk_state - Current method state
+ * walk_state - Current method state
*
* RETURN: Status
*
- * DESCRIPTION: Convert an ACPI Object to an Buffer
+ * DESCRIPTION: Convert an ACPI Object to a Buffer
*
******************************************************************************/
acpi_status
acpi_ex_convert_to_buffer (
- acpi_operand_object *obj_desc,
- acpi_operand_object **result_desc,
- acpi_walk_state *walk_state)
+ union acpi_operand_object *obj_desc,
+ union acpi_operand_object **result_desc,
+ struct acpi_walk_state *walk_state)
{
- acpi_operand_object *ret_desc;
- u32 i;
- u32 integer_size = sizeof (acpi_integer);
- u8 *new_buf;
+ union acpi_operand_object *ret_desc;
+ u32 i;
+ u8 *new_buf;
- FUNCTION_ENTRY ();
+ ACPI_FUNCTION_TRACE_PTR ("ex_convert_to_buffer", obj_desc);
- switch (obj_desc->common.type) {
- case ACPI_TYPE_INTEGER:
+ switch (ACPI_GET_OBJECT_TYPE (obj_desc)) {
+ case ACPI_TYPE_BUFFER:
- /*
- * Create a new Buffer
- */
- ret_desc = acpi_ut_create_internal_object (ACPI_TYPE_BUFFER);
- if (!ret_desc) {
- return (AE_NO_MEMORY);
- }
+ /* No conversion necessary */
- /* Handle both ACPI 1.0 and ACPI 2.0 Integer widths */
+ *result_desc = obj_desc;
+ return_ACPI_STATUS (AE_OK);
- if (walk_state->method_node->flags & ANOBJ_DATA_WIDTH_32) {
- /*
- * We are running a method that exists in a 32-bit ACPI table.
- * Truncate the value to 32 bits by zeroing out the upper
- * 32-bit field
- */
- integer_size = sizeof (u32);
- }
- /* Need enough space for one integers */
+ case ACPI_TYPE_INTEGER:
- ret_desc->buffer.length = integer_size;
- new_buf = ACPI_MEM_CALLOCATE (integer_size);
- if (!new_buf) {
- REPORT_ERROR
- (("Ex_convert_to_buffer: Buffer allocation failure\n"));
- acpi_ut_remove_reference (ret_desc);
- return (AE_NO_MEMORY);
+ /*
+ * Create a new Buffer object.
+ * Need enough space for one integer
+ */
+ ret_desc = acpi_ut_create_buffer_object (acpi_gbl_integer_byte_width);
+ if (!ret_desc) {
+ return_ACPI_STATUS (AE_NO_MEMORY);
}
/* Copy the integer to the buffer */
- for (i = 0; i < integer_size; i++) {
+ new_buf = ret_desc->buffer.pointer;
+ for (i = 0; i < acpi_gbl_integer_byte_width; i++) {
new_buf[i] = (u8) (obj_desc->integer.value >> (i * 8));
}
- ret_desc->buffer.pointer = new_buf;
-
- /* Return the new buffer descriptor */
-
- if (*result_desc == obj_desc) {
- if (walk_state->opcode != AML_STORE_OP) {
- acpi_ut_remove_reference (obj_desc);
- }
- }
-
- *result_desc = ret_desc;
break;
case ACPI_TYPE_STRING:
- *result_desc = obj_desc;
- break;
+ /*
+ * Create a new Buffer object
+ * Size will be the string length
+ */
+ ret_desc = acpi_ut_create_buffer_object ((acpi_size) obj_desc->string.length);
+ if (!ret_desc) {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
- case ACPI_TYPE_BUFFER:
- *result_desc = obj_desc;
+ /* Copy the string to the buffer */
+
+ new_buf = ret_desc->buffer.pointer;
+ ACPI_STRNCPY ((char *) new_buf, (char *) obj_desc->string.pointer,
+ obj_desc->string.length);
break;
default:
- return (AE_TYPE);
- break;
- }
+ return_ACPI_STATUS (AE_TYPE);
+ }
+
+ /* Mark buffer initialized */
+
+ ret_desc->common.flags |= AOPOBJ_DATA_VALID;
+
+ /*
+ * If we are about to overwrite the original object on the operand stack,
+ * we must remove a reference on the original object because we are
+ * essentially removing it from the stack.
+ */
+ if (*result_desc == obj_desc) {
+ if (walk_state->opcode != AML_STORE_OP) {
+ acpi_ut_remove_reference (obj_desc);
+ }
+ }
- return (AE_OK);
+ *result_desc = ret_desc;
+ return_ACPI_STATUS (AE_OK);
}
/*******************************************************************************
*
- * FUNCTION: Acpi_ex_convert_ascii
+ * FUNCTION: acpi_ex_convert_ascii
*
- * PARAMETERS: Integer
+ * PARAMETERS: Integer - Value to be converted
+ * Base - 10 or 16
+ * String - Where the string is returned
+ * data_width - Size of data item to be converted
*
* RETURN: Actual string length
*
- * DESCRIPTION: Convert an ACPI Integer to a hex string
+ * DESCRIPTION: Convert an ACPI Integer to a hex or decimal string
*
******************************************************************************/
u32
acpi_ex_convert_to_ascii (
- acpi_integer integer,
- u32 base,
- u8 *string)
+ acpi_integer integer,
+ u32 base,
+ u8 *string,
+ u8 data_width)
{
- u32 i;
- u32 j;
- u32 k = 0;
- u8 hex_digit;
- acpi_integer digit;
- u32 remainder;
- u32 length = sizeof (acpi_integer);
- u8 leading_zero = TRUE;
+ u32 i;
+ u32 j;
+ u32 k = 0;
+ char hex_digit;
+ acpi_integer digit;
+ u32 remainder;
+ u32 length;
+ u8 leading_zero;
- FUNCTION_ENTRY ();
+ ACPI_FUNCTION_ENTRY ();
+
+ if (data_width < sizeof (acpi_integer)) {
+ leading_zero = FALSE;
+ length = data_width;
+ }
+ else {
+ leading_zero = TRUE;
+ length = sizeof (acpi_integer);
+ }
switch (base) {
@@ -313,7 +338,7 @@
digit = integer;
for (j = 1; j < i; j++) {
- acpi_ut_short_divide (&digit, 10, &digit, &remainder);
+ (void) acpi_ut_short_divide (&digit, 10, &digit, &remainder);
}
/* Create the decimal digit */
@@ -323,7 +348,7 @@
}
if (!leading_zero) {
- string[k] = (u8) (ASCII_ZERO + remainder);
+ string[k] = (u8) (ACPI_ASCII_ZERO + remainder);
k++;
}
}
@@ -336,12 +361,12 @@
for (i = 0, j = ((length * 2) -1); i < (length * 2); i++, j--) {
hex_digit = acpi_ut_hex_to_ascii_char (integer, (j * 4));
- if (hex_digit != ASCII_ZERO) {
+ if (hex_digit != ACPI_ASCII_ZERO) {
leading_zero = FALSE;
}
if (!leading_zero) {
- string[k] = hex_digit;
+ string[k] = (u8) hex_digit;
k++;
}
}
@@ -358,22 +383,22 @@
* Finally, null terminate the string and return the length
*/
if (!k) {
- string [0] = ASCII_ZERO;
+ string [0] = ACPI_ASCII_ZERO;
k = 1;
}
- string [k] = 0;
+ string [k] = 0;
return (k);
}
/*******************************************************************************
*
- * FUNCTION: Acpi_ex_convert_to_string
+ * FUNCTION: acpi_ex_convert_to_string
*
- * PARAMETERS: *Obj_desc - Object to be converted. Must be an
+ * PARAMETERS: *obj_desc - Object to be converted. Must be an
* Integer, Buffer, or String
- * Walk_state - Current method state
+ * walk_state - Current method state
*
* RETURN: Status
*
@@ -383,39 +408,39 @@
acpi_status
acpi_ex_convert_to_string (
- acpi_operand_object *obj_desc,
- acpi_operand_object **result_desc,
- u32 base,
- u32 max_length,
- acpi_walk_state *walk_state)
+ union acpi_operand_object *obj_desc,
+ union acpi_operand_object **result_desc,
+ u32 base,
+ u32 max_length,
+ struct acpi_walk_state *walk_state)
{
- acpi_operand_object *ret_desc;
- u32 i;
- u32 index;
- u32 string_length;
- u32 integer_size = sizeof (acpi_integer);
- u8 *new_buf;
- u8 *pointer;
+ union acpi_operand_object *ret_desc;
+ u32 i;
+ u32 string_length;
+ u8 *new_buf;
+ u8 *pointer;
- FUNCTION_ENTRY ();
+ ACPI_FUNCTION_TRACE_PTR ("ex_convert_to_string", obj_desc);
- switch (obj_desc->common.type) {
- case ACPI_TYPE_INTEGER:
+ switch (ACPI_GET_OBJECT_TYPE (obj_desc)) {
+ case ACPI_TYPE_STRING:
- /* Handle both ACPI 1.0 and ACPI 2.0 Integer widths */
+ if (max_length >= obj_desc->string.length) {
+ *result_desc = obj_desc;
+ return_ACPI_STATUS (AE_OK);
+ }
+ else {
+ /* Must copy the string first and then truncate it */
- if (walk_state->method_node->flags & ANOBJ_DATA_WIDTH_32) {
- /*
- * We are running a method that exists in a 32-bit ACPI table.
- * Truncate the value to 32 bits by zeroing out the upper
- * 32-bit field
- */
- integer_size = sizeof (u32);
+ return_ACPI_STATUS (AE_NOT_IMPLEMENTED);
}
- string_length = integer_size * 2;
+
+ case ACPI_TYPE_INTEGER:
+
+ string_length = acpi_gbl_integer_byte_width * 2;
if (base == 10) {
string_length = ACPI_MAX_DECIMAL_DIGITS;
}
@@ -425,23 +450,22 @@
*/
ret_desc = acpi_ut_create_internal_object (ACPI_TYPE_STRING);
if (!ret_desc) {
- return (AE_NO_MEMORY);
+ return_ACPI_STATUS (AE_NO_MEMORY);
}
/* Need enough space for one ASCII integer plus null terminator */
- new_buf = ACPI_MEM_CALLOCATE (string_length + 1);
+ new_buf = ACPI_MEM_CALLOCATE ((acpi_size) string_length + 1);
if (!new_buf) {
- REPORT_ERROR
- (("Ex_convert_to_string: Buffer allocation failure\n"));
+ ACPI_REPORT_ERROR
+ (("ex_convert_to_string: Buffer allocation failure\n"));
acpi_ut_remove_reference (ret_desc);
- return (AE_NO_MEMORY);
+ return_ACPI_STATUS (AE_NO_MEMORY);
}
-
/* Convert */
- i = acpi_ex_convert_to_ascii (obj_desc->integer.value, base, new_buf);
+ i = acpi_ex_convert_to_ascii (obj_desc->integer.value, base, new_buf, sizeof (acpi_integer));
/* Null terminate at the correct place */
@@ -455,29 +479,25 @@
}
ret_desc->buffer.pointer = new_buf;
-
- /* Return the new buffer descriptor */
-
- if (*result_desc == obj_desc) {
- if (walk_state->opcode != AML_STORE_OP) {
- acpi_ut_remove_reference (obj_desc);
- }
- }
-
- *result_desc = ret_desc;
break;
case ACPI_TYPE_BUFFER:
- string_length = obj_desc->buffer.length * 3;
- if (base == 10) {
- string_length = obj_desc->buffer.length * 4;
+ /* Find the string length */
+
+ pointer = obj_desc->buffer.pointer;
+ for (string_length = 0; string_length < obj_desc->buffer.length; string_length++) {
+ /* Exit on null terminator */
+
+ if (!pointer[string_length]) {
+ break;
+ }
}
if (max_length > ACPI_MAX_STRING_CONVERSION) {
if (string_length > ACPI_MAX_STRING_CONVERSION) {
- return (AE_AML_STRING_LIMIT);
+ return_ACPI_STATUS (AE_AML_STRING_LIMIT);
}
}
@@ -486,7 +506,7 @@
*/
ret_desc = acpi_ut_create_internal_object (ACPI_TYPE_STRING);
if (!ret_desc) {
- return (AE_NO_MEMORY);
+ return_ACPI_STATUS (AE_NO_MEMORY);
}
/* String length is the lesser of the Max or the actual length */
@@ -495,92 +515,77 @@
string_length = max_length;
}
- new_buf = ACPI_MEM_CALLOCATE (string_length + 1);
+ new_buf = ACPI_MEM_CALLOCATE ((acpi_size) string_length + 1);
if (!new_buf) {
- REPORT_ERROR
- (("Ex_convert_to_string: Buffer allocation failure\n"));
+ ACPI_REPORT_ERROR
+ (("ex_convert_to_string: Buffer allocation failure\n"));
acpi_ut_remove_reference (ret_desc);
- return (AE_NO_MEMORY);
+ return_ACPI_STATUS (AE_NO_MEMORY);
}
- /*
- * Convert each byte of the buffer to two ASCII characters plus a space.
- */
- pointer = obj_desc->buffer.pointer;
- index = 0;
- for (i = 0, index = 0; i < obj_desc->buffer.length; i++) {
- index = acpi_ex_convert_to_ascii (pointer[i], base, &new_buf[index]);
+ /* Copy the appropriate number of buffer characters */
- new_buf[index] = ' ';
- index++;
- }
+ ACPI_MEMCPY (new_buf, pointer, string_length);
/* Null terminate */
- new_buf [index-1] = 0;
+ new_buf [string_length] = 0;
ret_desc->buffer.pointer = new_buf;
- ret_desc->string.length = STRLEN ((char *) new_buf);
-
-
- /* Return the new buffer descriptor */
-
- if (*result_desc == obj_desc) {
- if (walk_state->opcode != AML_STORE_OP) {
- acpi_ut_remove_reference (obj_desc);
- }
- }
-
- *result_desc = ret_desc;
+ ret_desc->string.length = string_length;
break;
- case ACPI_TYPE_STRING:
-
- if (max_length >= obj_desc->string.length) {
- *result_desc = obj_desc;
- }
+ default:
+ return_ACPI_STATUS (AE_TYPE);
+ }
- else {
- /* Must copy the string first and then truncate it */
- return (AE_NOT_IMPLEMENTED);
+ /*
+ * If we are about to overwrite the original object on the operand stack,
+ * we must remove a reference on the original object because we are
+ * essentially removing it from the stack.
+ */
+ if (*result_desc == obj_desc) {
+ if (walk_state->opcode != AML_STORE_OP) {
+ acpi_ut_remove_reference (obj_desc);
}
- break;
-
-
- default:
- return (AE_TYPE);
- break;
- }
+ }
- return (AE_OK);
+ *result_desc = ret_desc;
+ return_ACPI_STATUS (AE_OK);
}
/*******************************************************************************
*
- * FUNCTION: Acpi_ex_convert_to_target_type
+ * FUNCTION: acpi_ex_convert_to_target_type
*
- * PARAMETERS: *Obj_desc - Object to be converted.
- * Walk_state - Current method state
+ * PARAMETERS: destination_type - Current type of the destination
+ * source_desc - Source object to be converted.
+ * walk_state - Current method state
*
* RETURN: Status
*
- * DESCRIPTION:
+ * DESCRIPTION: Implements "implicit conversion" rules for storing an object.
*
******************************************************************************/
acpi_status
acpi_ex_convert_to_target_type (
- acpi_object_type8 destination_type,
- acpi_operand_object **obj_desc,
- acpi_walk_state *walk_state)
+ acpi_object_type destination_type,
+ union acpi_operand_object *source_desc,
+ union acpi_operand_object **result_desc,
+ struct acpi_walk_state *walk_state)
{
- acpi_status status = AE_OK;
+ acpi_status status = AE_OK;
+
+ ACPI_FUNCTION_TRACE ("ex_convert_to_target_type");
- FUNCTION_TRACE ("Ex_convert_to_target_type");
+ /* Default behavior */
+
+ *result_desc = source_desc;
/*
* If required by the target,
@@ -592,7 +597,7 @@
case ARGI_INTEGER_REF: /* Handles Increment, Decrement cases */
switch (destination_type) {
- case INTERNAL_TYPE_REGION_FIELD:
+ case ACPI_TYPE_LOCAL_REGION_FIELD:
/*
* Named field can always handle conversions
*/
@@ -601,10 +606,10 @@
default:
/* No conversion allowed for these types */
- if (destination_type != (*obj_desc)->common.type) {
- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
- "Target does not allow conversion of type %s to %s\n",
- acpi_ut_get_type_name ((*obj_desc)->common.type),
+ if (destination_type != ACPI_GET_OBJECT_TYPE (source_desc)) {
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+ "Explicit operator, will store (%s) over existing type (%s)\n",
+ acpi_ut_get_object_type_name (source_desc),
acpi_ut_get_type_name (destination_type)));
status = AE_TYPE;
}
@@ -617,13 +622,13 @@
switch (destination_type) {
case ACPI_TYPE_INTEGER:
case ACPI_TYPE_BUFFER_FIELD:
- case INTERNAL_TYPE_BANK_FIELD:
- case INTERNAL_TYPE_INDEX_FIELD:
+ case ACPI_TYPE_LOCAL_BANK_FIELD:
+ case ACPI_TYPE_LOCAL_INDEX_FIELD:
/*
* These types require an Integer operand. We can convert
* a Buffer or a String to an Integer if necessary.
*/
- status = acpi_ex_convert_to_integer (*obj_desc, obj_desc, walk_state);
+ status = acpi_ex_convert_to_integer (source_desc, result_desc, walk_state);
break;
@@ -633,17 +638,22 @@
* The operand must be a String. We can convert an
* Integer or Buffer if necessary
*/
- status = acpi_ex_convert_to_string (*obj_desc, obj_desc, 16, ACPI_UINT32_MAX, walk_state);
+ status = acpi_ex_convert_to_string (source_desc, result_desc, 16, ACPI_UINT32_MAX, walk_state);
break;
case ACPI_TYPE_BUFFER:
/*
- * The operand must be a String. We can convert an
- * Integer or Buffer if necessary
+ * The operand must be a Buffer. We can convert an
+ * Integer or String if necessary
*/
- status = acpi_ex_convert_to_buffer (*obj_desc, obj_desc, walk_state);
+ status = acpi_ex_convert_to_buffer (source_desc, result_desc, walk_state);
+ break;
+
+
+ default:
+ status = AE_AML_INTERNAL;
break;
}
break;
@@ -651,21 +661,20 @@
case ARGI_REFERENCE:
/*
- * Create_xxxx_field cases - we are storing the field object into the name
+ * create_xxxx_field cases - we are storing the field object into the name
*/
break;
default:
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
- "Unknown Target type ID 0x%X Op %s Dest_type %s\n",
+ "Unknown Target type ID 0x%X Op %s dest_type %s\n",
GET_CURRENT_ARG_TYPE (walk_state->op_info->runtime_args),
walk_state->op_info->name, acpi_ut_get_type_name (destination_type)));
status = AE_AML_INTERNAL;
}
-
/*
* Source-to-Target conversion semantics:
*
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)