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

📄 dsopcode.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 3 页
字号:
	ACPI_FUNCTION_TRACE("ds_eval_data_object_operands");	/* The first operand (for all of these data objects) is the length */	status = acpi_ds_create_operand(walk_state, op->common.value.arg, 1);	if (ACPI_FAILURE(status)) {		return_ACPI_STATUS(status);	}	status = acpi_ex_resolve_operands(walk_state->opcode,					  &(walk_state->					    operands[walk_state->num_operands -						     1]), walk_state);	if (ACPI_FAILURE(status)) {		return_ACPI_STATUS(status);	}	/* Extract length operand */	arg_desc = walk_state->operands[walk_state->num_operands - 1];	length = (u32) arg_desc->integer.value;	/* Cleanup for length operand */	status = acpi_ds_obj_stack_pop(1, walk_state);	if (ACPI_FAILURE(status)) {		return_ACPI_STATUS(status);	}	acpi_ut_remove_reference(arg_desc);	/*	 * Create the actual data object	 */	switch (op->common.aml_opcode) {	case AML_BUFFER_OP:		status =		    acpi_ds_build_internal_buffer_obj(walk_state, op, length,						      &obj_desc);		break;	case AML_PACKAGE_OP:	case AML_VAR_PACKAGE_OP:		status =		    acpi_ds_build_internal_package_obj(walk_state, op, length,						       &obj_desc);		break;	default:		return_ACPI_STATUS(AE_AML_BAD_OPCODE);	}	if (ACPI_SUCCESS(status)) {		/*		 * Return the object in the walk_state, unless the parent is a package -		 * in this case, the return object will be stored in the parse tree		 * for the package.		 */		if ((!op->common.parent) ||		    ((op->common.parent->common.aml_opcode != AML_PACKAGE_OP) &&		     (op->common.parent->common.aml_opcode !=		      AML_VAR_PACKAGE_OP)		     && (op->common.parent->common.aml_opcode !=			 AML_NAME_OP))) {			walk_state->result_obj = obj_desc;		}	}	return_ACPI_STATUS(status);}/******************************************************************************* * * FUNCTION:    acpi_ds_exec_begin_control_op * * PARAMETERS:  walk_list       - The list that owns the walk stack *              Op              - The control Op * * RETURN:      Status * * DESCRIPTION: Handles all control ops encountered during control method *              execution. * ******************************************************************************/acpi_statusacpi_ds_exec_begin_control_op(struct acpi_walk_state *walk_state,			      union acpi_parse_object *op){	acpi_status status = AE_OK;	union acpi_generic_state *control_state;	ACPI_FUNCTION_NAME("ds_exec_begin_control_op");	ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "Op=%p Opcode=%2.2X State=%p\n", op,			  op->common.aml_opcode, walk_state));	switch (op->common.aml_opcode) {	case AML_IF_OP:	case AML_WHILE_OP:		/*		 * IF/WHILE: Create a new control state to manage these		 * constructs. We need to manage these as a stack, in order		 * to handle nesting.		 */		control_state = acpi_ut_create_control_state();		if (!control_state) {			status = AE_NO_MEMORY;			break;		}		/*		 * Save a pointer to the predicate for multiple executions		 * of a loop		 */		control_state->control.aml_predicate_start =		    walk_state->parser_state.aml - 1;		control_state->control.package_end =		    walk_state->parser_state.pkg_end;		control_state->control.opcode = op->common.aml_opcode;		/* Push the control state on this walk's control stack */		acpi_ut_push_generic_state(&walk_state->control_state,					   control_state);		break;	case AML_ELSE_OP:		/* Predicate is in the state object */		/* If predicate is true, the IF was executed, ignore ELSE part */		if (walk_state->last_predicate) {			status = AE_CTRL_TRUE;		}		break;	case AML_RETURN_OP:		break;	default:		break;	}	return (status);}/******************************************************************************* * * FUNCTION:    acpi_ds_exec_end_control_op * * PARAMETERS:  walk_list       - The list that owns the walk stack *              Op              - The control Op * * RETURN:      Status * * DESCRIPTION: Handles all control ops encountered during control method *              execution. * ******************************************************************************/acpi_statusacpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state,			    union acpi_parse_object * op){	acpi_status status = AE_OK;	union acpi_generic_state *control_state;	ACPI_FUNCTION_NAME("ds_exec_end_control_op");	switch (op->common.aml_opcode) {	case AML_IF_OP:		ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "[IF_OP] Op=%p\n", op));		/*		 * Save the result of the predicate in case there is an		 * ELSE to come		 */		walk_state->last_predicate =		    (u8) walk_state->control_state->common.value;		/*		 * Pop the control state that was created at the start		 * of the IF and free it		 */		control_state =		    acpi_ut_pop_generic_state(&walk_state->control_state);		acpi_ut_delete_generic_state(control_state);		break;	case AML_ELSE_OP:		break;	case AML_WHILE_OP:		ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "[WHILE_OP] Op=%p\n", op));		if (walk_state->control_state->common.value) {			/* Predicate was true, go back and evaluate it again! */			status = AE_CTRL_PENDING;		}		ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,				  "[WHILE_OP] termination! Op=%p\n", op));		/* Pop this control state and free it */		control_state =		    acpi_ut_pop_generic_state(&walk_state->control_state);		walk_state->aml_last_while =		    control_state->control.aml_predicate_start;		acpi_ut_delete_generic_state(control_state);		break;	case AML_RETURN_OP:		ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,				  "[RETURN_OP] Op=%p Arg=%p\n", op,				  op->common.value.arg));		/*		 * One optional operand -- the return value		 * It can be either an immediate operand or a result that		 * has been bubbled up the tree		 */		if (op->common.value.arg) {			/* Since we have a real Return(), delete any implicit return */			acpi_ds_clear_implicit_return(walk_state);			/* Return statement has an immediate operand */			status =			    acpi_ds_create_operands(walk_state,						    op->common.value.arg);			if (ACPI_FAILURE(status)) {				return (status);			}			/*			 * If value being returned is a Reference (such as			 * an arg or local), resolve it now because it may			 * cease to exist at the end of the method.			 */			status =			    acpi_ex_resolve_to_value(&walk_state->operands[0],						     walk_state);			if (ACPI_FAILURE(status)) {				return (status);			}			/*			 * Get the return value and save as the last result			 * value.  This is the only place where walk_state->return_desc			 * is set to anything other than zero!			 */			walk_state->return_desc = walk_state->operands[0];		} else if ((walk_state->results) &&			   (walk_state->results->results.num_results > 0)) {			/* Since we have a real Return(), delete any implicit return */			acpi_ds_clear_implicit_return(walk_state);			/*			 * The return value has come from a previous calculation.			 *			 * If value being returned is a Reference (such as			 * an arg or local), resolve it now because it may			 * cease to exist at the end of the method.			 *			 * Allow references created by the Index operator to return unchanged.			 */			if ((ACPI_GET_DESCRIPTOR_TYPE			     (walk_state->results->results.obj_desc[0]) ==			     ACPI_DESC_TYPE_OPERAND)			    &&			    (ACPI_GET_OBJECT_TYPE			     (walk_state->results->results.obj_desc[0]) ==			     ACPI_TYPE_LOCAL_REFERENCE)			    && ((walk_state->results->results.obj_desc[0])->				reference.opcode != AML_INDEX_OP)) {				status =				    acpi_ex_resolve_to_value(&walk_state->							     results->results.							     obj_desc[0],							     walk_state);				if (ACPI_FAILURE(status)) {					return (status);				}			}			walk_state->return_desc =			    walk_state->results->results.obj_desc[0];		} else {			/* No return operand */			if (walk_state->num_operands) {				acpi_ut_remove_reference(walk_state->							 operands[0]);			}			walk_state->operands[0] = NULL;			walk_state->num_operands = 0;			walk_state->return_desc = NULL;		}		ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,				  "Completed RETURN_OP State=%p, ret_val=%p\n",				  walk_state, walk_state->return_desc));		/* End the control method execution right now */		status = AE_CTRL_TERMINATE;		break;	case AML_NOOP_OP:		/* Just do nothing! */		break;	case AML_BREAK_POINT_OP:		/* Call up to the OS service layer to handle this */		status =		    acpi_os_signal(ACPI_SIGNAL_BREAKPOINT,				   "Executed AML Breakpoint opcode");		/* If and when it returns, all done. */		break;	case AML_BREAK_OP:	case AML_CONTINUE_OP:	/* ACPI 2.0 */		/* Pop and delete control states until we find a while */		while (walk_state->control_state &&		       (walk_state->control_state->control.opcode !=			AML_WHILE_OP)) {			control_state =			    acpi_ut_pop_generic_state(&walk_state->						      control_state);			acpi_ut_delete_generic_state(control_state);		}		/* No while found? */		if (!walk_state->control_state) {			return (AE_AML_NO_WHILE);		}		/* Was: walk_state->aml_last_while = walk_state->control_state->Control.aml_predicate_start; */		walk_state->aml_last_while =		    walk_state->control_state->control.package_end;		/* Return status depending on opcode */		if (op->common.aml_opcode == AML_BREAK_OP) {			status = AE_CTRL_BREAK;		} else {			status = AE_CTRL_CONTINUE;		}		break;	default:		ACPI_DEBUG_PRINT((ACPI_DB_ERROR,				  "Unknown control opcode=%X Op=%p\n",				  op->common.aml_opcode, op));		status = AE_AML_BAD_OPCODE;		break;	}	return (status);}

⌨️ 快捷键说明

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