|
@@ -52,12 +52,6 @@
|
|
#define _COMPONENT ACPI_DISPATCHER
|
|
#define _COMPONENT ACPI_DISPATCHER
|
|
ACPI_MODULE_NAME("dsobject")
|
|
ACPI_MODULE_NAME("dsobject")
|
|
|
|
|
|
-/* Local prototypes */
|
|
|
|
-static acpi_status
|
|
|
|
-acpi_ds_build_internal_object(struct acpi_walk_state *walk_state,
|
|
|
|
- union acpi_parse_object *op,
|
|
|
|
- union acpi_operand_object **obj_desc_ptr);
|
|
|
|
-
|
|
|
|
#ifndef ACPI_NO_METHOD_EXECUTION
|
|
#ifndef ACPI_NO_METHOD_EXECUTION
|
|
/*******************************************************************************
|
|
/*******************************************************************************
|
|
*
|
|
*
|
|
@@ -73,15 +67,13 @@ acpi_ds_build_internal_object(struct acpi_walk_state *walk_state,
|
|
* Simple objects are any objects other than a package object!
|
|
* Simple objects are any objects other than a package object!
|
|
*
|
|
*
|
|
******************************************************************************/
|
|
******************************************************************************/
|
|
-
|
|
|
|
-static acpi_status
|
|
|
|
|
|
+acpi_status
|
|
acpi_ds_build_internal_object(struct acpi_walk_state *walk_state,
|
|
acpi_ds_build_internal_object(struct acpi_walk_state *walk_state,
|
|
union acpi_parse_object *op,
|
|
union acpi_parse_object *op,
|
|
union acpi_operand_object **obj_desc_ptr)
|
|
union acpi_operand_object **obj_desc_ptr)
|
|
{
|
|
{
|
|
union acpi_operand_object *obj_desc;
|
|
union acpi_operand_object *obj_desc;
|
|
acpi_status status;
|
|
acpi_status status;
|
|
- acpi_object_type type;
|
|
|
|
|
|
|
|
ACPI_FUNCTION_TRACE(ds_build_internal_object);
|
|
ACPI_FUNCTION_TRACE(ds_build_internal_object);
|
|
|
|
|
|
@@ -89,140 +81,47 @@ acpi_ds_build_internal_object(struct acpi_walk_state *walk_state,
|
|
if (op->common.aml_opcode == AML_INT_NAMEPATH_OP) {
|
|
if (op->common.aml_opcode == AML_INT_NAMEPATH_OP) {
|
|
/*
|
|
/*
|
|
* This is a named object reference. If this name was
|
|
* This is a named object reference. If this name was
|
|
- * previously looked up in the namespace, it was stored in this op.
|
|
|
|
- * Otherwise, go ahead and look it up now
|
|
|
|
|
|
+ * previously looked up in the namespace, it was stored in
|
|
|
|
+ * this op. Otherwise, go ahead and look it up now
|
|
*/
|
|
*/
|
|
if (!op->common.node) {
|
|
if (!op->common.node) {
|
|
- status = acpi_ns_lookup(walk_state->scope_info,
|
|
|
|
- op->common.value.string,
|
|
|
|
- ACPI_TYPE_ANY,
|
|
|
|
- ACPI_IMODE_EXECUTE,
|
|
|
|
- ACPI_NS_SEARCH_PARENT |
|
|
|
|
- ACPI_NS_DONT_OPEN_SCOPE, NULL,
|
|
|
|
- ACPI_CAST_INDIRECT_PTR(struct
|
|
|
|
- acpi_namespace_node,
|
|
|
|
- &(op->
|
|
|
|
- common.
|
|
|
|
- node)));
|
|
|
|
- if (ACPI_FAILURE(status)) {
|
|
|
|
-
|
|
|
|
- /* Check if we are resolving a named reference within a package */
|
|
|
|
-
|
|
|
|
- if ((status == AE_NOT_FOUND)
|
|
|
|
- && (acpi_gbl_enable_interpreter_slack)
|
|
|
|
- &&
|
|
|
|
- ((op->common.parent->common.aml_opcode ==
|
|
|
|
- AML_PACKAGE_OP)
|
|
|
|
- || (op->common.parent->common.aml_opcode ==
|
|
|
|
- AML_VARIABLE_PACKAGE_OP))) {
|
|
|
|
- /*
|
|
|
|
- * We didn't find the target and we are populating elements
|
|
|
|
- * of a package - ignore if slack enabled. Some ASL code
|
|
|
|
- * contains dangling invalid references in packages and
|
|
|
|
- * expects that no exception will be issued. Leave the
|
|
|
|
- * element as a null element. It cannot be used, but it
|
|
|
|
- * can be overwritten by subsequent ASL code - this is
|
|
|
|
- * typically the case.
|
|
|
|
- */
|
|
|
|
- ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
|
|
|
- "Ignoring unresolved reference in package [%4.4s]\n",
|
|
|
|
- walk_state->
|
|
|
|
- scope_info->scope.
|
|
|
|
- node->name.ascii));
|
|
|
|
-
|
|
|
|
- return_ACPI_STATUS(AE_OK);
|
|
|
|
- } else {
|
|
|
|
- ACPI_ERROR_NAMESPACE(op->common.value.
|
|
|
|
- string, status);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- 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_VARIABLE_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 =
|
|
|
|
- ACPI_CAST_PTR(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);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- * 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.
|
|
|
|
- *
|
|
|
|
- * TBD: should ex_resolve_node_to_value be changed to fix this?
|
|
|
|
- */
|
|
|
|
- case ACPI_TYPE_DEVICE:
|
|
|
|
- case ACPI_TYPE_THERMAL:
|
|
|
|
-
|
|
|
|
- acpi_ut_add_reference(op->common.node->object);
|
|
|
|
|
|
|
|
- /*lint -fallthrough */
|
|
|
|
- /*
|
|
|
|
- * For these types, we need the actual node, not the subobject.
|
|
|
|
- * The subobject got an extra reference count in ex_resolve_node_to_value.
|
|
|
|
- */
|
|
|
|
- case ACPI_TYPE_MUTEX:
|
|
|
|
- case ACPI_TYPE_METHOD:
|
|
|
|
- case ACPI_TYPE_POWER:
|
|
|
|
- case ACPI_TYPE_PROCESSOR:
|
|
|
|
- case ACPI_TYPE_EVENT:
|
|
|
|
- case ACPI_TYPE_REGION:
|
|
|
|
-
|
|
|
|
- /* We will create a reference object for these types below */
|
|
|
|
- break;
|
|
|
|
|
|
+ /* Check if we are resolving a named reference within a package */
|
|
|
|
|
|
- default:
|
|
|
|
|
|
+ if ((op->common.parent->common.aml_opcode ==
|
|
|
|
+ AML_PACKAGE_OP)
|
|
|
|
+ || (op->common.parent->common.aml_opcode ==
|
|
|
|
+ AML_VARIABLE_PACKAGE_OP)) {
|
|
/*
|
|
/*
|
|
- * All other types - the node was resolved to an actual
|
|
|
|
- * object, we are done.
|
|
|
|
|
|
+ * We won't resolve package elements here, we will do this
|
|
|
|
+ * after all ACPI tables are loaded into the namespace. This
|
|
|
|
+ * behavior supports both forward references to named objects
|
|
|
|
+ * and external references to objects in other tables.
|
|
*/
|
|
*/
|
|
- goto exit;
|
|
|
|
|
|
+ goto create_new_object;
|
|
|
|
+ } else {
|
|
|
|
+ status = acpi_ns_lookup(walk_state->scope_info,
|
|
|
|
+ op->common.value.string,
|
|
|
|
+ ACPI_TYPE_ANY,
|
|
|
|
+ ACPI_IMODE_EXECUTE,
|
|
|
|
+ ACPI_NS_SEARCH_PARENT |
|
|
|
|
+ ACPI_NS_DONT_OPEN_SCOPE,
|
|
|
|
+ NULL,
|
|
|
|
+ ACPI_CAST_INDIRECT_PTR
|
|
|
|
+ (struct
|
|
|
|
+ acpi_namespace_node,
|
|
|
|
+ &(op->common.node)));
|
|
|
|
+ if (ACPI_FAILURE(status)) {
|
|
|
|
+ ACPI_ERROR_NAMESPACE(op->common.value.
|
|
|
|
+ string, status);
|
|
|
|
+ return_ACPI_STATUS(status);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+create_new_object:
|
|
|
|
+
|
|
/* Create and init a new internal ACPI object */
|
|
/* Create and init a new internal ACPI object */
|
|
|
|
|
|
obj_desc = acpi_ut_create_internal_object((acpi_ps_get_opcode_info
|
|
obj_desc = acpi_ut_create_internal_object((acpi_ps_get_opcode_info
|
|
@@ -240,7 +139,27 @@ acpi_ds_build_internal_object(struct acpi_walk_state *walk_state,
|
|
return_ACPI_STATUS(status);
|
|
return_ACPI_STATUS(status);
|
|
}
|
|
}
|
|
|
|
|
|
-exit:
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Handling for unresolved package reference elements.
|
|
|
|
+ * These are elements that are namepaths.
|
|
|
|
+ */
|
|
|
|
+ if ((op->common.parent->common.aml_opcode == AML_PACKAGE_OP) ||
|
|
|
|
+ (op->common.parent->common.aml_opcode == AML_VARIABLE_PACKAGE_OP)) {
|
|
|
|
+ obj_desc->reference.resolved = TRUE;
|
|
|
|
+
|
|
|
|
+ if ((op->common.aml_opcode == AML_INT_NAMEPATH_OP) &&
|
|
|
|
+ !obj_desc->reference.node) {
|
|
|
|
+ /*
|
|
|
|
+ * Name was unresolved above.
|
|
|
|
+ * Get the prefix node for later lookup
|
|
|
|
+ */
|
|
|
|
+ obj_desc->reference.node =
|
|
|
|
+ walk_state->scope_info->scope.node;
|
|
|
|
+ obj_desc->reference.aml = op->common.aml;
|
|
|
|
+ obj_desc->reference.resolved = FALSE;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
*obj_desc_ptr = obj_desc;
|
|
*obj_desc_ptr = obj_desc;
|
|
return_ACPI_STATUS(status);
|
|
return_ACPI_STATUS(status);
|
|
}
|
|
}
|
|
@@ -349,200 +268,6 @@ acpi_ds_build_internal_buffer_obj(struct acpi_walk_state *walk_state,
|
|
return_ACPI_STATUS(AE_OK);
|
|
return_ACPI_STATUS(AE_OK);
|
|
}
|
|
}
|
|
|
|
|
|
-/*******************************************************************************
|
|
|
|
- *
|
|
|
|
- * FUNCTION: acpi_ds_build_internal_package_obj
|
|
|
|
- *
|
|
|
|
- * PARAMETERS: walk_state - Current walk state
|
|
|
|
- * op - Parser object to be translated
|
|
|
|
- * element_count - Number of elements in the package - this is
|
|
|
|
- * the num_elements argument to Package()
|
|
|
|
- * obj_desc_ptr - Where the ACPI internal object is returned
|
|
|
|
- *
|
|
|
|
- * RETURN: Status
|
|
|
|
- *
|
|
|
|
- * DESCRIPTION: Translate a parser Op package object to the equivalent
|
|
|
|
- * namespace object
|
|
|
|
- *
|
|
|
|
- * NOTE: The number of elements in the package will be always be the num_elements
|
|
|
|
- * count, regardless of the number of elements in the package list. If
|
|
|
|
- * num_elements is smaller, only that many package list elements are used.
|
|
|
|
- * if num_elements is larger, the Package object is padded out with
|
|
|
|
- * objects of type Uninitialized (as per ACPI spec.)
|
|
|
|
- *
|
|
|
|
- * Even though the ASL compilers do not allow num_elements to be smaller
|
|
|
|
- * than the Package list length (for the fixed length package opcode), some
|
|
|
|
- * BIOS code modifies the AML on the fly to adjust the num_elements, and
|
|
|
|
- * this code compensates for that. This also provides compatibility with
|
|
|
|
- * other AML interpreters.
|
|
|
|
- *
|
|
|
|
- ******************************************************************************/
|
|
|
|
-
|
|
|
|
-acpi_status
|
|
|
|
-acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state,
|
|
|
|
- union acpi_parse_object *op,
|
|
|
|
- u32 element_count,
|
|
|
|
- union acpi_operand_object **obj_desc_ptr)
|
|
|
|
-{
|
|
|
|
- union acpi_parse_object *arg;
|
|
|
|
- union acpi_parse_object *parent;
|
|
|
|
- union acpi_operand_object *obj_desc = NULL;
|
|
|
|
- acpi_status status = AE_OK;
|
|
|
|
- u32 i;
|
|
|
|
- u16 index;
|
|
|
|
- u16 reference_count;
|
|
|
|
-
|
|
|
|
- ACPI_FUNCTION_TRACE(ds_build_internal_package_obj);
|
|
|
|
-
|
|
|
|
- /* Find the parent of a possibly nested package */
|
|
|
|
-
|
|
|
|
- parent = op->common.parent;
|
|
|
|
- while ((parent->common.aml_opcode == AML_PACKAGE_OP) ||
|
|
|
|
- (parent->common.aml_opcode == AML_VARIABLE_PACKAGE_OP)) {
|
|
|
|
- parent = parent->common.parent;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- * If we are evaluating a Named package object "Name (xxxx, Package)",
|
|
|
|
- * the package object already exists, otherwise it must be created.
|
|
|
|
- */
|
|
|
|
- obj_desc = *obj_desc_ptr;
|
|
|
|
- if (!obj_desc) {
|
|
|
|
- obj_desc = acpi_ut_create_internal_object(ACPI_TYPE_PACKAGE);
|
|
|
|
- *obj_desc_ptr = obj_desc;
|
|
|
|
- if (!obj_desc) {
|
|
|
|
- return_ACPI_STATUS(AE_NO_MEMORY);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- obj_desc->package.node = parent->common.node;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- * Allocate the element array (array of pointers to the individual
|
|
|
|
- * objects) based on the num_elements parameter. Add an extra pointer slot
|
|
|
|
- * so that the list is always null terminated.
|
|
|
|
- */
|
|
|
|
- obj_desc->package.elements = ACPI_ALLOCATE_ZEROED(((acpi_size)
|
|
|
|
- element_count +
|
|
|
|
- 1) * sizeof(void *));
|
|
|
|
-
|
|
|
|
- if (!obj_desc->package.elements) {
|
|
|
|
- acpi_ut_delete_object_desc(obj_desc);
|
|
|
|
- return_ACPI_STATUS(AE_NO_MEMORY);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- obj_desc->package.count = element_count;
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- * Initialize the elements of the package, up to the num_elements count.
|
|
|
|
- * Package is automatically padded with uninitialized (NULL) elements
|
|
|
|
- * if num_elements is greater than the package list length. Likewise,
|
|
|
|
- * Package is truncated if num_elements is less than the list length.
|
|
|
|
- */
|
|
|
|
- arg = op->common.value.arg;
|
|
|
|
- arg = arg->common.next;
|
|
|
|
- for (i = 0; arg && (i < element_count); i++) {
|
|
|
|
- if (arg->common.aml_opcode == AML_INT_RETURN_VALUE_OP) {
|
|
|
|
- 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->package.
|
|
|
|
- elements[i]);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (*obj_desc_ptr) {
|
|
|
|
-
|
|
|
|
- /* Existing package, get existing reference count */
|
|
|
|
-
|
|
|
|
- reference_count =
|
|
|
|
- (*obj_desc_ptr)->common.reference_count;
|
|
|
|
- if (reference_count > 1) {
|
|
|
|
-
|
|
|
|
- /* Make new element ref count match original ref count */
|
|
|
|
-
|
|
|
|
- for (index = 0; index < (reference_count - 1);
|
|
|
|
- index++) {
|
|
|
|
- acpi_ut_add_reference((obj_desc->
|
|
|
|
- package.
|
|
|
|
- elements[i]));
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- arg = arg->common.next;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /* Check for match between num_elements and actual length of package_list */
|
|
|
|
-
|
|
|
|
- if (arg) {
|
|
|
|
- /*
|
|
|
|
- * num_elements was exhausted, but there are remaining elements in the
|
|
|
|
- * package_list. Truncate the package to num_elements.
|
|
|
|
- *
|
|
|
|
- * Note: technically, this is an error, from ACPI spec: "It is an error
|
|
|
|
- * for NumElements to be less than the number of elements in the
|
|
|
|
- * PackageList". However, we just print a message and
|
|
|
|
- * no exception is returned. This provides Windows compatibility. Some
|
|
|
|
- * BIOSs will alter the num_elements on the fly, creating this type
|
|
|
|
- * of ill-formed package object.
|
|
|
|
- */
|
|
|
|
- while (arg) {
|
|
|
|
- /*
|
|
|
|
- * We must delete any package elements that were created earlier
|
|
|
|
- * and are not going to be used because of the package truncation.
|
|
|
|
- */
|
|
|
|
- if (arg->common.node) {
|
|
|
|
- acpi_ut_remove_reference(ACPI_CAST_PTR
|
|
|
|
- (union
|
|
|
|
- acpi_operand_object,
|
|
|
|
- arg->common.node));
|
|
|
|
- arg->common.node = NULL;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /* Find out how many elements there really are */
|
|
|
|
-
|
|
|
|
- i++;
|
|
|
|
- arg = arg->common.next;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- ACPI_INFO(("Actual Package length (%u) is larger than "
|
|
|
|
- "NumElements field (%u), truncated",
|
|
|
|
- i, element_count));
|
|
|
|
- } else if (i < element_count) {
|
|
|
|
- /*
|
|
|
|
- * Arg list (elements) was exhausted, but we did not reach num_elements count.
|
|
|
|
- * Note: this is not an error, the package is padded out with NULLs.
|
|
|
|
- */
|
|
|
|
- ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
|
|
|
- "Package List length (%u) smaller than NumElements "
|
|
|
|
- "count (%u), padded with null elements\n",
|
|
|
|
- i, element_count));
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- obj_desc->package.flags |= AOPOBJ_DATA_VALID;
|
|
|
|
- op->common.node = ACPI_CAST_PTR(struct acpi_namespace_node, obj_desc);
|
|
|
|
- return_ACPI_STATUS(status);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
/*******************************************************************************
|
|
/*******************************************************************************
|
|
*
|
|
*
|
|
* FUNCTION: acpi_ds_create_node
|
|
* FUNCTION: acpi_ds_create_node
|
|
@@ -662,11 +387,20 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state,
|
|
|
|
|
|
case ACPI_TYPE_PACKAGE:
|
|
case ACPI_TYPE_PACKAGE:
|
|
/*
|
|
/*
|
|
- * Defer evaluation of Package term_arg operand
|
|
|
|
|
|
+ * Defer evaluation of Package term_arg operand and all
|
|
|
|
+ * package elements. (01/2017): We defer the element
|
|
|
|
+ * resolution to allow forward references from the package
|
|
|
|
+ * in order to provide compatibility with other ACPI
|
|
|
|
+ * implementations.
|
|
*/
|
|
*/
|
|
obj_desc->package.node =
|
|
obj_desc->package.node =
|
|
ACPI_CAST_PTR(struct acpi_namespace_node,
|
|
ACPI_CAST_PTR(struct acpi_namespace_node,
|
|
walk_state->operands[0]);
|
|
walk_state->operands[0]);
|
|
|
|
+
|
|
|
|
+ if (!op->named.data) {
|
|
|
|
+ return_ACPI_STATUS(AE_OK);
|
|
|
|
+ }
|
|
|
|
+
|
|
obj_desc->package.aml_start = op->named.data;
|
|
obj_desc->package.aml_start = op->named.data;
|
|
obj_desc->package.aml_length = op->named.length;
|
|
obj_desc->package.aml_length = op->named.length;
|
|
break;
|
|
break;
|
|
@@ -818,9 +552,11 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state,
|
|
/* Node was saved in Op */
|
|
/* Node was saved in Op */
|
|
|
|
|
|
obj_desc->reference.node = op->common.node;
|
|
obj_desc->reference.node = op->common.node;
|
|
- obj_desc->reference.object =
|
|
|
|
- op->common.node->object;
|
|
|
|
obj_desc->reference.class = ACPI_REFCLASS_NAME;
|
|
obj_desc->reference.class = ACPI_REFCLASS_NAME;
|
|
|
|
+ if (op->common.node) {
|
|
|
|
+ obj_desc->reference.object =
|
|
|
|
+ op->common.node->object;
|
|
|
|
+ }
|
|
break;
|
|
break;
|
|
|
|
|
|
case AML_DEBUG_OP:
|
|
case AML_DEBUG_OP:
|