summaryrefslogtreecommitdiffstats
path: root/drivers/acpi/acpica/dsobject.c
diff options
context:
space:
mode:
authorBob Moore <robert.moore@intel.com>2010-07-06 10:37:13 +0800
committerLen Brown <len.brown@intel.com>2010-07-06 22:34:27 -0400
commit09079250db4d470f75eddcce31e0229c92d6c3bf (patch)
treec96fc293cf1954f09c101b192dbd048e6eece164 /drivers/acpi/acpica/dsobject.c
parent150dba38f0c3d2d5f5edc58145d202de08ed623c (diff)
downloadlinux-stable-09079250db4d470f75eddcce31e0229c92d6c3bf.tar.gz
linux-stable-09079250db4d470f75eddcce31e0229c92d6c3bf.tar.bz2
linux-stable-09079250db4d470f75eddcce31e0229c92d6c3bf.zip
ACPICA: Fix for Alias references within Package objects
This fixes a problem where a reference to an Alias within the definition of a Package was not always resolved properly. Aliases to objects like Processors, ThermalZones, etc. were resolved to the actual object instead of a reference to the object as it should be. Package objects are only allowed to contain integer, string, buffer, package, and reference objects. https://bugzilla.redhat.com/show_bug.cgi?id=608648 Signed-off-by: Bob Moore <robert.moore@intel.com> Signed-off-by: Lin Ming <ming.m.lin@intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/acpica/dsobject.c')
-rw-r--r--drivers/acpi/acpica/dsobject.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/acpi/acpica/dsobject.c b/drivers/acpi/acpica/dsobject.c
index 3607adcaf085..8e85f54a8e0e 100644
--- a/drivers/acpi/acpica/dsobject.c
+++ b/drivers/acpi/acpica/dsobject.c
@@ -81,6 +81,7 @@ acpi_ds_build_internal_object(struct acpi_walk_state *walk_state,
{
union acpi_operand_object *obj_desc;
acpi_status status;
+ acpi_object_type type;
ACPI_FUNCTION_TRACE(ds_build_internal_object);
@@ -172,7 +173,20 @@ acpi_ds_build_internal_object(struct acpi_walk_state *walk_state,
return_ACPI_STATUS(status);
}
- switch (op->common.node->type) {
+ /*
+ * Special handling for Alias objects. We need to setup the type
+ * and the Op->Common.Node to point to the Alias target. Note,
+ * Alias has at most one level of indirection internally.
+ */
+ type = op->common.node->type;
+ if (type == ACPI_TYPE_LOCAL_ALIAS) {
+ type = obj_desc->common.type;
+ op->common.node =
+ ACPI_CAST_PTR(struct acpi_namespace_node,
+ op->common.node->object);
+ }
+
+ switch (type) {
/*
* For these types, we need the actual node, not the subobject.
* However, the subobject did not get an extra reference count above.