patch-2.4.0-prerelease linux/drivers/acpi/interpreter/amresnte.c

Next file: linux/drivers/acpi/interpreter/amresolv.c
Previous file: linux/drivers/acpi/interpreter/amregion.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.4.0-test12/linux/drivers/acpi/interpreter/amresnte.c linux/drivers/acpi/interpreter/amresnte.c
@@ -2,7 +2,7 @@
 /******************************************************************************
  *
  * Module Name: amresnte - AML Interpreter object resolution
- *              $Revision: 21 $
+ *              $Revision: 25 $
  *
  *****************************************************************************/
 
@@ -65,7 +65,9 @@
 
 ACPI_STATUS
 acpi_aml_resolve_node_to_value (
-	ACPI_NAMESPACE_NODE     **stack_ptr)
+	ACPI_NAMESPACE_NODE     **stack_ptr,
+	ACPI_WALK_STATE         *walk_state)
+
 {
 	ACPI_STATUS             status = AE_OK;
 	ACPI_OPERAND_OBJECT     *val_desc = NULL;
@@ -76,7 +78,7 @@
 	u8                      locked;
 	u8                      attached_aml_pointer = FALSE;
 	u8                      aml_opcode = 0;
-	u32                     temp_val;
+	ACPI_INTEGER            temp_val;
 	OBJECT_TYPE_INTERNAL    object_type;
 
 
@@ -114,8 +116,7 @@
 	 *  and Method locals and arguments have a pseudo-Node
 	 */
 	if (entry_type == ACPI_TYPE_DEVICE ||
-		entry_type == INTERNAL_TYPE_METHOD_ARGUMENT ||
-		entry_type == INTERNAL_TYPE_METHOD_LOCAL_VAR)
+		(node->flags & (ANOBJ_METHOD_ARG | ANOBJ_METHOD_LOCAL)))
 	{
 		return (AE_OK);
 	}
@@ -174,7 +175,6 @@
 
 		obj_desc = val_desc;
 		acpi_cm_add_reference (obj_desc);
-
 		break;
 
 
@@ -211,90 +211,18 @@
 	case ACPI_TYPE_NUMBER:
 
 		/*
-		 * An ACPI_TYPE_NUMBER can be either an object or an AML pointer
+		 * The Node has an attached internal object, make sure that it's a
+		 * number
 		 */
 
-		if (attached_aml_pointer) {
-			/*
-			 * The attachment points into the AML stream, get the number from
-			 * there.  The actual number is based upon the AML opcode
-			 *
-			 * Note: Word_op and DWord_op will not work properly if the
-			 *       processor's endianness does not match the AML's.
-			 */
-
-			switch (aml_opcode)
-			{
-
-			case AML_ZERO_OP:
-
-				temp_val = 0;
-				break;
-
-
-			case AML_ONE_OP:
-
-				temp_val = 1;
-				break;
-
-
-			case AML_ONES_OP:
-
-				temp_val = 0xFFFFFFFF;
-				break;
-
-
-			case AML_BYTE_OP:
-
-				temp_val = (u32) ((u8 *) val_desc)[1];
-				break;
-
-
-			case AML_WORD_OP:
-
-				MOVE_UNALIGNED16_TO_32 (&temp_val, &((u8 *) val_desc)[1]);
-				break;
-
-
-			case AML_DWORD_OP:
-
-				MOVE_UNALIGNED32_TO_32 (&temp_val, &((u8 *) val_desc)[1]);
-				break;
-
-
-			default:
-
-				return (AE_AML_BAD_OPCODE);
-
-			} /* switch */
-
-
-			/* Create and initialize a new object */
-
-			obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_NUMBER);
-			if (!obj_desc) {
-				return (AE_NO_MEMORY);
-			}
-
-			obj_desc->number.value = temp_val;
+		if (ACPI_TYPE_NUMBER != val_desc->common.type) {
+			return (AE_AML_OPERAND_TYPE);
 		}
 
-		else {
-			/*
-			 * The Node has an attached internal object, make sure that it's a
-			 * number
-			 */
-
-			if (ACPI_TYPE_NUMBER != val_desc->common.type) {
-				return (AE_AML_OPERAND_TYPE);
-			}
-
-			/* Return an additional reference to the object */
-
-			obj_desc = val_desc;
-			acpi_cm_add_reference (obj_desc);
-		}
+		/* Return an additional reference to the object */
 
+		obj_desc = val_desc;
+		acpi_cm_add_reference (obj_desc);
 		break;
 
 
