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

📄 dsopcode.c

📁 h内核
💻 C
📖 第 1 页 / 共 3 页
字号:
 * 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;	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) {			/* 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)) {			/*			 * 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 + -