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

📄 dsmthdat.c

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	}	/* Get the object from the method stack */	object = *entry;	/* Get the object type */	if (!object) {		/* Any == 0 => "uninitialized" -- see spec 15.2.3.5.2.28 */		return (ACPI_TYPE_ANY);	}	return (object->common.type);}/******************************************************************************* * * FUNCTION:    Acpi_ds_method_data_get_nte * * PARAMETERS:  Type                - Either MTH_TYPE_LOCAL or MTH_TYPE_ARG *              Index               - Which local_var or argument whose type *                                      to get * * RETURN:      Get the Node associated with a local or arg. * ******************************************************************************/ACPI_NAMESPACE_NODE *acpi_ds_method_data_get_nte (	u32                     type,	u32                     index,	ACPI_WALK_STATE         *walk_state){	ACPI_NAMESPACE_NODE     *node = NULL;	switch (type)	{	case MTH_TYPE_LOCAL:		if (index > MTH_MAX_LOCAL) {			return (node);		}		node =  &walk_state->local_variables[index];		break;	case MTH_TYPE_ARG:		if (index > MTH_MAX_ARG) {			return (node);		}		node = &walk_state->arguments[index];		break;	default:		break;	}	return (node);}/******************************************************************************* * * FUNCTION:    Acpi_ds_method_data_get_value * * PARAMETERS:  Type                - Either MTH_TYPE_LOCAL or MTH_TYPE_ARG *              Index               - Which local_var or argument to get *              *Dest_desc           - Descriptor into which selected Arg *                                    or Local value should be copied * * RETURN:      Status * * DESCRIPTION: Retrieve value of selected Arg or Local from the method frame *              at the current top of the method stack. *              Used only in Acpi_aml_resolve_to_value(). * ******************************************************************************/ACPI_STATUSacpi_ds_method_data_get_value (	u32                     type,	u32                     index,	ACPI_WALK_STATE         *walk_state,	ACPI_OPERAND_OBJECT     **dest_desc){	ACPI_STATUS             status;	ACPI_OPERAND_OBJECT     **entry;	ACPI_OPERAND_OBJECT     *object;	/* Validate the object descriptor */	if (!dest_desc) {		return (AE_BAD_PARAMETER);	}	/* Get a pointer to the requested method stack entry */	status = acpi_ds_method_data_get_entry (type, index, walk_state, &entry);	if (ACPI_FAILURE (status)) {		return (status);	}	/* Get the object from the method stack */	object = *entry;	/* Examine the returned object, it must be valid. */	if (!object) {		/*		 * Index points to uninitialized object stack value.		 * This means that either 1) The expected argument was		 * not passed to the method, or 2) A local variable		 * was referenced by the method (via the ASL)		 * before it was initialized.  Either case is an error.		 */		switch (type)		{		case MTH_TYPE_ARG:			return (AE_AML_UNINITIALIZED_ARG);			break;		case MTH_TYPE_LOCAL:			return (AE_AML_UNINITIALIZED_LOCAL);			break;		}	}	/*	 * Index points to initialized and valid object stack value.	 * Return an additional reference to the object	 */	*dest_desc = object;	acpi_cm_add_reference (object);	return (AE_OK);}/******************************************************************************* * * FUNCTION:    Acpi_ds_method_data_delete_value * * PARAMETERS:  Type                - Either MTH_TYPE_LOCAL or MTH_TYPE_ARG *              Index               - Which local_var or argument to delete * * RETURN:      Status * * DESCRIPTION: Delete the entry at Type:Index on the method stack.  Inserts *              a null into the stack slot after the object is deleted. * ******************************************************************************/ACPI_STATUSacpi_ds_method_data_delete_value (	u32                     type,	u32                     index,	ACPI_WALK_STATE         *walk_state){	ACPI_STATUS             status;	ACPI_OPERAND_OBJECT     **entry;	ACPI_OPERAND_OBJECT     *object;	/* Get a pointer to the requested entry */	status = acpi_ds_method_data_get_entry (type, index, walk_state, &entry);	if (ACPI_FAILURE (status)) {		return (status);	}	/* Get the current entry in this slot k */	object = *entry;	/*	 * Undefine the Arg or Local by setting its descriptor	 * pointer to NULL. Locals/Args can contain both	 * ACPI_OPERAND_OBJECTS and ACPI_NAMESPACE_NODEs	 */	*entry = NULL;	if ((object) &&		(VALID_DESCRIPTOR_TYPE (object, ACPI_DESC_TYPE_INTERNAL)))	{		/*		 * There is a valid object in this slot		 * Decrement the reference count by one to balance the		 * increment when the object was stored in the slot.		 */		acpi_cm_remove_reference (object);	}	return (AE_OK);}/******************************************************************************* * * FUNCTION:    Acpi_ds_method_data_set_value * * PARAMETERS:  Type                - Either MTH_TYPE_LOCAL or MTH_TYPE_ARG *              Index               - Which local_var or argument to set *              *Src_desc           - Value to be stored *              *Dest_desc          - Descriptor into which *Src_desc *                                    can be copied, or NULL if one must *                                    be allocated for the purpose.  If *                                    provided, this descriptor will be *                                    used for the new value. * * RETURN:      Status * * DESCRIPTION: Store a value in an Arg or Local.  The Src_desc is installed *              as the new value for the Arg or Local and the reference count *              is incremented. * ******************************************************************************/ACPI_STATUSacpi_ds_method_data_set_value (	u32                     type,	u32                     index,	ACPI_OPERAND_OBJECT     *src_desc,	ACPI_WALK_STATE         *walk_state){	ACPI_STATUS             status;	ACPI_OPERAND_OBJECT     **entry;	/* Parameter validation */	if (!src_desc) {		return (AE_BAD_PARAMETER);	}	/* Get a pointer to the requested method stack entry */	status = acpi_ds_method_data_get_entry (type, index, walk_state, &entry);	if (ACPI_FAILURE (status)) {		goto cleanup;	}	if (*entry == src_desc) {		goto cleanup;	}	/*	 * If there is an object already in this slot, we either	 * have to delete it, or if this is an argument and there	 * is an object reference stored there, we have to do	 * an indirect store!	 */	if (*entry) {		/*		 * Check for an indirect store if an argument		 * contains an object reference (stored as an Node).		 * We don't allow this automatic dereferencing for		 * locals, since a store to a local should overwrite		 * anything there, including an object reference.		 *		 * If both Arg0 and Local0 contain Ref_of (Local4):		 *		 * Store (1, Arg0)             - Causes indirect store to local4		 * Store (1, Local0)           - Stores 1 in local0, overwriting		 *                                  the reference to local4		 * Store (1, De_refof (Local0)) - Causes indirect store to local4		 *		 * Weird, but true.		 */		if ((type == MTH_TYPE_ARG) &&			(VALID_DESCRIPTOR_TYPE (*entry, ACPI_DESC_TYPE_NAMED)))		{			/* Detach an existing object from the Node */			acpi_ns_detach_object ((ACPI_NAMESPACE_NODE *) *entry);			/*			 * Store this object into the Node			 * (do the indirect store)			 */			status = acpi_ns_attach_object ((ACPI_NAMESPACE_NODE *) *entry, src_desc,					   src_desc->common.type);			return (status);		}		/*		 * Otherwise, just delete the existing object		 * before storing the new one		 */		acpi_ds_method_data_delete_value (type, index, walk_state);	}	/*	 * Install the Obj_stack descriptor (*Src_desc) into	 * the descriptor for the Arg or Local.	 * Install the new object in the stack entry	 * (increments the object reference count by one)	 */	status = acpi_ds_method_data_set_entry (type, index, src_desc, walk_state);	if (ACPI_FAILURE (status)) {		goto cleanup;	}	/* Normal exit */	return (AE_OK);	/* Error exit */cleanup:	return (status);}

⌨️ 快捷键说明

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