dswload.c

来自「讲述linux的初始化过程」· C语言 代码 · 共 688 行 · 第 1/2 页

C
688
字号
 *              Op              - Op that has been just been completed in the *                                walk;  Arguments have now been evaluated. * * RETURN:      Status * * DESCRIPTION: Ascending callback used during the loading of the namespace, *              both control methods and everything else. * ****************************************************************************/ACPI_STATUSacpi_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 + =
减小字号Ctrl + -
显示快捷键?