⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dswload.c

📁 winNT技术操作系统,国外开放的原代码和LIUX一样
💻 C
📖 第 1 页 / 共 2 页
字号:
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Ascending callback used during the loading of the namespace,
 *              both control methods and everything else.
 *
 ******************************************************************************/

ACPI_STATUS
acpi_ds_load2_end_op (
	ACPI_WALK_STATE         *walk_state,
	ACPI_PARSE_OBJECT       *op)
{
	ACPI_STATUS             status = AE_OK;
	OBJECT_TYPE_INTERNAL    data_type;
	ACPI_NAMESPACE_NODE     *node;
	ACPI_PARSE_OBJECT       *arg;
	ACPI_NAMESPACE_NODE     *new_node;


	if (!acpi_ps_is_namespace_object_op (op->opcode)) {
		return (AE_OK);
	}

	if (op->opcode == AML_SCOPE_OP) {
		if (((ACPI_PARSE2_OBJECT *)op)->name == -1) {
			return (AE_OK);
		}
	}


	data_type = acpi_ds_map_named_opcode_to_data_type (op->opcode);

	/*
	 * Get the Node/name from the earlier lookup
	 * (It was saved in the *op structure)
	 */
	node = op->node;

	/*
	 * Put the Node on the object stack (Contains the ACPI Name of
	 * this object)
	 */

	walk_state->operands[0] = (void *) node;
	walk_state->num_operands = 1;

	/* Pop the scope stack */

	if (acpi_ns_opens_scope (data_type)) {

		acpi_ds_scope_stack_pop (walk_state);
	}


	/*
	 * Named operations are as follows:
	 *
	 * AML_SCOPE
	 * AML_DEVICE
	 * AML_THERMALZONE
	 * AML_METHOD
	 * AML_POWERRES
	 * AML_PROCESSOR
	 * AML_FIELD
	 * AML_INDEXFIELD
	 * AML_BANKFIELD
	 * AML_NAMEDFIELD
	 * AML_NAME
	 * AML_ALIAS
	 * AML_MUTEX
	 * AML_EVENT
	 * AML_OPREGION
	 * AML_CREATEFIELD
	 * AML_CREATEBITFIELD
	 * AML_CREATEBYTEFIELD
	 * AML_CREATEWORDFIELD
	 * AML_CREATEDWORDFIELD
	 * AML_METHODCALL
	 */


	/* Decode the opcode */

	arg = op->value.arg;

	switch (op->opcode) {

	case AML_CREATE_FIELD_OP:
	case AML_BIT_FIELD_OP:
	case AML_BYTE_FIELD_OP:
	case AML_WORD_FIELD_OP:
	case AML_DWORD_FIELD_OP:

		/*
		 * Create the field object, but the field buffer and index must
		 * be evaluated later during the execution phase
		 */

		/* Get the Name_string argument */

		if (op->opcode == AML_CREATE_FIELD_OP) {
			arg = acpi_ps_get_arg (op, 3);
		}
		else {
			/* Create Bit/Byte/Word/Dword field */

			arg = acpi_ps_get_arg (op, 2);
		}

		/*
		 * Enter the Name_string into the namespace
		 */

		status = acpi_ns_lookup (walk_state->scope_info,
				 arg->value.string,
				 INTERNAL_TYPE_DEF_ANY,
				 IMODE_LOAD_PASS1,
				 NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE,
				 walk_state, &(new_node));

		if (ACPI_SUCCESS (status)) {
			/* We could put the returned object (Node) on the object stack for later, but
			 * for now, we will put it in the "op" object that the parser uses, so we
			 * can get it again at the end of this scope
			 */
			op->node = new_node;

			/*
			 * If there is no object attached to the node, this node was just created and
			 * we need to create the field object.  Otherwise, this was a lookup of an
			 * existing node and we don't want to create the field object again.
			 */
			if (!new_node->object) {
				/*
				 * The Field definition is not fully parsed at this time.
				 * (We must save the address of the AML for the buffer and index operands)
				 */
				status = acpi_aml_exec_create_field (((ACPI_PARSE2_OBJECT *) op)->data,
						   ((ACPI_PARSE2_OBJECT *) op)->length,
						   new_node, walk_state);
			}
		}


		break;


	case AML_METHODCALL_OP:

		/*
		 * Lookup the method name and save the Node
		 */

		status = acpi_ns_lookup (walk_state->scope_info, arg->value.string,
				 ACPI_TYPE_ANY, IMODE_LOAD_PASS2,
				 NS_SEARCH_PARENT | NS_DONT_OPEN_SCOPE,
				 walk_state, &(new_node));

		if (ACPI_SUCCESS (status)) {

/* has name already been resolved by here ??*/

			/* TBD: [Restructure] Make sure that what we found is indeed a method! */
			/* We didn't search for a method on purpose, to see if the name would resolve! */

			/* We could put the returned object (Node) on the object stack for later, but
			 * for now, we will put it in the "op" object that the parser uses, so we
			 * can get it again at the end of this scope
			 */
			op->node = new_node;
		}


		 break;


	case AML_PROCESSOR_OP:

		/* Nothing to do other than enter object into namespace */

		status = acpi_aml_exec_create_processor (op, (ACPI_HANDLE) node);
		if (ACPI_FAILURE (status)) {
			goto cleanup;
		}

		break;


	case AML_POWER_RES_OP:

		/* Nothing to do other than enter object into namespace */

		status = acpi_aml_exec_create_power_resource (op, (ACPI_HANDLE) node);
		if (ACPI_FAILURE (status)) {
			goto cleanup;
		}

		break;


	case AML_THERMAL_ZONE_OP:

		/* Nothing to do other than enter object into namespace */

		break;


	case AML_DEF_FIELD_OP:

		arg = op->value.arg;

		status = acpi_ds_create_field (op, arg->node, walk_state);
		break;


	case AML_INDEX_FIELD_OP:

		arg = op->value.arg;

		status = acpi_ds_create_index_field (op, (ACPI_HANDLE) arg->node,
				   walk_state);
		break;


	case AML_BANK_FIELD_OP:

		arg = op->value.arg;
		status = acpi_ds_create_bank_field (op, arg->node, walk_state);
		break;


	/*
	 * Method_op Pkg_length Names_string Method_flags Term_list
	 */
	case AML_METHOD_OP:

		if (!node->object) {
			status = acpi_aml_exec_create_method (((ACPI_PARSE2_OBJECT *) op)->data,
					   ((ACPI_PARSE2_OBJECT *) op)->length,
					   arg->value.integer, (ACPI_HANDLE) node);
		}

		break;


	case AML_MUTEX_OP:

		status = acpi_ds_create_operands (walk_state, arg);
		if (ACPI_FAILURE (status)) {
			goto cleanup;
		}

		status = acpi_aml_exec_create_mutex (walk_state);
		break;


	case AML_EVENT_OP:

		status = acpi_ds_create_operands (walk_state, arg);
		if (ACPI_FAILURE (status)) {
			goto cleanup;
		}

		status = acpi_aml_exec_create_event (walk_state);
		break;


	case AML_REGION_OP:

		if (node->object) {
			break;
		}


		/*
		 * The Op_region is not fully parsed at this time. Only valid argument is the Space_id.
		 * (We must save the address of the AML of the address and length operands)
		 */

		status = acpi_aml_exec_create_region (((ACPI_PARSE2_OBJECT *) op)->data,
				   ((ACPI_PARSE2_OBJECT *) op)->length,
				   (ACPI_ADDRESS_SPACE_TYPE) arg->value.integer,
				   walk_state);

		break;


	/* Namespace Modifier Opcodes */

	case AML_ALIAS_OP:

		status = acpi_ds_create_operands (walk_state, arg);
		if (ACPI_FAILURE (status)) {
			goto cleanup;
		}

		status = acpi_aml_exec_create_alias (walk_state);
		break;


	case AML_NAME_OP:

		/*
		 * Because of the execution pass through the non-control-method
		 * parts of the table, we can arrive here twice.  Only init
		 * the named object node the first time through
		 */

		if (!node->object) {
			status = acpi_ds_create_node (walk_state, node, op);
		}

		break;


	case AML_NAMEPATH_OP:

		break;


	default:
		break;
	}


cleanup:

	/* Remove the Node pushed at the very beginning */

	acpi_ds_obj_stack_pop (1, walk_state);
	return (status);
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -