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

📄 dsobject.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
	obj_desc->package.elements = ACPI_MEM_CALLOCATE(((acpi_size) obj_desc->							 package.count +							 1) * sizeof(void *));	if (!obj_desc->package.elements) {		acpi_ut_delete_object_desc(obj_desc);		return_ACPI_STATUS(AE_NO_MEMORY);	}	/*	 * Now init the elements of the package	 */	i = 0;	arg = op->common.value.arg;	arg = arg->common.next;	while (arg) {		if (arg->common.aml_opcode == AML_INT_RETURN_VALUE_OP) {			/* Object (package or buffer) is already built */			obj_desc->package.elements[i] =			    ACPI_CAST_PTR(union acpi_operand_object,					  arg->common.node);		} else {			status = acpi_ds_build_internal_object(walk_state, arg,							       &obj_desc->							       package.							       elements[i]);		}		i++;		arg = arg->common.next;	}	obj_desc->package.flags |= AOPOBJ_DATA_VALID;	op->common.node = (struct acpi_namespace_node *)obj_desc;	return_ACPI_STATUS(status);}/******************************************************************************* * * FUNCTION:    acpi_ds_create_node * * PARAMETERS:  walk_state      - Current walk state *              Node            - NS Node to be initialized *              Op              - Parser object to be translated * * RETURN:      Status * * DESCRIPTION: Create the object to be associated with a namespace node * ******************************************************************************/acpi_statusacpi_ds_create_node(struct acpi_walk_state *walk_state,		    struct acpi_namespace_node *node,		    union acpi_parse_object *op){	acpi_status status;	union acpi_operand_object *obj_desc;	ACPI_FUNCTION_TRACE_PTR("ds_create_node", 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 (acpi_ns_get_attached_object(node)) {		return_ACPI_STATUS(AE_OK);	}	if (!op->common.value.arg) {		/* No arguments, there is nothing to do */		return_ACPI_STATUS(AE_OK);	}	/* Build an internal object for the argument(s) */	status = acpi_ds_build_internal_object(walk_state, op->common.value.arg,					       &obj_desc);	if (ACPI_FAILURE(status)) {		return_ACPI_STATUS(status);	}	/* Re-type the object according to its argument */	node->type = ACPI_GET_OBJECT_TYPE(obj_desc);	/* Attach obj to node */	status = acpi_ns_attach_object(node, obj_desc, node->type);	/* Remove local reference to the object */	acpi_ut_remove_reference(obj_desc);	return_ACPI_STATUS(status);}#endif				/* ACPI_NO_METHOD_EXECUTION *//******************************************************************************* * * FUNCTION:    acpi_ds_init_object_from_op * * PARAMETERS:  walk_state      - Current walk state *              Op              - Parser op used to init the internal object *              Opcode          - AML opcode associated with the object *              ret_obj_desc    - Namespace object to be initialized * * RETURN:      Status * * DESCRIPTION: Initialize a namespace object from a parser Op and its *              associated arguments.  The namespace object is a more compact *              representation of the Op and its arguments. * ******************************************************************************/acpi_statusacpi_ds_init_object_from_op(struct acpi_walk_state *walk_state,			    union acpi_parse_object *op,			    u16 opcode,			    union acpi_operand_object **ret_obj_desc){	const struct acpi_opcode_info *op_info;	union acpi_operand_object *obj_desc;	acpi_status status = AE_OK;	ACPI_FUNCTION_TRACE("ds_init_object_from_op");	obj_desc = *ret_obj_desc;	op_info = acpi_ps_get_opcode_info(opcode);	if (op_info->class == AML_CLASS_UNKNOWN) {		/* Unknown opcode */		return_ACPI_STATUS(AE_TYPE);	}	/* Perform per-object initialization */	switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {	case ACPI_TYPE_BUFFER:		/*		 * Defer evaluation of Buffer term_arg operand		 */		obj_desc->buffer.node = (struct acpi_namespace_node *)		    walk_state->operands[0];		obj_desc->buffer.aml_start = op->named.data;		obj_desc->buffer.aml_length = op->named.length;		break;	case ACPI_TYPE_PACKAGE:		/*		 * Defer evaluation of Package term_arg operand		 */		obj_desc->package.node = (struct acpi_namespace_node *)		    walk_state->operands[0];		obj_desc->package.aml_start = op->named.data;		obj_desc->package.aml_length = op->named.length;		break;	case ACPI_TYPE_INTEGER:		switch (op_info->type) {		case AML_TYPE_CONSTANT:			/*			 * Resolve AML Constants here - AND ONLY HERE!			 * All constants are integers.			 * We mark the integer with a flag that indicates that it started			 * life as a constant -- so that stores to constants will perform			 * as expected (noop). zero_op is used as a placeholder for optional			 * target operands.			 */			obj_desc->common.flags = AOPOBJ_AML_CONSTANT;			switch (opcode) {			case AML_ZERO_OP:				obj_desc->integer.value = 0;				break;			case AML_ONE_OP:				obj_desc->integer.value = 1;				break;			case AML_ONES_OP:				obj_desc->integer.value = ACPI_INTEGER_MAX;				/* Truncate value if we are executing from a 32-bit ACPI table */#ifndef ACPI_NO_METHOD_EXECUTION				acpi_ex_truncate_for32bit_table(obj_desc);#endif				break;			case AML_REVISION_OP:				obj_desc->integer.value = ACPI_CA_VERSION;				break;			default:				ACPI_DEBUG_PRINT((ACPI_DB_ERROR,						  "Unknown constant opcode %X\n",						  opcode));				status = AE_AML_OPERAND_TYPE;				break;			}			break;		case AML_TYPE_LITERAL:			obj_desc->integer.value = op->common.value.integer;#ifndef ACPI_NO_METHOD_EXECUTION			acpi_ex_truncate_for32bit_table(obj_desc);#endif			break;		default:			ACPI_DEBUG_PRINT((ACPI_DB_ERROR,					  "Unknown Integer type %X\n",					  op_info->type));			status = AE_AML_OPERAND_TYPE;			break;		}		break;	case ACPI_TYPE_STRING:		obj_desc->string.pointer = op->common.value.string;		obj_desc->string.length =		    (u32) ACPI_STRLEN(op->common.value.string);		/*		 * The string is contained in the ACPI table, don't ever try		 * to delete it		 */		obj_desc->common.flags |= AOPOBJ_STATIC_POINTER;		break;	case ACPI_TYPE_METHOD:		break;	case ACPI_TYPE_LOCAL_REFERENCE:		switch (op_info->type) {		case AML_TYPE_LOCAL_VARIABLE:			/* Split the opcode into a base opcode + offset */			obj_desc->reference.opcode = AML_LOCAL_OP;			obj_desc->reference.offset = opcode - AML_LOCAL_OP;#ifndef ACPI_NO_METHOD_EXECUTION			status = acpi_ds_method_data_get_node(AML_LOCAL_OP,							      obj_desc->							      reference.offset,							      walk_state,							      (struct							       acpi_namespace_node							       **)&obj_desc->							      reference.object);#endif			break;		case AML_TYPE_METHOD_ARGUMENT:			/* Split the opcode into a base opcode + offset */			obj_desc->reference.opcode = AML_ARG_OP;			obj_desc->reference.offset = opcode - AML_ARG_OP;#ifndef ACPI_NO_METHOD_EXECUTION			status = acpi_ds_method_data_get_node(AML_ARG_OP,							      obj_desc->							      reference.offset,							      walk_state,							      (struct							       acpi_namespace_node							       **)&obj_desc->							      reference.object);#endif			break;		default:	/* Other literals, etc.. */			if (op->common.aml_opcode == AML_INT_NAMEPATH_OP) {				/* Node was saved in Op */				obj_desc->reference.node = op->common.node;			}			obj_desc->reference.opcode = opcode;			break;		}		break;	default:		ACPI_DEBUG_PRINT((ACPI_DB_ERROR,				  "Unimplemented data type: %X\n",				  ACPI_GET_OBJECT_TYPE(obj_desc)));		status = AE_AML_OPERAND_TYPE;		break;	}	return_ACPI_STATUS(status);}

⌨️ 快捷键说明

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