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

📄 exresop.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
		 * Resolve this object to a value		 */		status = acpi_ex_resolve_to_value(stack_ptr, walk_state);		if (ACPI_FAILURE(status)) {			return_ACPI_STATUS(status);		}		/* Get the resolved object */		obj_desc = *stack_ptr;		/*		 * Check the resulting object (value) type		 */		switch (this_arg_type) {			/*			 * For the simple cases, only one type of resolved object			 * is allowed			 */		case ARGI_MUTEX:			/* Need an operand of type ACPI_TYPE_MUTEX */			type_needed = ACPI_TYPE_MUTEX;			break;		case ARGI_EVENT:			/* Need an operand of type ACPI_TYPE_EVENT */			type_needed = ACPI_TYPE_EVENT;			break;		case ARGI_PACKAGE:	/* Package */			/* Need an operand of type ACPI_TYPE_PACKAGE */			type_needed = ACPI_TYPE_PACKAGE;			break;		case ARGI_ANYTYPE:			/* Any operand type will do */			type_needed = ACPI_TYPE_ANY;			break;		case ARGI_DDBHANDLE:			/* Need an operand of type ACPI_TYPE_DDB_HANDLE */			type_needed = ACPI_TYPE_LOCAL_REFERENCE;			break;			/*			 * The more complex cases allow multiple resolved object types			 */		case ARGI_INTEGER:			/*			 * Need an operand of type ACPI_TYPE_INTEGER,			 * But we can implicitly convert from a STRING or BUFFER			 * Aka - "Implicit Source Operand Conversion"			 */			status =			    acpi_ex_convert_to_integer(obj_desc, stack_ptr, 16);			if (ACPI_FAILURE(status)) {				if (status == AE_TYPE) {					ACPI_DEBUG_PRINT((ACPI_DB_ERROR,							  "Needed [Integer/String/Buffer], found [%s] %p\n",							  acpi_ut_get_object_type_name							  (obj_desc),							  obj_desc));					return_ACPI_STATUS(AE_AML_OPERAND_TYPE);				}				return_ACPI_STATUS(status);			}			if (obj_desc != *stack_ptr) {				acpi_ut_remove_reference(obj_desc);			}			goto next_operand;		case ARGI_BUFFER:			/*			 * Need an operand of type ACPI_TYPE_BUFFER,			 * But we can implicitly convert from a STRING or INTEGER			 * Aka - "Implicit Source Operand Conversion"			 */			status = acpi_ex_convert_to_buffer(obj_desc, stack_ptr);			if (ACPI_FAILURE(status)) {				if (status == AE_TYPE) {					ACPI_DEBUG_PRINT((ACPI_DB_ERROR,							  "Needed [Integer/String/Buffer], found [%s] %p\n",							  acpi_ut_get_object_type_name							  (obj_desc),							  obj_desc));					return_ACPI_STATUS(AE_AML_OPERAND_TYPE);				}				return_ACPI_STATUS(status);			}			if (obj_desc != *stack_ptr) {				acpi_ut_remove_reference(obj_desc);			}			goto next_operand;		case ARGI_STRING:			/*			 * Need an operand of type ACPI_TYPE_STRING,			 * But we can implicitly convert from a BUFFER or INTEGER			 * Aka - "Implicit Source Operand Conversion"			 */			status = acpi_ex_convert_to_string(obj_desc, stack_ptr,							   ACPI_IMPLICIT_CONVERT_HEX);			if (ACPI_FAILURE(status)) {				if (status == AE_TYPE) {					ACPI_DEBUG_PRINT((ACPI_DB_ERROR,							  "Needed [Integer/String/Buffer], found [%s] %p\n",							  acpi_ut_get_object_type_name							  (obj_desc),							  obj_desc));					return_ACPI_STATUS(AE_AML_OPERAND_TYPE);				}				return_ACPI_STATUS(status);			}			if (obj_desc != *stack_ptr) {				acpi_ut_remove_reference(obj_desc);			}			goto next_operand;		case ARGI_COMPUTEDATA:			/* Need an operand of type INTEGER, STRING or BUFFER */			switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {			case ACPI_TYPE_INTEGER:			case ACPI_TYPE_STRING:			case ACPI_TYPE_BUFFER:				/* Valid operand */				break;			default:				ACPI_DEBUG_PRINT((ACPI_DB_ERROR,						  "Needed [Integer/String/Buffer], found [%s] %p\n",						  acpi_ut_get_object_type_name						  (obj_desc), obj_desc));				return_ACPI_STATUS(AE_AML_OPERAND_TYPE);			}			goto next_operand;		case ARGI_BUFFER_OR_STRING:			/* Need an operand of type STRING or BUFFER */			switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {			case ACPI_TYPE_STRING:			case ACPI_TYPE_BUFFER:				/* Valid operand */				break;			case ACPI_TYPE_INTEGER:				/* Highest priority conversion is to type Buffer */				status =				    acpi_ex_convert_to_buffer(obj_desc,							      stack_ptr);				if (ACPI_FAILURE(status)) {					return_ACPI_STATUS(status);				}				if (obj_desc != *stack_ptr) {					acpi_ut_remove_reference(obj_desc);				}				break;			default:				ACPI_DEBUG_PRINT((ACPI_DB_ERROR,						  "Needed [Integer/String/Buffer], found [%s] %p\n",						  acpi_ut_get_object_type_name						  (obj_desc), obj_desc));				return_ACPI_STATUS(AE_AML_OPERAND_TYPE);			}			goto next_operand;		case ARGI_DATAOBJECT:			/*			 * ARGI_DATAOBJECT is only used by the size_of operator.			 * Need a buffer, string, package, or ref_of reference.			 *			 * The only reference allowed here is a direct reference to			 * a namespace node.			 */			switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {			case ACPI_TYPE_PACKAGE:			case ACPI_TYPE_STRING:			case ACPI_TYPE_BUFFER:			case ACPI_TYPE_LOCAL_REFERENCE:				/* Valid operand */				break;			default:				ACPI_DEBUG_PRINT((ACPI_DB_ERROR,						  "Needed [Buffer/String/Package/Reference], found [%s] %p\n",						  acpi_ut_get_object_type_name						  (obj_desc), obj_desc));				return_ACPI_STATUS(AE_AML_OPERAND_TYPE);			}			goto next_operand;		case ARGI_COMPLEXOBJ:			/* Need a buffer or package or (ACPI 2.0) String */			switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {			case ACPI_TYPE_PACKAGE:			case ACPI_TYPE_STRING:			case ACPI_TYPE_BUFFER:				/* Valid operand */				break;			default:				ACPI_DEBUG_PRINT((ACPI_DB_ERROR,						  "Needed [Buffer/String/Package], found [%s] %p\n",						  acpi_ut_get_object_type_name						  (obj_desc), obj_desc));				return_ACPI_STATUS(AE_AML_OPERAND_TYPE);			}			goto next_operand;		case ARGI_REGION_OR_FIELD:			/* Need an operand of type REGION or a FIELD in a region */			switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {			case ACPI_TYPE_REGION:			case ACPI_TYPE_LOCAL_REGION_FIELD:			case ACPI_TYPE_LOCAL_BANK_FIELD:			case ACPI_TYPE_LOCAL_INDEX_FIELD:				/* Valid operand */				break;			default:				ACPI_DEBUG_PRINT((ACPI_DB_ERROR,						  "Needed [Region/region_field], found [%s] %p\n",						  acpi_ut_get_object_type_name						  (obj_desc), obj_desc));				return_ACPI_STATUS(AE_AML_OPERAND_TYPE);			}			goto next_operand;		case ARGI_DATAREFOBJ:			/* Used by the Store() operator only */			switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {			case ACPI_TYPE_INTEGER:			case ACPI_TYPE_PACKAGE:			case ACPI_TYPE_STRING:			case ACPI_TYPE_BUFFER:			case ACPI_TYPE_BUFFER_FIELD:			case ACPI_TYPE_LOCAL_REFERENCE:			case ACPI_TYPE_LOCAL_REGION_FIELD:			case ACPI_TYPE_LOCAL_BANK_FIELD:			case ACPI_TYPE_LOCAL_INDEX_FIELD:			case ACPI_TYPE_DDB_HANDLE:				/* Valid operand */				break;			default:				if (acpi_gbl_enable_interpreter_slack) {					/*					 * Enable original behavior of Store(), allowing any and all					 * objects as the source operand.  The ACPI spec does not					 * allow this, however.					 */					break;				}				if (target_op == AML_DEBUG_OP) {					/* Allow store of any object to the Debug object */					break;				}				ACPI_DEBUG_PRINT((ACPI_DB_ERROR,						  "Needed Integer/Buffer/String/Package/Ref/Ddb], found [%s] %p\n",						  acpi_ut_get_object_type_name						  (obj_desc), obj_desc));				return_ACPI_STATUS(AE_AML_OPERAND_TYPE);			}			goto next_operand;		default:			/* Unknown type */			ACPI_DEBUG_PRINT((ACPI_DB_ERROR,					  "Internal - Unknown ARGI (required operand) type %X\n",					  this_arg_type));			return_ACPI_STATUS(AE_BAD_PARAMETER);		}		/*		 * Make sure that the original object was resolved to the		 * required object type (Simple cases only).		 */		status = acpi_ex_check_object_type(type_needed,						   ACPI_GET_OBJECT_TYPE						   (*stack_ptr), *stack_ptr);		if (ACPI_FAILURE(status)) {			return_ACPI_STATUS(status);		}	      next_operand:		/*		 * If more operands needed, decrement stack_ptr to point		 * to next operand on stack		 */		if (GET_CURRENT_ARG_TYPE(arg_types)) {			stack_ptr--;		}	}	return_ACPI_STATUS(status);}

⌨️ 快捷键说明

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