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

📄 nseval.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
 *                                    any). If NULL, no value is returned. *                  parameter_type  - Type of Parameter list *                  return_object   - Where to put method's return value (if *                                    any). If NULL, no value is returned. * * RETURN:      Status * * DESCRIPTION: Evaluate object or execute the requested method passing the *              given parameters * * MUTEX:       Locks Namespace * ******************************************************************************/acpi_status acpi_ns_evaluate_by_handle(struct acpi_parameter_info *info){	acpi_status status;	ACPI_FUNCTION_TRACE("ns_evaluate_by_handle");	/* Check if namespace has been initialized */	if (!acpi_gbl_root_node) {		return_ACPI_STATUS(AE_NO_NAMESPACE);	}	/* Parameter Validation */	if (!info) {		return_ACPI_STATUS(AE_BAD_PARAMETER);	}	/* Initialize the return value to an invalid object */	info->return_object = NULL;	/* Get the prefix handle and Node */	status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);	if (ACPI_FAILURE(status)) {		return_ACPI_STATUS(status);	}	info->node = acpi_ns_map_handle_to_node(info->node);	if (!info->node) {		(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);		return_ACPI_STATUS(AE_BAD_PARAMETER);	}	/*	 * For a method alias, we must grab the actual method node so that proper	 * scoping context will be established before execution.	 */	if (acpi_ns_get_type(info->node) == ACPI_TYPE_LOCAL_METHOD_ALIAS) {		info->node =		    ACPI_CAST_PTR(struct acpi_namespace_node,				  info->node->object);	}	/*	 * Two major cases here:	 * 1) The object is an actual control method -- execute it.	 * 2) The object is not a method -- just return it's current value	 *	 * In both cases, the namespace is unlocked by the acpi_ns* procedure	 */	if (acpi_ns_get_type(info->node) == ACPI_TYPE_METHOD) {		/*		 * Case 1) We have an actual control method to execute		 */		status = acpi_ns_execute_control_method(info);	} else {		/*		 * Case 2) Object is NOT a method, just return its current value		 */		status = acpi_ns_get_object_value(info);	}	/*	 * Check if there is a return value on the stack that must be dealt with	 */	if (status == AE_CTRL_RETURN_VALUE) {		/* Map AE_CTRL_RETURN_VALUE to AE_OK, we are done with it */		status = AE_OK;	}	/*	 * Namespace was unlocked by the handling acpi_ns* function, so we	 * just return	 */	return_ACPI_STATUS(status);}/******************************************************************************* * * FUNCTION:    acpi_ns_execute_control_method * * PARAMETERS:  Info            - Method info block, contains: *                  Node            - Method Node to execute *                  obj_desc        - Method object *                  Parameters      - List of parameters to pass to the method, *                                    terminated by NULL. Params itself may be *                                    NULL if no parameters are being passed. *                  return_object   - Where to put method's return value (if *                                    any). If NULL, no value is returned. *                  parameter_type  - Type of Parameter list *                  return_object   - Where to put method's return value (if *                                    any). If NULL, no value is returned. * * RETURN:      Status * * DESCRIPTION: Execute the requested method passing the given parameters * * MUTEX:       Assumes namespace is locked * ******************************************************************************/static acpi_statusacpi_ns_execute_control_method(struct acpi_parameter_info *info){	acpi_status status;	ACPI_FUNCTION_TRACE("ns_execute_control_method");	/* Verify that there is a method associated with this object */	info->obj_desc = acpi_ns_get_attached_object(info->node);	if (!info->obj_desc) {		ACPI_DEBUG_PRINT((ACPI_DB_ERROR,				  "No attached method object\n"));		(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);		return_ACPI_STATUS(AE_NULL_OBJECT);	}	ACPI_DUMP_PATHNAME(info->node, "Execute Method:",			   ACPI_LV_INFO, _COMPONENT);	ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Method at AML address %p Length %X\n",			  info->obj_desc->method.aml_start + 1,			  info->obj_desc->method.aml_length - 1));	/*	 * Unlock the namespace before execution.  This allows namespace access	 * via the external Acpi* interfaces while a method is being executed.	 * However, any namespace deletion must acquire both the namespace and	 * interpreter locks to ensure that no thread is using the portion of the	 * namespace that is being deleted.	 */	status = acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);	if (ACPI_FAILURE(status)) {		return_ACPI_STATUS(status);	}	/*	 * Execute the method via the interpreter.  The interpreter is locked	 * here before calling into the AML parser	 */	status = acpi_ex_enter_interpreter();	if (ACPI_FAILURE(status)) {		return_ACPI_STATUS(status);	}	status = acpi_ps_execute_method(info);	acpi_ex_exit_interpreter();	return_ACPI_STATUS(status);}/******************************************************************************* * * FUNCTION:    acpi_ns_get_object_value * * PARAMETERS:  Info            - Method info block, contains: *                  Node            - Object's NS node *                  return_object   - Where to put object value (if *                                    any). If NULL, no value is returned. * * RETURN:      Status * * DESCRIPTION: Return the current value of the object * * MUTEX:       Assumes namespace is locked, leaves namespace unlocked * ******************************************************************************/static acpi_status acpi_ns_get_object_value(struct acpi_parameter_info *info){	acpi_status status = AE_OK;	struct acpi_namespace_node *resolved_node = info->node;	ACPI_FUNCTION_TRACE("ns_get_object_value");	/*	 * Objects require additional resolution steps (e.g., the Node may be a	 * field that must be read, etc.) -- we can't just grab the object out of	 * the node.	 */	/*	 * Use resolve_node_to_value() to get the associated value. This call always	 * deletes obj_desc (allocated above).	 *	 * NOTE: we can get away with passing in NULL for a walk state because	 * obj_desc is guaranteed to not be a reference to either a method local or	 * a method argument (because this interface can only be called from the	 * acpi_evaluate external interface, never called from a running method.)	 *	 * Even though we do not directly invoke the interpreter for this, we must	 * enter it because we could access an opregion. The opregion access code	 * assumes that the interpreter is locked.	 *	 * We must release the namespace lock before entering the intepreter.	 */	status = acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);	if (ACPI_FAILURE(status)) {		return_ACPI_STATUS(status);	}	status = acpi_ex_enter_interpreter();	if (ACPI_SUCCESS(status)) {		status = acpi_ex_resolve_node_to_value(&resolved_node, NULL);		/*		 * If acpi_ex_resolve_node_to_value() succeeded, the return value was placed		 * in resolved_node.		 */		acpi_ex_exit_interpreter();		if (ACPI_SUCCESS(status)) {			status = AE_CTRL_RETURN_VALUE;			info->return_object = ACPI_CAST_PTR			    (union acpi_operand_object, resolved_node);			ACPI_DEBUG_PRINT((ACPI_DB_NAMES,					  "Returning object %p [%s]\n",					  info->return_object,					  acpi_ut_get_object_type_name(info->								       return_object)));		}	}	/* Namespace is unlocked */	return_ACPI_STATUS(status);}

⌨️ 快捷键说明

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