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

📄 exresop.c

📁 linux-2.6.15.6
💻 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_EXECUTERACPI_MODULE_NAME("exresop")/* Local prototypes */static acpi_statusacpi_ex_check_object_type(acpi_object_type type_needed,			  acpi_object_type this_type, void *object);/******************************************************************************* * * 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 * ******************************************************************************/static 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;	u16 target_op = 0;	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:			/* Namespace 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:					target_op = AML_DEBUG_OP;					/*lint -fallthrough */				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 */				case AML_INT_NAMEPATH_OP:	/* Reference to a named object */					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			 * A Namespace Node is OK as-is			 */			if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) ==			    ACPI_DESC_TYPE_NAMED) {				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 (obj_desc->reference.opcode == AML_NAME_OP) {				/* Convert a named reference to the actual named object */				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 */			break;		}		/*

⌨️ 快捷键说明

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