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

📄 dsobject.c

📁 内核linux2.4.20,可跟rtlinux3.2打补丁 组成实时linux系统,编译内核
💻 C
📖 第 1 页 / 共 2 页
字号:
		obj_desc->common.flags |= AOPOBJ_STATIC_POINTER;		break;	case ACPI_TYPE_METHOD:		break;	case INTERNAL_TYPE_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;			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;			break;		default: /* Constants, Literals, etc.. */			if (op->opcode == AML_INT_NAMEPATH_OP) {				/* Node was saved in Op */				obj_desc->reference.node = op->node;			}			obj_desc->reference.opcode = opcode;			break;		}		break;	default:		ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unimplemented data type: %x\n",			obj_desc->common.type));		break;	}	return (AE_OK);}/***************************************************************************** * * FUNCTION:    Acpi_ds_build_internal_simple_obj * * PARAMETERS:  Op              - Parser object to be translated *              Obj_desc_ptr    - Where the ACPI internal object is returned * * RETURN:      Status * * DESCRIPTION: Translate a parser Op object to the equivalent namespace object *              Simple objects are any objects other than a package object! * ****************************************************************************/static acpi_statusacpi_ds_build_internal_simple_obj (	acpi_walk_state         *walk_state,	acpi_parse_object       *op,	acpi_operand_object     **obj_desc_ptr){	acpi_operand_object     *obj_desc;	acpi_object_type8       type;	acpi_status             status;	u32                     length;	char                    *name;	FUNCTION_TRACE ("Ds_build_internal_simple_obj");	if (op->opcode == AML_INT_NAMEPATH_OP) {		/*		 * This is an object reference.  If The name was		 * previously looked up in the NS, it is stored in this op.		 * Otherwise, go ahead and look it up now		 */		if (!op->node) {			status = acpi_ns_lookup (walk_state->scope_info,					  op->value.string, ACPI_TYPE_ANY,					  IMODE_EXECUTE,					  NS_SEARCH_PARENT | NS_DONT_OPEN_SCOPE,					  NULL,					  (acpi_namespace_node **)&(op->node));			if (ACPI_FAILURE (status)) {				if (status == AE_NOT_FOUND) {					name = NULL;					acpi_ns_externalize_name (ACPI_UINT32_MAX, op->value.string, &length, &name);					if (name) {						REPORT_WARNING (("Reference %s at AML %X not found\n",								 name, op->aml_offset));						ACPI_MEM_FREE (name);					}					else {						REPORT_WARNING (("Reference %s at AML %X not found\n",								   op->value.string, op->aml_offset));					}					*obj_desc_ptr = NULL;				}				else {					return_ACPI_STATUS (status);				}			}		}		/*		 * The reference will be a Reference		 * TBD: [Restructure] unless we really need a separate		 *  type of INTERNAL_TYPE_REFERENCE change		 *  Acpi_ds_map_opcode_to_data_type to handle this case		 */		type = INTERNAL_TYPE_REFERENCE;	}	else {		type = acpi_ds_map_opcode_to_data_type (op->opcode, NULL);	}	/* Create and init the internal ACPI object */	obj_desc = acpi_ut_create_internal_object (type);	if (!obj_desc) {		return_ACPI_STATUS (AE_NO_MEMORY);	}	status = acpi_ds_init_object_from_op (walk_state, op, op->opcode, &obj_desc);	if (ACPI_FAILURE (status)) {		acpi_ut_remove_reference (obj_desc);		return_ACPI_STATUS (status);	}	*obj_desc_ptr = obj_desc;	return_ACPI_STATUS (AE_OK);}/***************************************************************************** * * FUNCTION:    Acpi_ds_build_internal_package_obj * * PARAMETERS:  Op              - Parser object to be translated *              Obj_desc_ptr    - Where the ACPI internal object is returned * * RETURN:      Status * * DESCRIPTION: Translate a parser Op package object to the equivalent *              namespace object * ****************************************************************************/acpi_statusacpi_ds_build_internal_package_obj (	acpi_walk_state         *walk_state,	acpi_parse_object       *op,	acpi_operand_object     **obj_desc_ptr){	acpi_parse_object       *arg;	acpi_operand_object     *obj_desc;	acpi_status             status = AE_OK;	FUNCTION_TRACE ("Ds_build_internal_package_obj");	obj_desc = acpi_ut_create_internal_object (ACPI_TYPE_PACKAGE);	*obj_desc_ptr = obj_desc;	if (!obj_desc) {		return_ACPI_STATUS (AE_NO_MEMORY);	}	if (op->opcode == AML_VAR_PACKAGE_OP) {		/*		 * Variable length package parameters are evaluated JIT		 */		return_ACPI_STATUS (AE_OK);	}	/* The first argument must be the package length */	arg = op->value.arg;	obj_desc->package.count = arg->value.integer32;	/*	 * Allocate the array of pointers (ptrs to the	 * individual objects) Add an extra pointer slot so	 * that the list is always null terminated.	 */	obj_desc->package.elements = ACPI_MEM_CALLOCATE (			 (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);	}	obj_desc->package.next_element = obj_desc->package.elements;	/*	 * Now init the elements of the package	 */	arg = arg->next;	while (arg) {		if (arg->opcode == AML_PACKAGE_OP) {			status = acpi_ds_build_internal_package_obj (walk_state, arg,					  obj_desc->package.next_element);		}		else {			status = acpi_ds_build_internal_simple_obj (walk_state, arg,					  obj_desc->package.next_element);		}		obj_desc->package.next_element++;		arg = arg->next;	}	obj_desc->package.flags |= AOPOBJ_DATA_VALID;	return_ACPI_STATUS (status);}/***************************************************************************** * * FUNCTION:    Acpi_ds_build_internal_object * * PARAMETERS:  Op              - Parser object to be translated *              Obj_desc_ptr    - Where the ACPI internal object is returned * * RETURN:      Status * * DESCRIPTION: Translate a parser Op object to the equivalent namespace *              object * ****************************************************************************/acpi_statusacpi_ds_build_internal_object (	acpi_walk_state         *walk_state,	acpi_parse_object       *op,	acpi_operand_object     **obj_desc_ptr){	acpi_status             status;	switch (op->opcode) {	case AML_PACKAGE_OP:	case AML_VAR_PACKAGE_OP:		status = acpi_ds_build_internal_package_obj (walk_state, op, obj_desc_ptr);		break;	default:		status = acpi_ds_build_internal_simple_obj (walk_state, op, obj_desc_ptr);		break;	}	return (status);}/***************************************************************************** * * FUNCTION:    Acpi_ds_create_node * * PARAMETERS:  Op              - Parser object to be translated *              Obj_desc_ptr    - Where the ACPI internal object is returned * * RETURN:      Status * * DESCRIPTION: * ****************************************************************************/acpi_statusacpi_ds_create_node (	acpi_walk_state         *walk_state,	acpi_namespace_node     *node,	acpi_parse_object       *op){	acpi_status             status;	acpi_operand_object     *obj_desc;	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 (node->object) {		return_ACPI_STATUS (AE_OK);	}	if (!op->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->value.arg, &obj_desc);	if (ACPI_FAILURE (status)) {		return_ACPI_STATUS (status);	}	/* Re-type the object according to it's argument */	node->type = obj_desc->common.type;	/* Init obj */	status = acpi_ns_attach_object (node, obj_desc, (u8) node->type);	/* Remove local reference to the object */	acpi_ut_remove_reference (obj_desc);	return_ACPI_STATUS (status);}

⌨️ 快捷键说明

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