|
@@ -88,72 +88,39 @@ acpi_status acpi_ex_create_alias(struct acpi_walk_state *walk_state)
|
|
|
}
|
|
|
|
|
|
/* Ensure that the target node is valid */
|
|
|
+
|
|
|
if (!target_node) {
|
|
|
return_ACPI_STATUS(AE_NULL_OBJECT);
|
|
|
}
|
|
|
|
|
|
- /*
|
|
|
- * For objects that can never change (i.e., the NS node will
|
|
|
- * permanently point to the same object), we can simply attach
|
|
|
- * the object to the new NS node. For other objects (such as
|
|
|
- * Integers, buffers, etc.), we have to point the Alias node
|
|
|
- * to the original Node.
|
|
|
- */
|
|
|
- switch (target_node->type) {
|
|
|
-
|
|
|
- /* For these types, the sub-object can change dynamically via a Store */
|
|
|
-
|
|
|
- case ACPI_TYPE_INTEGER:
|
|
|
- case ACPI_TYPE_STRING:
|
|
|
- case ACPI_TYPE_BUFFER:
|
|
|
- case ACPI_TYPE_PACKAGE:
|
|
|
- case ACPI_TYPE_BUFFER_FIELD:
|
|
|
- /*
|
|
|
- * These types open a new scope, so we need the NS node in order to access
|
|
|
- * any children.
|
|
|
- */
|
|
|
- case ACPI_TYPE_DEVICE:
|
|
|
- case ACPI_TYPE_POWER:
|
|
|
- case ACPI_TYPE_PROCESSOR:
|
|
|
- case ACPI_TYPE_THERMAL:
|
|
|
- case ACPI_TYPE_LOCAL_SCOPE:
|
|
|
- /*
|
|
|
- * The new alias has the type ALIAS and points to the original
|
|
|
- * NS node, not the object itself.
|
|
|
- */
|
|
|
- alias_node->type = ACPI_TYPE_LOCAL_ALIAS;
|
|
|
- alias_node->object =
|
|
|
- ACPI_CAST_PTR(union acpi_operand_object, target_node);
|
|
|
- break;
|
|
|
+ /* Construct the alias object (a namespace node) */
|
|
|
|
|
|
+ switch (target_node->type) {
|
|
|
case ACPI_TYPE_METHOD:
|
|
|
/*
|
|
|
- * Control method aliases need to be differentiated
|
|
|
+ * Control method aliases need to be differentiated with
|
|
|
+ * a special type
|
|
|
*/
|
|
|
alias_node->type = ACPI_TYPE_LOCAL_METHOD_ALIAS;
|
|
|
- alias_node->object =
|
|
|
- ACPI_CAST_PTR(union acpi_operand_object, target_node);
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
-
|
|
|
- /* Attach the original source object to the new Alias Node */
|
|
|
-
|
|
|
/*
|
|
|
- * The new alias assumes the type of the target, and it points
|
|
|
- * to the same object. The reference count of the object has an
|
|
|
- * additional reference to prevent deletion out from under either the
|
|
|
- * target node or the alias Node
|
|
|
+ * All other object types.
|
|
|
+ *
|
|
|
+ * The new alias has the type ALIAS and points to the original
|
|
|
+ * NS node, not the object itself.
|
|
|
*/
|
|
|
- status = acpi_ns_attach_object(alias_node,
|
|
|
- acpi_ns_get_attached_object
|
|
|
- (target_node),
|
|
|
- target_node->type);
|
|
|
+ alias_node->type = ACPI_TYPE_LOCAL_ALIAS;
|
|
|
+ alias_node->object =
|
|
|
+ ACPI_CAST_PTR(union acpi_operand_object, target_node);
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
/* Since both operands are Nodes, we don't need to delete them */
|
|
|
|
|
|
+ alias_node->object =
|
|
|
+ ACPI_CAST_PTR(union acpi_operand_object, target_node);
|
|
|
return_ACPI_STATUS(status);
|
|
|
}
|
|
|
|