@@ -331,7 +259,7 @@
 		 * Fill in the object specific details
 		 */
 		if (ACPI_TYPE_BUFFER == object_type) {
-			obj_desc->buffer.pointer = acpi_cm_callocate(val_desc->field.length);
+			obj_desc->buffer.pointer = acpi_cm_callocate (val_desc->field.length);
 			if (!obj_desc->buffer.pointer) {
 				acpi_cm_remove_reference(obj_desc);
 				return (AE_NO_MEMORY);
@@ -339,18 +267,15 @@
 
 			obj_desc->buffer.length = val_desc->field.length;
 
-			status = acpi_aml_access_named_field (ACPI_READ,
-					  (ACPI_HANDLE) node,
-					  obj_desc->buffer.pointer,
-					  obj_desc->buffer.length);
+			status = acpi_aml_access_named_field (ACPI_READ, (ACPI_HANDLE) node,
+					  obj_desc->buffer.pointer, obj_desc->buffer.length);
 
 			if (ACPI_FAILURE (status)) {
 				return (status);
 			}
 		}
 		else {
-			status = acpi_aml_access_named_field (ACPI_READ,
-					  (ACPI_HANDLE) node,
+			status = acpi_aml_access_named_field (ACPI_READ, (ACPI_HANDLE) node,
 					  &temp_val, sizeof (temp_val));
 
 			if (ACPI_FAILURE (status)) {
@@ -384,8 +309,7 @@
 		/* perform the update */
 
 		status = acpi_aml_access_named_field (ACPI_WRITE,
-				 val_desc->bank_field.bank_select,
-				 &val_desc->bank_field.value,
+				 val_desc->bank_field.bank_select, &val_desc->bank_field.value,
 				 sizeof (val_desc->bank_field.value));
 
 		acpi_aml_release_global_lock (locked);
@@ -404,6 +328,8 @@
 			return (status);
 		}
 
+		/* Create an object for the result */
+
 		obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_NUMBER);
 		if (!obj_desc) {
 			return (AE_NO_MEMORY);
@@ -431,10 +357,10 @@
 		locked = acpi_aml_acquire_global_lock (obj_desc->field_unit.lock_rule);
 
 		/* Perform the update */
+
 		status = acpi_aml_access_named_field (ACPI_WRITE,
-				 val_desc->index_field.index,
-				 &val_desc->index_field.value,
-				 sizeof (val_desc->index_field.value));
+				  val_desc->index_field.index, &val_desc->index_field.value,
+				  sizeof (val_desc->index_field.value));
 
 		acpi_aml_release_global_lock (locked);
 
@@ -444,13 +370,14 @@
 
 		/* Read Data value */
 
-		status = acpi_aml_access_named_field (ACPI_READ,
-				   val_desc->index_field.data,
-				   &temp_val, sizeof (temp_val));
+		status = acpi_aml_access_named_field (ACPI_READ, val_desc->index_field.data,
+				  &temp_val, sizeof (temp_val));
 		if (ACPI_FAILURE (status)) {
 			return (status);
 		}
 
+		/* Create an object for the result */
+
 		obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_NUMBER);
 		if (!obj_desc) {
 			return (AE_NO_MEMORY);
@@ -471,6 +398,8 @@
 			break;
 		}
 
+		/* Create object for result */
+
 		obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_ANY);
 		if (!obj_desc) {
 			return (AE_NO_MEMORY);
@@ -504,11 +433,61 @@
 		acpi_cm_add_reference (obj_desc);
 		break;
 
+
 	/* TYPE_Any is untyped, and thus there is no object associated with it */
 
 	case ACPI_TYPE_ANY:
 
 		return (AE_AML_OPERAND_TYPE);  /* Cannot be AE_TYPE */
+		break;
+
+
+	/*
+	 * The only named references allowed are named constants
+	 *
+	 * e.g.     Name (\OSFL, Ones)
+	 */
+	case INTERNAL_TYPE_REFERENCE:
+
+		switch (val_desc->reference.op_code)
+		{
+
+		case AML_ZERO_OP:
+
+			temp_val = 0;
+			break;
+
+
+		case AML_ONE_OP:
+
+			temp_val = 1;
+			break;
+
+
+		case AML_ONES_OP:
+
+			temp_val = ACPI_INTEGER_MAX;
+			break;
+
+
+		default:
+
+			return (AE_AML_BAD_OPCODE);
+		}
+
+		/* Create object for result */
+
+		obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_NUMBER);
+		if (!obj_desc) {
+			return (AE_NO_MEMORY);
+		}
+
+		obj_desc->number.value = temp_val;
+
+		/* Truncate value if we are executing from a 32-bit ACPI table */
+
+		acpi_aml_truncate_for32bit_table (obj_desc, walk_state);
+		break;
 
 
 	/* Default case is for unknown types */

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)