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

📄 dsopcode.c

📁 h内核
💻 C
📖 第 1 页 / 共 3 页
字号:
/***************************************************************************** * * FUNCTION:    acpi_ds_init_buffer_field * * PARAMETERS:  aml_opcode      - create_xxx_field *              obj_desc        - buffer_field object *              buffer_desc     - Host Buffer *              offset_desc     - Offset into buffer *              Length          - Length of field (CREATE_FIELD_OP only) *              Result          - Where to store the result * * RETURN:      Status * * DESCRIPTION: Perform actual initialization of a buffer field * ****************************************************************************/acpi_statusacpi_ds_init_buffer_field (	u16                             aml_opcode,	union acpi_operand_object       *obj_desc,	union acpi_operand_object       *buffer_desc,	union acpi_operand_object       *offset_desc,	union acpi_operand_object       *length_desc,	union acpi_operand_object       *result_desc){	u32                             offset;	u32                             bit_offset;	u32                             bit_count;	u8                              field_flags;	acpi_status                     status;	ACPI_FUNCTION_TRACE_PTR ("ds_init_buffer_field", obj_desc);	/* Host object must be a Buffer */	if (ACPI_GET_OBJECT_TYPE (buffer_desc) != ACPI_TYPE_BUFFER) {		ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,			"Target of Create Field is not a Buffer object - %s\n",			acpi_ut_get_object_type_name (buffer_desc)));		status = AE_AML_OPERAND_TYPE;		goto cleanup;	}	/*	 * The last parameter to all of these opcodes (result_desc) started	 * out as a name_string, and should therefore now be a NS node	 * after resolution in acpi_ex_resolve_operands().	 */	if (ACPI_GET_DESCRIPTOR_TYPE (result_desc) != ACPI_DESC_TYPE_NAMED) {		ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "(%s) destination not a NS Node [%s]\n",				acpi_ps_get_opcode_name (aml_opcode), acpi_ut_get_descriptor_name (result_desc)));		status = AE_AML_OPERAND_TYPE;		goto cleanup;	}	offset = (u32) offset_desc->integer.value;	/*	 * Setup the Bit offsets and counts, according to the opcode	 */	switch (aml_opcode) {	case AML_CREATE_FIELD_OP:		/* Offset is in bits, count is in bits */		bit_offset = offset;		bit_count  = (u32) length_desc->integer.value;		field_flags = AML_FIELD_ACCESS_BYTE;		break;	case AML_CREATE_BIT_FIELD_OP:		/* Offset is in bits, Field is one bit */		bit_offset = offset;		bit_count  = 1;		field_flags = AML_FIELD_ACCESS_BYTE;		break;	case AML_CREATE_BYTE_FIELD_OP:		/* Offset is in bytes, field is one byte */		bit_offset = 8 * offset;		bit_count  = 8;		field_flags = AML_FIELD_ACCESS_BYTE;		break;	case AML_CREATE_WORD_FIELD_OP:		/* Offset is in bytes, field is one word */		bit_offset = 8 * offset;		bit_count  = 16;		field_flags = AML_FIELD_ACCESS_WORD;		break;	case AML_CREATE_DWORD_FIELD_OP:		/* Offset is in bytes, field is one dword */		bit_offset = 8 * offset;		bit_count  = 32;		field_flags = AML_FIELD_ACCESS_DWORD;		break;	case AML_CREATE_QWORD_FIELD_OP:		/* Offset is in bytes, field is one qword */		bit_offset = 8 * offset;		bit_count  = 64;		field_flags = AML_FIELD_ACCESS_QWORD;		break;	default:		ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,			"Unknown field creation opcode %02x\n",			aml_opcode));		status = AE_AML_BAD_OPCODE;		goto cleanup;	}	/* Entire field must fit within the current length of the buffer */	if ((bit_offset + bit_count) >		(8 * (u32) buffer_desc->buffer.length)) {		ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,			"Field [%4.4s] size %d exceeds Buffer [%4.4s] size %d (bits)\n",			 acpi_ut_get_node_name (result_desc),			 bit_offset + bit_count,			 acpi_ut_get_node_name (buffer_desc->buffer.node),			 8 * (u32) buffer_desc->buffer.length));		status = AE_AML_BUFFER_LIMIT;		goto cleanup;	}	/*	 * Initialize areas of the field object that are common to all fields	 * For field_flags, use LOCK_RULE = 0 (NO_LOCK), UPDATE_RULE = 0 (UPDATE_PRESERVE)	 */	status = acpi_ex_prep_common_field_object (obj_desc, field_flags, 0,			  bit_offset, bit_count);	if (ACPI_FAILURE (status)) {		goto cleanup;	}	obj_desc->buffer_field.buffer_obj = buffer_desc;	/* Reference count for buffer_desc inherits obj_desc count */	buffer_desc->common.reference_count = (u16) (buffer_desc->common.reference_count +			  obj_desc->common.reference_count);cleanup:	/* Always delete the operands */	acpi_ut_remove_reference (offset_desc);	acpi_ut_remove_reference (buffer_desc);	if (aml_opcode == AML_CREATE_FIELD_OP) {		acpi_ut_remove_reference (length_desc);	}	/* On failure, delete the result descriptor */	if (ACPI_FAILURE (status)) {		acpi_ut_remove_reference (result_desc); /* Result descriptor */	}	else {		/* Now the address and length are valid for this buffer_field */		obj_desc->buffer_field.flags |= AOPOBJ_DATA_VALID;	}	return_ACPI_STATUS (status);}/***************************************************************************** * * FUNCTION:    acpi_ds_eval_buffer_field_operands * * PARAMETERS:  walk_state      - Current walk *              Op              - A valid buffer_field Op object * * RETURN:      Status * * DESCRIPTION: Get buffer_field Buffer and Index *              Called from acpi_ds_exec_end_op during buffer_field parse tree walk * ****************************************************************************/acpi_statusacpi_ds_eval_buffer_field_operands (	struct acpi_walk_state          *walk_state,	union acpi_parse_object         *op){	acpi_status                     status;	union acpi_operand_object       *obj_desc;	struct acpi_namespace_node      *node;	union acpi_parse_object         *next_op;	ACPI_FUNCTION_TRACE_PTR ("ds_eval_buffer_field_operands", op);	/*	 * This is where we evaluate the address and length fields of the	 * create_xxx_field declaration	 */	node =  op->common.node;	/* next_op points to the op that holds the Buffer */	next_op = op->common.value.arg;	/* Evaluate/create the address and length operands */	status = acpi_ds_create_operands (walk_state, next_op);	if (ACPI_FAILURE (status)) {		return_ACPI_STATUS (status);	}	obj_desc = acpi_ns_get_attached_object (node);	if (!obj_desc) {		return_ACPI_STATUS (AE_NOT_EXIST);	}	/* Resolve the operands */	status = acpi_ex_resolve_operands (op->common.aml_opcode,			  ACPI_WALK_OPERANDS, walk_state);	ACPI_DUMP_OPERANDS (ACPI_WALK_OPERANDS, ACPI_IMODE_EXECUTE,			  acpi_ps_get_opcode_name (op->common.aml_opcode),			  walk_state->num_operands, "after acpi_ex_resolve_operands");	if (ACPI_FAILURE (status)) {		ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "(%s) bad operand(s) (%X)\n",			acpi_ps_get_opcode_name (op->common.aml_opcode), status));		return_ACPI_STATUS (status);	}	/* Initialize the Buffer Field */	if (op->common.aml_opcode == AML_CREATE_FIELD_OP) {		/* NOTE: Slightly different operands for this opcode */		status = acpi_ds_init_buffer_field (op->common.aml_opcode, obj_desc,				 walk_state->operands[0], walk_state->operands[1],				 walk_state->operands[2], walk_state->operands[3]);	}	else {		/* All other, create_xxx_field opcodes */		status = acpi_ds_init_buffer_field (op->common.aml_opcode, obj_desc,				 walk_state->operands[0], walk_state->operands[1],						  NULL, walk_state->operands[2]);	}	return_ACPI_STATUS (status);}/***************************************************************************** * * FUNCTION:    acpi_ds_eval_region_operands * * PARAMETERS:  walk_state      - Current walk *              Op              - A valid region Op object * * RETURN:      Status * * DESCRIPTION: Get region address and length *              Called from acpi_ds_exec_end_op during op_region parse tree walk * ****************************************************************************/acpi_statusacpi_ds_eval_region_operands (	struct acpi_walk_state          *walk_state,	union acpi_parse_object         *op){	acpi_status                     status;	union acpi_operand_object       *obj_desc;	union acpi_operand_object       *operand_desc;	struct acpi_namespace_node      *node;	union acpi_parse_object         *next_op;	ACPI_FUNCTION_TRACE_PTR ("ds_eval_region_operands", op);	/*	 * This is where we evaluate the address and length fields of the op_region declaration	 */	node =  op->common.node;	/* next_op points to the op that holds the space_iD */	next_op = op->common.value.arg;	/* next_op points to address op */	next_op = next_op->common.next;	/* Evaluate/create the address and length operands */	status = acpi_ds_create_operands (walk_state, next_op);	if (ACPI_FAILURE (status)) {		return_ACPI_STATUS (status);	}	/* Resolve the length and address operands to numbers */	status = acpi_ex_resolve_operands (op->common.aml_opcode, ACPI_WALK_OPERANDS, walk_state);	if (ACPI_FAILURE (status)) {		return_ACPI_STATUS (status);	}	ACPI_DUMP_OPERANDS (ACPI_WALK_OPERANDS, ACPI_IMODE_EXECUTE,			  acpi_ps_get_opcode_name (op->common.aml_opcode),			  1, "after acpi_ex_resolve_operands");	obj_desc = acpi_ns_get_attached_object (node);	if (!obj_desc) {		return_ACPI_STATUS (AE_NOT_EXIST);	}	/*	 * Get the length operand and save it	 * (at Top of stack)	 */	operand_desc = walk_state->operands[walk_state->num_operands - 1];	obj_desc->region.length = (u32) operand_desc->integer.value;	acpi_ut_remove_reference (operand_desc);	/*	 * Get the address and save it	 * (at top of stack - 1)	 */	operand_desc = walk_state->operands[walk_state->num_operands - 2];	obj_desc->region.address = (acpi_physical_address) operand_desc->integer.value;	acpi_ut_remove_reference (operand_desc);	ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "rgn_obj %p Addr %8.8X%8.8X Len %X\n",		obj_desc,		ACPI_FORMAT_UINT64 (obj_desc->region.address),		obj_desc->region.length));	/* Now the address and length are valid for this opregion */	obj_desc->region.flags |= AOPOBJ_DATA_VALID;	return_ACPI_STATUS (status);}/***************************************************************************** * * FUNCTION:    acpi_ds_eval_data_object_operands * * PARAMETERS:  walk_state      - Current walk *              Op              - A valid data_object Op object *              obj_desc        - data_object * * RETURN:      Status *

⌨️ 快捷键说明

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