[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [linux-2.6.18-xen] acpi: Fix a bug related to parse named objects



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1210769586 -3600
# Node ID d59a4aaf8615aea0ff42349f0d0367be641c36b0
# Parent  12bcbf80b8e4d2282429d5bab71749fb58b6643a
acpi: Fix a bug related to parse named objects

This patch is pulled from native linux, and is needed in our patchset
to make it run, otherwise will parse wrong _PSD info.

Fixed a problem with the Package operator where all named
references were created as object references and left otherwise
unresolved. According to the ACPI specification, a Package can
only contain Data Objects or references to control methods. The
implication is that named references to Data Objects (Integer,
Buffer, String, Package, BufferField, Field) should be resolved
immediately upon package creation. This is the approach taken
with this change. References to all other named objects (Methods,
Devices, Scopes, etc.) are all now properly created as reference
objects.

Signed-off-by: Bob Moore <robert.moore@xxxxxxxxx>
Signed-off-by: Len Brown <len.brown@xxxxxxxxx>
---
 drivers/acpi/dispatcher/dsobject.c |   91 ++++++++++++++++++++++++++++++++++---
 1 files changed, 85 insertions(+), 6 deletions(-)

diff -r 12bcbf80b8e4 -r d59a4aaf8615 drivers/acpi/dispatcher/dsobject.c
--- a/drivers/acpi/dispatcher/dsobject.c        Wed May 14 13:51:50 2008 +0100
+++ b/drivers/acpi/dispatcher/dsobject.c        Wed May 14 13:53:06 2008 +0100
@@ -137,6 +137,71 @@ acpi_ds_build_internal_object(struct acp
                                return_ACPI_STATUS(status);
                        }
                }
+
+               /* Special object resolution for elements of a package */
+
+               if ((op->common.parent->common.aml_opcode == AML_PACKAGE_OP) ||
+                   (op->common.parent->common.aml_opcode ==
+                    AML_VAR_PACKAGE_OP)) {
+                       /*
+                        * Attempt to resolve the node to a value before we 
insert it into
+                        * the package. If this is a reference to a common data 
type,
+                        * resolve it immediately. According to the ACPI spec, 
package
+                        * elements can only be "data objects" or method 
references.
+                        * Attempt to resolve to an Integer, Buffer, String or 
Package.
+                        * If cannot, return the named reference (for things 
like Devices,
+                        * Methods, etc.) Buffer Fields and Fields will resolve 
to simple
+                        * objects (int/buf/str/pkg).
+                        *
+                        * NOTE: References to things like Devices, Methods, 
Mutexes, etc.
+                        * will remain as named references. This behavior is 
not described
+                        * in the ACPI spec, but it appears to be an oversight.
+                        */
+                       obj_desc = (union acpi_operand_object *)op->common.node;
+
+                       status =
+                           acpi_ex_resolve_node_to_value(ACPI_CAST_INDIRECT_PTR
+                                                         (struct
+                                                          acpi_namespace_node,
+                                                          &obj_desc),
+                                                         walk_state);
+                       if (ACPI_FAILURE(status)) {
+                               return_ACPI_STATUS(status);
+                       }
+
+                       switch (op->common.node->type) {
+                               /*
+                                * For these types, we need the actual node, 
not the subobject.
+                                * However, the subobject got an extra 
reference count above.
+                                */
+                       case ACPI_TYPE_MUTEX:
+                       case ACPI_TYPE_METHOD:
+                       case ACPI_TYPE_POWER:
+                       case ACPI_TYPE_PROCESSOR:
+                       case ACPI_TYPE_EVENT:
+                       case ACPI_TYPE_REGION:
+                       case ACPI_TYPE_DEVICE:
+                       case ACPI_TYPE_THERMAL:
+
+                               obj_desc =
+                                   (union acpi_operand_object *)op->common.
+                                   node;
+                               break;
+
+                       default:
+                               break;
+                       }
+
+                       /*
+                        * If above resolved to an operand object, we are done. 
Otherwise,
+                        * we have a NS node, we must create the package entry 
as a named
+                        * reference.
+                        */
+                       if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) !=
+                           ACPI_DESC_TYPE_NAMED) {
+                               goto exit;
+                       }
+               }
        }
 
        /* Create and init a new internal ACPI object */
@@ -156,6 +221,7 @@ acpi_ds_build_internal_object(struct acp
                return_ACPI_STATUS(status);
        }
 
+      exit:
        *obj_desc_ptr = obj_desc;
        return_ACPI_STATUS(AE_OK);
 }
@@ -358,12 +424,25 @@ acpi_ds_build_internal_package_obj(struc
        arg = arg->common.next;
        for (i = 0; arg; i++) {
                if (arg->common.aml_opcode == AML_INT_RETURN_VALUE_OP) {
-
-                       /* Object (package or buffer) is already built */
-
-                       obj_desc->package.elements[i] =
-                           ACPI_CAST_PTR(union acpi_operand_object,
-                                         arg->common.node);
+                       if (arg->common.node->type == ACPI_TYPE_METHOD) {
+                               /*
+                                * A method reference "looks" to the parser to 
be a method
+                                * invocation, so we special case it here
+                                */
+                               arg->common.aml_opcode = AML_INT_NAMEPATH_OP;
+                               status =
+                                   acpi_ds_build_internal_object(walk_state,
+                                                                 arg,
+                                                                 &obj_desc->
+                                                                 package.
+                                                                 elements[i]);
+                       } else {
+                               /* This package element is already built, just 
get it */
+
+                               obj_desc->package.elements[i] =
+                                   ACPI_CAST_PTR(union acpi_operand_object,
+                                                 arg->common.node);
+                       }
                } else {
                        status = acpi_ds_build_internal_object(walk_state, arg,
                                                               &obj_desc->

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.