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

📄 dsopcode.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 3 页
字号:
 * RETURN:      Status * * DESCRIPTION: Perform actual initialization of a buffer field * ******************************************************************************/static 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 */		field_flags = AML_FIELD_ACCESS_BYTE;		bit_offset = offset;		bit_count = (u32) length_desc->integer.value;		/* Must have a valid (>0) bit count */		if (bit_count == 0) {			ACPI_DEBUG_PRINT((ACPI_DB_ERROR,					  "Attempt to create_field of length 0\n"));			status = AE_AML_OPERAND_VALUE;			goto cleanup;		}		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 * * DESCRIPTION: Get the operands and complete the following data object types: *              Buffer, Package. * ******************************************************************************/acpi_statusacpi_ds_eval_data_object_operands(struct acpi_walk_state *walk_state,				  union acpi_parse_object *op,				  union acpi_operand_object *obj_desc){	acpi_status status;	union acpi_operand_object *arg_desc;	u32 length;

⌨️ 快捷键说明

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