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

📄 utcopy.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
	switch (external_object->type) {	case ACPI_TYPE_STRING:		internal_object->string.pointer =		    ACPI_MEM_CALLOCATE((acpi_size) external_object->string.				       length + 1);		if (!internal_object->string.pointer) {			goto error_exit;		}		ACPI_MEMCPY(internal_object->string.pointer,			    external_object->string.pointer,			    external_object->string.length);		internal_object->string.length = external_object->string.length;		break;	case ACPI_TYPE_BUFFER:		internal_object->buffer.pointer =		    ACPI_MEM_CALLOCATE(external_object->buffer.length);		if (!internal_object->buffer.pointer) {			goto error_exit;		}		ACPI_MEMCPY(internal_object->buffer.pointer,			    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. * ******************************************************************************/static 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;	/* New object is not static, regardless of source */	dest_desc->common.flags &= ~AOPOBJ_STATIC_POINTER;	/* Handle the objects with extra data */	switch (ACPI_GET_OBJECT_TYPE(dest_desc)) {	case ACPI_TYPE_BUFFER:		/*		 * Allocate and copy the actual buffer if and only if:		 * 1) There is a valid buffer pointer		 * 2) The buffer has a length > 0		 */		if ((source_desc->buffer.pointer) &&		    (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		 * (Pointer to a NULL string is allowed)		 */		if (source_desc->string.pointer) {			dest_desc->string.pointer =			    ACPI_MEM_ALLOCATE((acpi_size) source_desc->string.					      length + 1);			if (!dest_desc->string.pointer) {				return (AE_NO_MEMORY);			}			/* Copy the actual string data */			ACPI_MEMCPY(dest_desc->string.pointer,				    source_desc->string.pointer,				    (acpi_size) source_desc->string.length + 1);		}		break;	case ACPI_TYPE_LOCAL_REFERENCE:		/*		 * We copied the reference object, so we now must add a reference		 * to the object pointed to by the reference		 */		acpi_ut_add_reference(source_desc->reference.object);		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 * ******************************************************************************/static 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. * ******************************************************************************/static 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 + -