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

📄 utcopy.c

📁 h内核
💻 C
📖 第 1 页 / 共 2 页
字号:
				  external_object->buffer.pointer,				  external_object->buffer.length);		internal_object->buffer.length = external_object->buffer.length;		break;	case ACPI_TYPE_INTEGER:		internal_object->integer.value  = external_object->integer.value;		break;	default:		/* Other types can't get here */		break;	}	*ret_internal_object = internal_object;	return_ACPI_STATUS (AE_OK);error_exit:	acpi_ut_remove_reference (internal_object);	return_ACPI_STATUS (AE_NO_MEMORY);}#ifdef ACPI_FUTURE_IMPLEMENTATION/* Code to convert packages that are parameters to control methods *//******************************************************************************* * * FUNCTION:    acpi_ut_copy_epackage_to_ipackage * * PARAMETERS:  *internal_object   - Pointer to the object we are returning *              *Buffer            - Where the object is returned *              *space_used        - Where the length of the object is returned * * RETURN:      Status * * DESCRIPTION: This function is called to place a package object in a user *              buffer.  A package object by definition contains other objects. * *              The buffer is assumed to have sufficient space for the object. *              The caller must have verified the buffer length needed using the *              acpi_ut_get_object_size function before calling this function. * ******************************************************************************/static acpi_statusacpi_ut_copy_epackage_to_ipackage (	union acpi_operand_object       *internal_object,	u8                              *buffer,	u32                             *space_used){	u8                              *free_space;	union acpi_object               *external_object;	u32                             length = 0;	u32                             this_index;	u32                             object_space = 0;	union acpi_operand_object       *this_internal_obj;	union acpi_object               *this_external_obj;	ACPI_FUNCTION_TRACE ("ut_copy_epackage_to_ipackage");	/*	 * First package at head of the buffer	 */	external_object = (union acpi_object *)buffer;	/*	 * Free space begins right after the first package	 */	free_space = buffer + sizeof(union acpi_object);	external_object->type              = ACPI_GET_OBJECT_TYPE (internal_object);	external_object->package.count     = internal_object->package.count;	external_object->package.elements  = (union acpi_object *)free_space;	/*	 * Build an array of ACPI_OBJECTS in the buffer	 * and move the free space past it	 */	free_space += external_object->package.count * sizeof(union acpi_object);	/* Call walk_package */}#endif /* Future implementation *//******************************************************************************* * * FUNCTION:    acpi_ut_copy_eobject_to_iobject * * PARAMETERS:  *internal_object   - The external object to be converted *              *buffer_ptr     - Where the internal object is returned * * RETURN:      Status          - the status of the call * * DESCRIPTION: Converts an external object to an internal object. * ******************************************************************************/acpi_statusacpi_ut_copy_eobject_to_iobject (	union acpi_object               *external_object,	union acpi_operand_object       **internal_object){	acpi_status                     status;	ACPI_FUNCTION_TRACE ("ut_copy_eobject_to_iobject");	if (external_object->type == ACPI_TYPE_PACKAGE) {		/*		 * Packages as external input to control methods are not supported,		 */		ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,			"Packages as parameters not implemented!\n"));		return_ACPI_STATUS (AE_NOT_IMPLEMENTED);	}	else {		/*		 * Build a simple object (no nested objects)		 */		status = acpi_ut_copy_esimple_to_isimple (external_object, internal_object);	}	return_ACPI_STATUS (status);}/******************************************************************************* * * FUNCTION:    acpi_ut_copy_simple_object * * PARAMETERS:  source_desc         - The internal object to be copied *              dest_desc           - New target object * * RETURN:      Status * * DESCRIPTION: Simple copy of one internal object to another.  Reference count *              of the destination object is preserved. * ******************************************************************************/acpi_statusacpi_ut_copy_simple_object (	union acpi_operand_object       *source_desc,	union acpi_operand_object       *dest_desc){	u16                             reference_count;	union acpi_operand_object       *next_object;	/* Save fields from destination that we don't want to overwrite */	reference_count = dest_desc->common.reference_count;	next_object = dest_desc->common.next_object;	/* Copy the entire source object over the destination object*/	ACPI_MEMCPY ((char *) dest_desc, (char *) source_desc,			  sizeof (union acpi_operand_object));	/* Restore the saved fields */	dest_desc->common.reference_count = reference_count;	dest_desc->common.next_object = next_object;	/* Handle the objects with extra data */	switch (ACPI_GET_OBJECT_TYPE (dest_desc)) {	case ACPI_TYPE_BUFFER:		dest_desc->buffer.node = NULL;		dest_desc->common.flags = source_desc->common.flags;		/*		 * Allocate and copy the actual buffer if and only if:		 * 1) There is a valid buffer pointer		 * 2) The buffer is not static (not in an ACPI table) (in this case,		 *    the actual pointer was already copied above)		 */		if ((source_desc->buffer.pointer) &&			(!(source_desc->common.flags & AOPOBJ_STATIC_POINTER))) {			dest_desc->buffer.pointer = NULL;			/* Create an actual buffer only if length > 0 */			if (source_desc->buffer.length) {				dest_desc->buffer.pointer = ACPI_MEM_ALLOCATE (source_desc->buffer.length);				if (!dest_desc->buffer.pointer) {					return (AE_NO_MEMORY);				}				/* Copy the actual buffer data */				ACPI_MEMCPY (dest_desc->buffer.pointer, source_desc->buffer.pointer,						  source_desc->buffer.length);			}		}		break;	case ACPI_TYPE_STRING:		/*		 * Allocate and copy the actual string if and only if:		 * 1) There is a valid string pointer		 * 2) The string is not static (not in an ACPI table) (in this case,		 *    the actual pointer was already copied above)		 */		if ((source_desc->string.pointer) &&			(!(source_desc->common.flags & AOPOBJ_STATIC_POINTER))) {			dest_desc->string.pointer = ACPI_MEM_ALLOCATE ((acpi_size) source_desc->string.length + 1);			if (!dest_desc->string.pointer) {				return (AE_NO_MEMORY);			}			ACPI_MEMCPY (dest_desc->string.pointer, source_desc->string.pointer,					  (acpi_size) source_desc->string.length + 1);		}		break;	default:		/* Nothing to do for other simple objects */		break;	}	return (AE_OK);}/******************************************************************************* * * FUNCTION:    acpi_ut_copy_ielement_to_ielement * * PARAMETERS:  acpi_pkg_callback * * RETURN:      Status * * DESCRIPTION: Copy one package element to another package element * ******************************************************************************/acpi_statusacpi_ut_copy_ielement_to_ielement (	u8                              object_type,	union acpi_operand_object       *source_object,	union acpi_generic_state        *state,	void                            *context){	acpi_status                     status = AE_OK;	u32                             this_index;	union acpi_operand_object       **this_target_ptr;	union acpi_operand_object       *target_object;	ACPI_FUNCTION_ENTRY ();	this_index    = state->pkg.index;	this_target_ptr = (union acpi_operand_object **)			   &state->pkg.dest_object->package.elements[this_index];	switch (object_type) {	case ACPI_COPY_TYPE_SIMPLE:		/* A null source object indicates a (legal) null package element */		if (source_object) {			/*			 * This is a simple object, just copy it			 */			target_object = acpi_ut_create_internal_object (					   ACPI_GET_OBJECT_TYPE (source_object));			if (!target_object) {				return (AE_NO_MEMORY);			}			status = acpi_ut_copy_simple_object (source_object, target_object);			if (ACPI_FAILURE (status)) {				goto error_exit;			}			*this_target_ptr = target_object;		}		else {			/* Pass through a null element */			*this_target_ptr = NULL;		}		break;	case ACPI_COPY_TYPE_PACKAGE:		/*		 * This object is a package - go down another nesting level		 * Create and build the package object		 */		target_object = acpi_ut_create_internal_object (ACPI_TYPE_PACKAGE);		if (!target_object) {			return (AE_NO_MEMORY);		}		target_object->package.count = source_object->package.count;		target_object->common.flags = source_object->common.flags;		/*		 * Create the object array		 */		target_object->package.elements =			ACPI_MEM_CALLOCATE (((acpi_size) source_object->package.count + 1) *					 sizeof (void *));		if (!target_object->package.elements) {			status = AE_NO_MEMORY;			goto error_exit;		}		/*		 * Pass the new package object back to the package walk routine		 */		state->pkg.this_target_obj = target_object;		/*		 * Store the object pointer in the parent package object		 */		*this_target_ptr = target_object;		break;	default:		return (AE_BAD_PARAMETER);	}	return (status);error_exit:	acpi_ut_remove_reference (target_object);	return (status);}/******************************************************************************* * * FUNCTION:    acpi_ut_copy_ipackage_to_ipackage * * PARAMETERS:  *source_obj     - Pointer to the source package object *              *dest_obj       - Where the internal object is returned * * RETURN:      Status          - the status of the call * * DESCRIPTION: This function is called to copy an internal package object *              into another internal package object. * ******************************************************************************/acpi_statusacpi_ut_copy_ipackage_to_ipackage (	union acpi_operand_object       *source_obj,	union acpi_operand_object       *dest_obj,	struct acpi_walk_state          *walk_state){	acpi_status                     status = AE_OK;	ACPI_FUNCTION_TRACE ("ut_copy_ipackage_to_ipackage");	dest_obj->common.type   = ACPI_GET_OBJECT_TYPE (source_obj);	dest_obj->common.flags  = source_obj->common.flags;	dest_obj->package.count = source_obj->package.count;	/*	 * Create the object array and walk the source package tree	 */	dest_obj->package.elements = ACPI_MEM_CALLOCATE (			   ((acpi_size) source_obj->package.count + 1) *			   sizeof (void *));	if (!dest_obj->package.elements) {		ACPI_REPORT_ERROR (			("aml_build_copy_internal_package_object: Package allocation failure\n"));		return_ACPI_STATUS (AE_NO_MEMORY);	}	/*	 * Copy the package element-by-element by walking the package "tree".	 * This handles nested packages of arbitrary depth.	 */	status = acpi_ut_walk_package_tree (source_obj, dest_obj,			 acpi_ut_copy_ielement_to_ielement, walk_state);	if (ACPI_FAILURE (status)) {		/* On failure, delete the destination package object */		acpi_ut_remove_reference (dest_obj);	}	return_ACPI_STATUS (status);}/******************************************************************************* * * FUNCTION:    acpi_ut_copy_iobject_to_iobject * * PARAMETERS:  walk_state          - Current walk state *              source_desc         - The internal object to be copied *              dest_desc           - Where the copied object is returned * * RETURN:      Status * * DESCRIPTION: Copy an internal object to a new internal object * ******************************************************************************/acpi_statusacpi_ut_copy_iobject_to_iobject (	union acpi_operand_object       *source_desc,	union acpi_operand_object       **dest_desc,	struct acpi_walk_state          *walk_state){	acpi_status                     status = AE_OK;	ACPI_FUNCTION_TRACE ("ut_copy_iobject_to_iobject");	/* Create the top level object */	*dest_desc = acpi_ut_create_internal_object (ACPI_GET_OBJECT_TYPE (source_desc));	if (!*dest_desc) {		return_ACPI_STATUS (AE_NO_MEMORY);	}	/* Copy the object and possible subobjects */	if (ACPI_GET_OBJECT_TYPE (source_desc) == ACPI_TYPE_PACKAGE) {		status = acpi_ut_copy_ipackage_to_ipackage (source_desc, *dest_desc,				  walk_state);	}	else {		status = acpi_ut_copy_simple_object (source_desc, *dest_desc);	}	return_ACPI_STATUS (status);}

⌨️ 快捷键说明

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