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

📄 dsobject.c

📁 h内核
💻 C
📖 第 1 页 / 共 2 页
字号:
	/*	 * Allocate the pointer array (array of pointers to the	 * individual objects). Add an extra pointer slot so	 * that the list is always null terminated.	 */	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;			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 + -