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

📄 utcopy.c

📁 内核linux2.4.20,可跟rtlinux3.2打补丁 组成实时linux系统,编译内核
💻 C
📖 第 1 页 / 共 2 页
字号:
	}	else {		/*		 * Build a simple object (no nested objects)		 */		status = acpi_ut_copy_isimple_to_esimple (internal_object,				  (acpi_object *) ret_buffer->pointer,				  ((u8 *) ret_buffer->pointer +				  ROUND_UP_TO_NATIVE_WORD (sizeof (acpi_object))),				  &ret_buffer->length);		/*		 * build simple does not include the object size in the length		 * so we add it in here		 */		ret_buffer->length += sizeof (acpi_object);	}	return_ACPI_STATUS (status);}/******************************************************************************* * * FUNCTION:    Acpi_ut_copy_esimple_to_isimple * * PARAMETERS:  *External_object   - The external object to be converted *              *Internal_object   - Where the internal object is returned * * RETURN:      Status * * DESCRIPTION: This function copies an external object to an internal one. *              NOTE: Pointers can be copied, we don't need to copy data. *              (The pointers have to be valid in our address space no matter *              what we do with them!) * ******************************************************************************/acpi_statusacpi_ut_copy_esimple_to_isimple (	acpi_object             *external_object,	acpi_operand_object     **ret_internal_object){	acpi_operand_object     *internal_object;	FUNCTION_TRACE ("Ut_copy_esimple_to_isimple");	/*	 * Simple types supported are: String, Buffer, Integer	 */	switch (external_object->type) {	case ACPI_TYPE_STRING:	case ACPI_TYPE_BUFFER:	case ACPI_TYPE_INTEGER:		internal_object = acpi_ut_create_internal_object ((u8) external_object->type);		if (!internal_object) {			return_ACPI_STATUS (AE_NO_MEMORY);		}		break;	default:		/*		 * Whatever other type -- it is not supported		 */		return_ACPI_STATUS (AE_SUPPORT);		break;	}	switch (external_object->type) {	/* Must COPY string and buffer contents */	case ACPI_TYPE_STRING:		internal_object->string.pointer = ACPI_MEM_CALLOCATE (external_object->string.length + 1);		if (!internal_object->string.pointer) {			return_ACPI_STATUS (AE_NO_MEMORY);		}		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) {			return_ACPI_STATUS (AE_NO_MEMORY);		}		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;	}	*ret_internal_object = internal_object;	return_ACPI_STATUS (AE_OK);}#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          - the status of the call * * 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 (	acpi_operand_object     *internal_object,	u8                      *buffer,	u32                     *space_used){	u8                      *free_space;	acpi_object             *external_object;	u32                     length = 0;	u32                     this_index;	u32                     object_space = 0;	acpi_operand_object     *this_internal_obj;	acpi_object             *this_external_obj;	FUNCTION_TRACE ("Ut_copy_epackage_to_ipackage");	/*	 * First package at head of the buffer	 */	external_object = (acpi_object *)buffer;	/*	 * Free space begins right after the first package	 */	free_space = buffer + sizeof(acpi_object);	external_object->type              = internal_object->common.type;	external_object->package.count     = internal_object->package.count;	external_object->package.elements  = (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(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 (	acpi_object             *external_object,	acpi_operand_object     **internal_object){	acpi_status             status;	FUNCTION_TRACE ("Ut_copy_eobject_to_iobject");	if (external_object->type == ACPI_TYPE_PACKAGE) {		/*		 * Package objects contain other objects (which can be objects)		 * buildpackage does it all		 *		 * TBD: Package conversion must be completed and tested		 * NOTE: this code converts packages as input parameters to		 * control methods only.  This is a very, very rare case.		 *//*		Status = Acpi_ut_copy_epackage_to_ipackage(Internal_object,				 Ret_buffer->Pointer,				 &Ret_buffer->Length);*/		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_ielement_to_ielement * * PARAMETERS:  ACPI_PKG_CALLBACK * * RETURN:      Status          - the status of the call * * DESCRIPTION: Copy one package element to another package element * ******************************************************************************/acpi_statusacpi_ut_copy_ielement_to_ielement (	u8                      object_type,	acpi_operand_object     *source_object,	acpi_generic_state      *state,	void                    *context){	acpi_status             status = AE_OK;	u32                     this_index;	acpi_operand_object     **this_target_ptr;	acpi_operand_object     *target_object;	FUNCTION_ENTRY ();	this_index    = state->pkg.index;	this_target_ptr = (acpi_operand_object **)			   &state->pkg.dest_object->package.elements[this_index];	switch (object_type) {	case 0:		/*		 * This is a simple object, just copy it		 */		target_object = acpi_ut_create_internal_object (source_object->common.type);		if (!target_object) {			return (AE_NO_MEMORY);		}		status = acpi_ex_store_object_to_object (source_object, target_object,				  (acpi_walk_state *) context);		if (ACPI_FAILURE (status)) {			return (status);		}		*this_target_ptr = target_object;		break;	case 1:		/*		 * 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) {			/* TBD: must delete package created up to this point */			return (AE_NO_MEMORY);		}		target_object->package.count = source_object->package.count;		/*		 * 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);}/******************************************************************************* * * 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 (	acpi_operand_object     *source_obj,	acpi_operand_object     *dest_obj,	acpi_walk_state         *walk_state){	acpi_status             status = AE_OK;	FUNCTION_TRACE ("Ut_copy_ipackage_to_ipackage");	dest_obj->common.type   = source_obj->common.type;	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 ((source_obj->package.count + 1) *			 sizeof (void *));	dest_obj->package.next_element = dest_obj->package.elements;	if (!dest_obj->package.elements) {		REPORT_ERROR (			("Aml_build_copy_internal_package_object: Package allocation failure\n"));		return_ACPI_STATUS (AE_NO_MEMORY);	}	status = acpi_ut_walk_package_tree (source_obj, dest_obj,			 acpi_ut_copy_ielement_to_ielement, walk_state);	return_ACPI_STATUS (status);}

⌨️ 快捷键说明

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