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

📄 exresop.c

📁 h内核
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************** * * Module Name: exresop - AML Interpreter operand/object resolution * *****************************************************************************//* * Copyright (C) 2000 - 2005, R. Byron Moore * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions, and the following disclaimer, *    without modification. * 2. Redistributions in binary form must reproduce at minimum a disclaimer *    substantially similar to the "NO WARRANTY" disclaimer below *    ("Disclaimer") and any redistribution must be conditioned upon *    including a substantially similar Disclaimer requirement for further *    binary redistribution. * 3. Neither the names of the above-listed copyright holders nor the names *    of any contributors may be used to endorse or promote products derived *    from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License ("GPL") version 2 as published by the Free * Software Foundation. * * NO WARRANTY * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. */#include <acpi/acpi.h>#include <acpi/amlcode.h>#include <acpi/acparser.h>#include <acpi/acinterp.h>#define _COMPONENT          ACPI_EXECUTER	 ACPI_MODULE_NAME    ("exresop")/******************************************************************************* * * FUNCTION:    acpi_ex_check_object_type * * PARAMETERS:  type_needed         Object type needed *              this_type           Actual object type *              Object              Object pointer * * RETURN:      Status * * DESCRIPTION: Check required type against actual type * ******************************************************************************/acpi_statusacpi_ex_check_object_type (	acpi_object_type                type_needed,	acpi_object_type                this_type,	void                            *object){	ACPI_FUNCTION_NAME ("ex_check_object_type");	if (type_needed == ACPI_TYPE_ANY) {		/* All types OK, so we don't perform any typechecks */		return (AE_OK);	}	if (type_needed == ACPI_TYPE_LOCAL_REFERENCE) {		/*		 * Allow the AML "Constant" opcodes (Zero, One, etc.) to be reference		 * objects and thus allow them to be targets.  (As per the ACPI		 * specification, a store to a constant is a noop.)		 */		if ((this_type == ACPI_TYPE_INTEGER) &&			(((union acpi_operand_object *) object)->common.flags & AOPOBJ_AML_CONSTANT)) {			return (AE_OK);		}	}	if (type_needed != this_type) {		ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,			"Needed [%s], found [%s] %p\n",			acpi_ut_get_type_name (type_needed),			acpi_ut_get_type_name (this_type), object));		return (AE_AML_OPERAND_TYPE);	}	return (AE_OK);}/******************************************************************************* * * FUNCTION:    acpi_ex_resolve_operands * * PARAMETERS:  Opcode              - Opcode being interpreted *              stack_ptr           - Pointer to the operand stack to be *                                    resolved *              walk_state          - Current state * * RETURN:      Status * * DESCRIPTION: Convert multiple input operands to the types required by the *              target operator. * *      Each 5-bit group in arg_types represents one required *      operand and indicates the required Type. The corresponding operand *      will be converted to the required type if possible, otherwise we *      abort with an exception. * ******************************************************************************/acpi_statusacpi_ex_resolve_operands (	u16                             opcode,	union acpi_operand_object       **stack_ptr,	struct acpi_walk_state          *walk_state){	union acpi_operand_object       *obj_desc;	acpi_status                     status = AE_OK;	u8                              object_type;	void                            *temp_node;	u32                             arg_types;	const struct acpi_opcode_info   *op_info;	u32                             this_arg_type;	acpi_object_type                type_needed;	ACPI_FUNCTION_TRACE_U32 ("ex_resolve_operands", opcode);	op_info = acpi_ps_get_opcode_info (opcode);	if (op_info->class == AML_CLASS_UNKNOWN) {		return_ACPI_STATUS (AE_AML_BAD_OPCODE);	}	arg_types = op_info->runtime_args;	if (arg_types == ARGI_INVALID_OPCODE) {		ACPI_REPORT_ERROR (("resolve_operands: %X is not a valid AML opcode\n",			opcode));		return_ACPI_STATUS (AE_AML_INTERNAL);	}	ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Opcode %X [%s] required_operand_types=%8.8X \n",		opcode, op_info->name, arg_types));	/*	 * Normal exit is with (arg_types == 0) at end of argument list.	 * Function will return an exception from within the loop upon	 * finding an entry which is not (or cannot be converted	 * to) the required type; if stack underflows; or upon	 * finding a NULL stack entry (which should not happen).	 */	while (GET_CURRENT_ARG_TYPE (arg_types)) {		if (!stack_ptr || !*stack_ptr) {			ACPI_REPORT_ERROR (("resolve_operands: Null stack entry at %p\n",				stack_ptr));			return_ACPI_STATUS (AE_AML_INTERNAL);		}		/* Extract useful items */		obj_desc = *stack_ptr;		/* Decode the descriptor type */		switch (ACPI_GET_DESCRIPTOR_TYPE (obj_desc)) {		case ACPI_DESC_TYPE_NAMED:			/* Node */			object_type = ((struct acpi_namespace_node *) obj_desc)->type;			break;		case ACPI_DESC_TYPE_OPERAND:			/* ACPI internal object */			object_type = ACPI_GET_OBJECT_TYPE (obj_desc);			/* Check for bad acpi_object_type */			if (!acpi_ut_valid_object_type (object_type)) {				ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Bad operand object type [%X]\n",					object_type));				return_ACPI_STATUS (AE_AML_OPERAND_TYPE);			}			if (object_type == (u8) ACPI_TYPE_LOCAL_REFERENCE) {				/*				 * Decode the Reference				 */				op_info = acpi_ps_get_opcode_info (opcode);				if (op_info->class == AML_CLASS_UNKNOWN) {					return_ACPI_STATUS (AE_AML_BAD_OPCODE);				}				switch (obj_desc->reference.opcode) {				case AML_DEBUG_OP:				case AML_NAME_OP:				case AML_INDEX_OP:				case AML_REF_OF_OP:				case AML_ARG_OP:				case AML_LOCAL_OP:				case AML_LOAD_OP:   /* ddb_handle from LOAD_OP or LOAD_TABLE_OP */					ACPI_DEBUG_ONLY_MEMBERS (ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,						"Operand is a Reference, ref_opcode [%s]\n",						(acpi_ps_get_opcode_info (obj_desc->reference.opcode))->name)));					break;				default:					ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,						"Operand is a Reference, Unknown Reference Opcode %X [%s]\n",						obj_desc->reference.opcode,						(acpi_ps_get_opcode_info (obj_desc->reference.opcode))->name));					return_ACPI_STATUS (AE_AML_OPERAND_TYPE);				}			}			break;		default:			/* Invalid descriptor */			ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,					"Invalid descriptor %p [%s]\n",					obj_desc, acpi_ut_get_descriptor_name (obj_desc)));			return_ACPI_STATUS (AE_AML_OPERAND_TYPE);		}		/*		 * Get one argument type, point to the next		 */		this_arg_type = GET_CURRENT_ARG_TYPE (arg_types);		INCREMENT_ARG_LIST (arg_types);		/*		 * Handle cases where the object does not need to be		 * resolved to a value		 */		switch (this_arg_type) {		case ARGI_REF_OR_STRING:        /* Can be a String or Reference */			if ((ACPI_GET_DESCRIPTOR_TYPE (obj_desc) == ACPI_DESC_TYPE_OPERAND) &&				(ACPI_GET_OBJECT_TYPE (obj_desc) == ACPI_TYPE_STRING)) {				/*				 * String found - the string references a named object and must be				 * resolved to a node				 */				goto next_operand;			}			/* Else not a string - fall through to the normal Reference case below */			/*lint -fallthrough */		case ARGI_REFERENCE:            /* References: */		case ARGI_INTEGER_REF:		case ARGI_OBJECT_REF:		case ARGI_DEVICE_REF:		case ARGI_TARGETREF:            /* Allows implicit conversion rules before store */		case ARGI_FIXED_TARGET:         /* No implicit conversion before store to target */		case ARGI_SIMPLE_TARGET:        /* Name, Local, or Arg - no implicit conversion  */			/* Need an operand of type ACPI_TYPE_LOCAL_REFERENCE */			if (ACPI_GET_DESCRIPTOR_TYPE (obj_desc) == ACPI_DESC_TYPE_NAMED) /* Node (name) ptr OK as-is */ {				goto next_operand;			}			status = acpi_ex_check_object_type (ACPI_TYPE_LOCAL_REFERENCE,					  object_type, obj_desc);			if (ACPI_FAILURE (status)) {				return_ACPI_STATUS (status);			}			if (AML_NAME_OP == obj_desc->reference.opcode) {				/*				 * Convert an indirect name ptr to direct name ptr and put				 * it on the stack				 */				temp_node = obj_desc->reference.object;				acpi_ut_remove_reference (obj_desc);				(*stack_ptr) = temp_node;			}			goto next_operand;		case ARGI_DATAREFOBJ:  /* Store operator only */			/*			 * We don't want to resolve index_op reference objects during			 * a store because this would be an implicit de_ref_of operation.			 * Instead, we just want to store the reference object.			 * -- All others must be resolved below.			 */			if ((opcode == AML_STORE_OP) &&				(ACPI_GET_OBJECT_TYPE (*stack_ptr) == ACPI_TYPE_LOCAL_REFERENCE) &&				((*stack_ptr)->reference.opcode == AML_INDEX_OP)) {				goto next_operand;			}			break;		default:			/* All cases covered above */

⌨️ 快捷键说明

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