nsobject.c

来自「是关于linux2.5.1的完全源码」· C语言 代码 · 共 439 行

C
439
字号
/******************************************************************************* * * Module Name: nsobject - Utilities for objects attached to namespace *                         table entries *              $Revision: 80 $ * ******************************************************************************//* *  Copyright (C) 2000 - 2002, R. Byron Moore * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#include "acpi.h"#include "amlcode.h"#include "acnamesp.h"#include "acinterp.h"#include "actables.h"#define _COMPONENT          ACPI_NAMESPACE	 ACPI_MODULE_NAME    ("nsobject")/******************************************************************************* * * FUNCTION:    Acpi_ns_attach_object * * PARAMETERS:  Node                - Parent Node *              Object              - Object to be attached *              Type                - Type of object, or ACPI_TYPE_ANY if not *                                    known * * DESCRIPTION: Record the given object as the value associated with the *              name whose acpi_handle is passed.  If Object is NULL *              and Type is ACPI_TYPE_ANY, set the name as having no value. *              Note: Future may require that the Node->Flags field be passed *              as a parameter. * * MUTEX:       Assumes namespace is locked * ******************************************************************************/acpi_statusacpi_ns_attach_object (	acpi_namespace_node     *node,	acpi_operand_object     *object,	acpi_object_type        type){	acpi_operand_object     *obj_desc;	acpi_operand_object     *last_obj_desc;	acpi_object_type        object_type = ACPI_TYPE_ANY;	ACPI_FUNCTION_TRACE ("Ns_attach_object");	/*	 * Parameter validation	 */	if (!node) {		/* Invalid handle */		ACPI_REPORT_ERROR (("Ns_attach_object: Null Named_obj handle\n"));		return_ACPI_STATUS (AE_BAD_PARAMETER);	}	if (!object && (ACPI_TYPE_ANY != type)) {		/* Null object */		ACPI_REPORT_ERROR (("Ns_attach_object: Null object, but type not ACPI_TYPE_ANY\n"));		return_ACPI_STATUS (AE_BAD_PARAMETER);	}	if (ACPI_GET_DESCRIPTOR_TYPE (node) != ACPI_DESC_TYPE_NAMED) {		/* Not a name handle */		ACPI_REPORT_ERROR (("Ns_attach_object: Invalid handle\n"));		return_ACPI_STATUS (AE_BAD_PARAMETER);	}	/* Check if this object is already attached */	if (node->object == object) {		ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Obj %p already installed in Name_obj %p\n",			object, node));		return_ACPI_STATUS (AE_OK);	}	/* If null object, we will just install it */	if (!object) {		obj_desc   = NULL;		object_type = ACPI_TYPE_ANY;	}	/*	 * If the source object is a namespace Node with an attached object,	 * we will use that (attached) object	 */	else if ((ACPI_GET_DESCRIPTOR_TYPE (object) == ACPI_DESC_TYPE_NAMED) &&			((acpi_namespace_node *) object)->object) {		/*		 * Value passed is a name handle and that name has a		 * non-null value.  Use that name's value and type.		 */		obj_desc   = ((acpi_namespace_node *) object)->object;		object_type = ((acpi_namespace_node *) object)->type;	}	/*	 * Otherwise, we will use the parameter object, but we must type	 * it first	 */	else {		obj_desc = (acpi_operand_object *) object;		/* If a valid type (non-ANY) was given, just use it */		if (ACPI_TYPE_ANY != type) {			object_type = type;		}		else {			object_type = INTERNAL_TYPE_DEF_ANY;		}	}	ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Installing %p into Node %p [%4.4s]\n",		obj_desc, node, (char *) &node->name));	/*	 * Must increment the new value's reference count	 * (if it is an internal object)	 */	acpi_ut_add_reference (obj_desc);	/* Detach an existing attached object if present */	if (node->object) {		acpi_ns_detach_object (node);	}	/*	 * Handle objects with multiple descriptors - walk	 * to the end of the descriptor list	 */	last_obj_desc = obj_desc;	while (last_obj_desc->common.next_object) {		last_obj_desc = last_obj_desc->common.next_object;	}	/* Install the object at the front of the object list */	last_obj_desc->common.next_object = node->object;	node->type     = (u8) object_type;	node->object   = obj_desc;	return_ACPI_STATUS (AE_OK);}/******************************************************************************* * * FUNCTION:    Acpi_ns_detach_object * * PARAMETERS:  Node           - An object whose Value will be deleted * * RETURN:      None. * * DESCRIPTION: Delete the Value associated with a namespace object.  If the *              Value is an allocated object, it is freed.  Otherwise, the *              field is simply cleared. * ******************************************************************************/voidacpi_ns_detach_object (	acpi_namespace_node     *node){	acpi_operand_object     *obj_desc;	ACPI_FUNCTION_TRACE ("Ns_detach_object");	obj_desc = node->object;	if (!obj_desc   ||		(obj_desc->common.type == INTERNAL_TYPE_DATA)) {		return_VOID;	}	/* Clear the entry in all cases */	node->object = NULL;	if (ACPI_GET_DESCRIPTOR_TYPE (obj_desc) == ACPI_DESC_TYPE_INTERNAL) {		node->object = obj_desc->common.next_object;		if (node->object &&		   (node->object->common.type != INTERNAL_TYPE_DATA)) {			node->object = node->object->common.next_object;		}	}	/* Reset the node type to untyped */	node->type = ACPI_TYPE_ANY;	ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Node %p [%4.4s] Object %p\n",		node, (char *) &node->name, obj_desc));	/* Remove one reference on the object (and all subobjects) */	acpi_ut_remove_reference (obj_desc);	return_VOID;}/******************************************************************************* * * FUNCTION:    Acpi_ns_get_attached_object * * PARAMETERS:  Node             - Parent Node to be examined * * RETURN:      Current value of the object field from the Node whose *              handle is passed * ******************************************************************************/acpi_operand_object *acpi_ns_get_attached_object (	acpi_namespace_node     *node){	ACPI_FUNCTION_TRACE_PTR ("Ns_get_attached_object", node);	if (!node) {		ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Null Node ptr\n"));		return_PTR (NULL);	}	if (!node->object ||			((ACPI_GET_DESCRIPTOR_TYPE (node->object) != ACPI_DESC_TYPE_INTERNAL)  &&			 (ACPI_GET_DESCRIPTOR_TYPE (node->object) != ACPI_DESC_TYPE_NAMED))    ||		(node->object->common.type == INTERNAL_TYPE_DATA)) {		return_PTR (NULL);	}	return_PTR (node->object);}/******************************************************************************* * * FUNCTION:    Acpi_ns_get_secondary_object * * PARAMETERS:  Node             - Parent Node to be examined * * RETURN:      Current value of the object field from the Node whose *              handle is passed * ******************************************************************************/acpi_operand_object *acpi_ns_get_secondary_object (	acpi_operand_object     *obj_desc){	ACPI_FUNCTION_TRACE_PTR ("Ns_get_secondary_object", obj_desc);	if ((!obj_desc)                                  ||		(obj_desc->common.type == INTERNAL_TYPE_DATA) ||		(!obj_desc->common.next_object)              ||		(obj_desc->common.next_object->common.type == INTERNAL_TYPE_DATA)) {		return_PTR (NULL);	}	return_PTR (obj_desc->common.next_object);}/******************************************************************************* * * FUNCTION:    Acpi_ns_attach_data * * PARAMETERS: * * RETURN:      Status * * DESCRIPTION: * ******************************************************************************/acpi_statusacpi_ns_attach_data (	acpi_namespace_node     *node,	ACPI_OBJECT_HANDLER     handler,	void                    *data){	acpi_operand_object     *prev_obj_desc;	acpi_operand_object     *obj_desc;	acpi_operand_object     *data_desc;	/* */	prev_obj_desc = NULL;	obj_desc = node->object;	while (obj_desc) {		if ((obj_desc->common.type == INTERNAL_TYPE_DATA) &&			(obj_desc->data.handler == handler)) {			return (AE_ALREADY_EXISTS);		}		prev_obj_desc = obj_desc;		obj_desc = obj_desc->common.next_object;	}	/* Create an internal object for the data */	data_desc = acpi_ut_create_internal_object (INTERNAL_TYPE_DATA);	if (!data_desc) {		return (AE_NO_MEMORY);	}	data_desc->data.handler = handler;	data_desc->data.pointer = data;	/* Install the data object */	if (prev_obj_desc) {		prev_obj_desc->common.next_object = data_desc;	}	else {		node->object = data_desc;	}	return (AE_OK);}/******************************************************************************* * * FUNCTION:    Acpi_ns_detach_data * * PARAMETERS: * * RETURN:      Status * * DESCRIPTION: * ******************************************************************************/acpi_statusacpi_ns_detach_data (	acpi_namespace_node     *node,	ACPI_OBJECT_HANDLER     handler){	acpi_operand_object     *obj_desc;	acpi_operand_object     *prev_obj_desc;	prev_obj_desc = NULL;	obj_desc = node->object;	while (obj_desc) {		if ((obj_desc->common.type == INTERNAL_TYPE_DATA) &&			(obj_desc->data.handler == handler)) {			if (prev_obj_desc) {				prev_obj_desc->common.next_object = obj_desc->common.next_object;			}			else {				node->object = obj_desc->common.next_object;			}			acpi_ut_remove_reference (obj_desc);			return (AE_OK);		}		prev_obj_desc = obj_desc;		obj_desc = obj_desc->common.next_object;	}	return (AE_NOT_FOUND);}/******************************************************************************* * * FUNCTION:    Acpi_ns_get_attached_data * * PARAMETERS: * * RETURN:      Status * * DESCRIPTION: * ******************************************************************************/acpi_statusacpi_ns_get_attached_data (	acpi_namespace_node     *node,	ACPI_OBJECT_HANDLER     handler,	void                    **data){	acpi_operand_object     *obj_desc;	obj_desc = node->object;	while (obj_desc) {		if ((obj_desc->common.type == INTERNAL_TYPE_DATA) &&			(obj_desc->data.handler == handler)) {			*data = obj_desc->data.pointer;			return (AE_OK);		}		obj_desc = obj_desc->common.next_object;	}	return (AE_NOT_FOUND);}

⌨️ 快捷键说明

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