patch-2.4.22 linux-2.4.22/drivers/acpi/executer/exmisc.c
Next file: linux-2.4.22/drivers/acpi/executer/exmutex.c
Previous file: linux-2.4.22/drivers/acpi/executer/exfldio.c
Back to the patch index
Back to the overall index
- Lines: 565
- Date:
2003-08-25 04:44:41.000000000 -0700
- Orig file:
linux-2.4.21/drivers/acpi/executer/exmisc.c
- Orig date:
2001-10-24 14:06:22.000000000 -0700
diff -urN linux-2.4.21/drivers/acpi/executer/exmisc.c linux-2.4.22/drivers/acpi/executer/exmisc.c
@@ -2,122 +2,229 @@
/******************************************************************************
*
* Module Name: exmisc - ACPI AML (p-code) execution - specific opcodes
- * $Revision: 92 $
*
*****************************************************************************/
/*
- * 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 "acinterp.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 ("exmisc")
+ ACPI_MODULE_NAME ("exmisc")
/*******************************************************************************
*
- * FUNCTION: Acpi_ex_get_object_reference
+ * FUNCTION: acpi_ex_get_object_reference
*
- * PARAMETERS: Obj_desc - Create a reference to this object
- * Return_desc - Where to store the reference
+ * PARAMETERS: obj_desc - Create a reference to this object
+ * return_desc - Where to store the reference
+ * walk_state - Current state
*
* RETURN: Status
*
* DESCRIPTION: Obtain and return a "reference" to the target object
- * Common code for the Ref_of_op and the Cond_ref_of_op.
+ * Common code for the ref_of_op and the cond_ref_of_op.
*
******************************************************************************/
acpi_status
acpi_ex_get_object_reference (
- acpi_operand_object *obj_desc,
- acpi_operand_object **return_desc,
- acpi_walk_state *walk_state)
+ union acpi_operand_object *obj_desc,
+ union acpi_operand_object **return_desc,
+ struct acpi_walk_state *walk_state)
{
- acpi_status status = AE_OK;
+ union acpi_operand_object *reference_obj;
+ union acpi_operand_object *referenced_obj;
- FUNCTION_TRACE_PTR ("Ex_get_object_reference", obj_desc);
+ ACPI_FUNCTION_TRACE_PTR ("ex_get_object_reference", obj_desc);
- if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_INTERNAL)) {
- if (obj_desc->common.type != INTERNAL_TYPE_REFERENCE) {
- *return_desc = NULL;
- status = AE_TYPE;
- goto cleanup;
+ *return_desc = NULL;
+
+ switch (ACPI_GET_DESCRIPTOR_TYPE (obj_desc)) {
+ case ACPI_DESC_TYPE_OPERAND:
+
+ if (ACPI_GET_OBJECT_TYPE (obj_desc) != ACPI_TYPE_LOCAL_REFERENCE) {
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
}
/*
- * Not a Name -- an indirect name pointer would have
- * been converted to a direct name pointer in Acpi_ex_resolve_operands
+ * Must be a reference to a Local or Arg
*/
switch (obj_desc->reference.opcode) {
case AML_LOCAL_OP:
case AML_ARG_OP:
- *return_desc = (void *) acpi_ds_method_data_get_node (obj_desc->reference.opcode,
- obj_desc->reference.offset, walk_state);
+ /* The referenced object is the pseudo-node for the local/arg */
+
+ referenced_obj = obj_desc->reference.object;
break;
default:
- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "(Internal) Unknown Ref subtype %02x\n",
+ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown Reference subtype %X\n",
obj_desc->reference.opcode));
- *return_desc = NULL;
- status = AE_AML_INTERNAL;
- goto cleanup;
+ return_ACPI_STATUS (AE_AML_INTERNAL);
}
+ break;
- }
- else if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_NAMED)) {
- /* Must be a named object; Just return the Node */
+ case ACPI_DESC_TYPE_NAMED:
- *return_desc = obj_desc;
+ /*
+ * A named reference that has already been resolved to a Node
+ */
+ referenced_obj = obj_desc;
+ break;
+
+
+ default:
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Invalid descriptor type %X in %p\n",
+ ACPI_GET_DESCRIPTOR_TYPE (obj_desc), obj_desc));
+ return_ACPI_STATUS (AE_TYPE);
}
- else {
- *return_desc = NULL;
- status = AE_TYPE;
+
+ /* Create a new reference object */
+
+ reference_obj = acpi_ut_create_internal_object (ACPI_TYPE_LOCAL_REFERENCE);
+ if (!reference_obj) {
+ return_ACPI_STATUS (AE_NO_MEMORY);
}
+ reference_obj->reference.opcode = AML_REF_OF_OP;
+ reference_obj->reference.object = referenced_obj;
+ *return_desc = reference_obj;
-cleanup:
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Object %p Type [%s], returning Reference %p\n",
+ obj_desc, acpi_ut_get_object_type_name (obj_desc), *return_desc));
- ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Obj=%p Ref=%p\n", obj_desc, *return_desc));
- return_ACPI_STATUS (status);
+ return_ACPI_STATUS (AE_OK);
}
/*******************************************************************************
*
- * FUNCTION: Acpi_ex_do_concatenate
+ * FUNCTION: acpi_ex_concat_template
*
- * 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 walk state
+ * walk_state - Current walk state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Concatenate two resource templates
+ *
+ ******************************************************************************/
+
+acpi_status
+acpi_ex_concat_template (
+ union acpi_operand_object *obj_desc1,
+ union acpi_operand_object *obj_desc2,
+ union acpi_operand_object **actual_return_desc,
+ struct acpi_walk_state *walk_state)
+{
+ union acpi_operand_object *return_desc;
+ u8 *new_buf;
+ u8 *end_tag1;
+ u8 *end_tag2;
+ acpi_size length1;
+ acpi_size length2;
+
+
+ ACPI_FUNCTION_TRACE ("ex_concat_template");
+
+
+ /* Find the end_tags in each resource template */
+
+ end_tag1 = acpi_ut_get_resource_end_tag (obj_desc1);
+ end_tag2 = acpi_ut_get_resource_end_tag (obj_desc2);
+ if (!end_tag1 || !end_tag2) {
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
+ }
+
+ /* Compute the length of each part */
+
+ length1 = ACPI_PTR_DIFF (end_tag1, obj_desc1->buffer.pointer);
+ length2 = ACPI_PTR_DIFF (end_tag2, obj_desc2->buffer.pointer) +
+ 2; /* Size of END_TAG */
+
+ /* Create a new buffer object for the result */
+
+ return_desc = acpi_ut_create_buffer_object (length1 + length2);
+ if (!return_desc) {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ /* Copy the templates to the new descriptor */
+
+ new_buf = return_desc->buffer.pointer;
+ ACPI_MEMCPY (new_buf, obj_desc1->buffer.pointer, length1);
+ ACPI_MEMCPY (new_buf + length1, obj_desc2->buffer.pointer, length2);
+
+ /* Compute the new checksum */
+
+ new_buf[return_desc->buffer.length - 1] =
+ acpi_ut_generate_checksum (return_desc->buffer.pointer,
+ (return_desc->buffer.length - 1));
+
+ /* Return the completed template descriptor */
+
+ *actual_return_desc = return_desc;
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: acpi_ex_do_concatenate
+ *
+ * PARAMETERS: obj_desc1 - First source object
+ * obj_desc2 - Second source object
+ * actual_return_desc - Where to place the return object
+ * walk_state - Current walk state
*
* RETURN: Status
*
@@ -127,75 +234,54 @@
acpi_status
acpi_ex_do_concatenate (
- acpi_operand_object *obj_desc,
- acpi_operand_object *obj_desc2,
- acpi_operand_object **actual_return_desc,
- acpi_walk_state *walk_state)
+ union acpi_operand_object *obj_desc1,
+ union acpi_operand_object *obj_desc2,
+ union acpi_operand_object **actual_return_desc,
+ struct acpi_walk_state *walk_state)
{
- acpi_status status;
- u32 i;
- acpi_integer this_integer;
- acpi_operand_object *return_desc;
- NATIVE_CHAR *new_buf;
- u32 integer_size = sizeof (acpi_integer);
+ acpi_status status;
+ u32 i;
+ acpi_integer this_integer;
+ union acpi_operand_object *return_desc;
+ char *new_buf;
- FUNCTION_ENTRY ();
+ ACPI_FUNCTION_ENTRY ();
/*
* There are three cases to handle:
- * 1) Two Integers concatenated to produce a buffer
- * 2) Two Strings concatenated to produce a string
- * 3) Two Buffers concatenated to produce a buffer
+ *
+ * 1) Two Integers concatenated to produce a new Buffer
+ * 2) Two Strings concatenated to produce a new String
+ * 3) Two Buffers concatenated to produce a new Buffer
*/
- switch (obj_desc->common.type) {
+ switch (ACPI_GET_OBJECT_TYPE (obj_desc1)) {
case ACPI_TYPE_INTEGER:
- /* 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);
- }
-
- /* Result of two integers is a buffer */
+ /* Result of two Integers is a Buffer */
+ /* Need enough buffer space for two integers */
- return_desc = acpi_ut_create_internal_object (ACPI_TYPE_BUFFER);
+ return_desc = acpi_ut_create_buffer_object (acpi_gbl_integer_byte_width * 2);
if (!return_desc) {
return (AE_NO_MEMORY);
}
- /* Need enough space for two integers */
-
- return_desc->buffer.length = integer_size * 2;
- new_buf = ACPI_MEM_CALLOCATE (return_desc->buffer.length);
- if (!new_buf) {
- REPORT_ERROR
- (("Ex_do_concatenate: Buffer allocation failure\n"));
- status = AE_NO_MEMORY;
- goto cleanup;
- }
-
- return_desc->buffer.pointer = (u8 *) new_buf;
+ new_buf = (char *) return_desc->buffer.pointer;
/* Convert the first integer */
- this_integer = obj_desc->integer.value;
- for (i = 0; i < integer_size; i++) {
- new_buf[i] = (u8) this_integer;
+ this_integer = obj_desc1->integer.value;
+ for (i = 0; i < acpi_gbl_integer_byte_width; i++) {
+ new_buf[i] = (char) this_integer;
this_integer >>= 8;
}
/* Convert the second integer */
this_integer = obj_desc2->integer.value;
- for (; i < (integer_size * 2); i++) {
- new_buf[i] = (u8) this_integer;
+ for (; i < (ACPI_MUL_2 (acpi_gbl_integer_byte_width)); i++) {
+ new_buf[i] = (char) this_integer;
this_integer >>= 8;
}
@@ -204,6 +290,8 @@
case ACPI_TYPE_STRING:
+ /* Result of two Strings is a String */
+
return_desc = acpi_ut_create_internal_object (ACPI_TYPE_STRING);
if (!return_desc) {
return (AE_NO_MEMORY);
@@ -211,66 +299,60 @@
/* Operand0 is string */
- new_buf = ACPI_MEM_ALLOCATE (obj_desc->string.length +
- obj_desc2->string.length + 1);
+ new_buf = ACPI_MEM_CALLOCATE ((acpi_size) obj_desc1->string.length +
+ (acpi_size) obj_desc2->string.length + 1);
if (!new_buf) {
- REPORT_ERROR
- (("Ex_do_concatenate: String allocation failure\n"));
+ ACPI_REPORT_ERROR
+ (("ex_do_concatenate: String allocation failure\n"));
status = AE_NO_MEMORY;
goto cleanup;
}
- STRCPY (new_buf, obj_desc->string.pointer);
- STRCPY (new_buf + obj_desc->string.length,
+ /* Concatenate the strings */
+
+ ACPI_STRCPY (new_buf, obj_desc1->string.pointer);
+ ACPI_STRCPY (new_buf + obj_desc1->string.length,
obj_desc2->string.pointer);
- /* Point the return object to the new string */
+ /* Complete the String object initialization */
return_desc->string.pointer = new_buf;
- return_desc->string.length = obj_desc->string.length +=
- obj_desc2->string.length;
+ return_desc->string.length = obj_desc1->string.length +
+ obj_desc2->string.length;
break;
case ACPI_TYPE_BUFFER:
- /* Operand0 is a buffer */
+ /* Result of two Buffers is a Buffer */
- return_desc = acpi_ut_create_internal_object (ACPI_TYPE_BUFFER);
+ return_desc = acpi_ut_create_buffer_object (
+ (acpi_size) obj_desc1->buffer.length +
+ (acpi_size) obj_desc2->buffer.length);
if (!return_desc) {
return (AE_NO_MEMORY);
}
- new_buf = ACPI_MEM_ALLOCATE (obj_desc->buffer.length +
- obj_desc2->buffer.length);
- if (!new_buf) {
- REPORT_ERROR
- (("Ex_do_concatenate: Buffer allocation failure\n"));
- status = AE_NO_MEMORY;
- goto cleanup;
- }
+ new_buf = (char *) return_desc->buffer.pointer;
- MEMCPY (new_buf, obj_desc->buffer.pointer,
- obj_desc->buffer.length);
- MEMCPY (new_buf + obj_desc->buffer.length, obj_desc2->buffer.pointer,
- obj_desc2->buffer.length);
+ /* Concatenate the buffers */
- /*
- * Point the return object to the new buffer
- */
+ ACPI_MEMCPY (new_buf, obj_desc1->buffer.pointer,
+ obj_desc1->buffer.length);
+ ACPI_MEMCPY (new_buf + obj_desc1->buffer.length, obj_desc2->buffer.pointer,
+ obj_desc2->buffer.length);
- return_desc->buffer.pointer = (u8 *) new_buf;
- return_desc->buffer.length = obj_desc->buffer.length +
- obj_desc2->buffer.length;
break;
default:
+
+ /* Invalid object type, should not happen here */
+
status = AE_AML_INTERNAL;
return_desc = NULL;
}
-
*actual_return_desc = return_desc;
return (AE_OK);
@@ -284,11 +366,11 @@
/*******************************************************************************
*
- * FUNCTION: Acpi_ex_do_math_op
+ * FUNCTION: acpi_ex_do_math_op
*
* PARAMETERS: Opcode - AML opcode
* Operand0 - Integer operand #0
- * Operand0 - Integer operand #1
+ * Operand1 - Integer operand #1
*
* RETURN: Integer result of the operation
*
@@ -300,9 +382,9 @@
acpi_integer
acpi_ex_do_math_op (
- u16 opcode,
- acpi_integer operand0,
- acpi_integer operand1)
+ u16 opcode,
+ acpi_integer operand0,
+ acpi_integer operand1)
{
@@ -342,12 +424,12 @@
return (operand0 * operand1);
- case AML_SHIFT_LEFT_OP: /* Shift_left (Operand, Shift_count, Result) */
+ case AML_SHIFT_LEFT_OP: /* shift_left (Operand, shift_count, Result) */
return (operand0 << operand1);
- case AML_SHIFT_RIGHT_OP: /* Shift_right (Operand, Shift_count, Result) */
+ case AML_SHIFT_RIGHT_OP: /* shift_right (Operand, shift_count, Result) */
return (operand0 >> operand1);
@@ -365,11 +447,11 @@
/*******************************************************************************
*
- * FUNCTION: Acpi_ex_do_logical_op
+ * FUNCTION: acpi_ex_do_logical_op
*
* PARAMETERS: Opcode - AML opcode
* Operand0 - Integer operand #0
- * Operand0 - Integer operand #1
+ * Operand1 - Integer operand #1
*
* RETURN: TRUE/FALSE result of the operation
*
@@ -386,9 +468,9 @@
u8
acpi_ex_do_logical_op (
- u16 opcode,
- acpi_integer operand0,
- acpi_integer operand1)
+ u16 opcode,
+ acpi_integer operand0,
+ acpi_integer operand1)
{
@@ -432,6 +514,9 @@
return (TRUE);
}
break;
+
+ default:
+ break;
}
return (FALSE);
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)