nsobject.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:7k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*******************************************************************************
  2.  *
  3.  * Module Name: nsobject - Utilities for objects attached to namespace
  4.  *                         table entries
  5.  *              $Revision: 67 $
  6.  *
  7.  ******************************************************************************/
  8. /*
  9.  *  Copyright (C) 2000, 2001 R. Byron Moore
  10.  *
  11.  *  This program is free software; you can redistribute it and/or modify
  12.  *  it under the terms of the GNU General Public License as published by
  13.  *  the Free Software Foundation; either version 2 of the License, or
  14.  *  (at your option) any later version.
  15.  *
  16.  *  This program is distributed in the hope that it will be useful,
  17.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  *  GNU General Public License for more details.
  20.  *
  21.  *  You should have received a copy of the GNU General Public License
  22.  *  along with this program; if not, write to the Free Software
  23.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  24.  */
  25. #include "acpi.h"
  26. #include "amlcode.h"
  27. #include "acnamesp.h"
  28. #include "acinterp.h"
  29. #include "actables.h"
  30. #define _COMPONENT          ACPI_NAMESPACE
  31.  MODULE_NAME         ("nsobject")
  32. /*******************************************************************************
  33.  *
  34.  * FUNCTION:    Acpi_ns_attach_object
  35.  *
  36.  * PARAMETERS:  Node                - Parent Node
  37.  *              Object              - Object to be attached
  38.  *              Type                - Type of object, or ACPI_TYPE_ANY if not
  39.  *                                    known
  40.  *
  41.  * DESCRIPTION: Record the given object as the value associated with the
  42.  *              name whose acpi_handle is passed.  If Object is NULL
  43.  *              and Type is ACPI_TYPE_ANY, set the name as having no value.
  44.  *
  45.  * MUTEX:       Assumes namespace is locked
  46.  *
  47.  ******************************************************************************/
  48. acpi_status
  49. acpi_ns_attach_object (
  50. acpi_namespace_node     *node,
  51. acpi_operand_object     *object,
  52. acpi_object_type8       type)
  53. {
  54. acpi_operand_object     *obj_desc;
  55. acpi_operand_object     *previous_obj_desc;
  56. acpi_object_type8       obj_type = ACPI_TYPE_ANY;
  57. u8                      flags;
  58. FUNCTION_TRACE ("Ns_attach_object");
  59. /*
  60.  * Parameter validation
  61.  */
  62. if (!acpi_gbl_root_node) {
  63. /* Name space not initialized  */
  64. REPORT_ERROR (("Ns_attach_object: Namespace not initializedn"));
  65. return_ACPI_STATUS (AE_NO_NAMESPACE);
  66. }
  67. if (!node) {
  68. /* Invalid handle */
  69. REPORT_ERROR (("Ns_attach_object: Null Named_obj handlen"));
  70. return_ACPI_STATUS (AE_BAD_PARAMETER);
  71. }
  72. if (!object && (ACPI_TYPE_ANY != type)) {
  73. /* Null object */
  74. REPORT_ERROR (("Ns_attach_object: Null object, but type not ACPI_TYPE_ANYn"));
  75. return_ACPI_STATUS (AE_BAD_PARAMETER);
  76. }
  77. if (!VALID_DESCRIPTOR_TYPE (node, ACPI_DESC_TYPE_NAMED)) {
  78. /* Not a name handle */
  79. REPORT_ERROR (("Ns_attach_object: Invalid handlen"));
  80. return_ACPI_STATUS (AE_BAD_PARAMETER);
  81. }
  82. /* Check if this object is already attached */
  83. if (node->object == object) {
  84. ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Obj %p already installed in Name_obj %pn",
  85. object, node));
  86. return_ACPI_STATUS (AE_OK);
  87. }
  88. /* Get the current flags field of the Node */
  89. flags = node->flags;
  90. flags &= ~ANOBJ_AML_ATTACHMENT;
  91. /* If null object, we will just install it */
  92. if (!object) {
  93. obj_desc = NULL;
  94. obj_type = ACPI_TYPE_ANY;
  95. }
  96. /*
  97.  * If the source object is a namespace Node with an attached object,
  98.  * we will use that (attached) object
  99.  */
  100. else if (VALID_DESCRIPTOR_TYPE (object, ACPI_DESC_TYPE_NAMED) &&
  101. ((acpi_namespace_node *) object)->object) {
  102. /*
  103.  * Value passed is a name handle and that name has a
  104.  * non-null value.  Use that name's value and type.
  105.  */
  106. obj_desc = ((acpi_namespace_node *) object)->object;
  107. obj_type = ((acpi_namespace_node *) object)->type;
  108. /*
  109.  * Copy appropriate flags
  110.  */
  111. if (((acpi_namespace_node *) object)->flags & ANOBJ_AML_ATTACHMENT) {
  112. flags |= ANOBJ_AML_ATTACHMENT;
  113. }
  114. }
  115. /*
  116.  * Otherwise, we will use the parameter object, but we must type
  117.  * it first
  118.  */
  119. else {
  120. obj_desc = (acpi_operand_object *) object;
  121. /* If a valid type (non-ANY) was given, just use it */
  122. if (ACPI_TYPE_ANY != type) {
  123. obj_type = type;
  124. }
  125. else {
  126. /*
  127.  * Cannot figure out the type -- set to Def_any which
  128.  * will print as an error in the name table dump
  129.  */
  130. if (acpi_dbg_level > 0) {
  131. DUMP_PATHNAME (node,
  132. "Ns_attach_object confused: setting bogus type for ",
  133. ACPI_LV_INFO, _COMPONENT);
  134. if (VALID_DESCRIPTOR_TYPE (object, ACPI_DESC_TYPE_NAMED)) {
  135. DUMP_PATHNAME (object, "name ", ACPI_LV_INFO, _COMPONENT);
  136. }
  137. else {
  138. DUMP_PATHNAME (object, "object ", ACPI_LV_INFO, _COMPONENT);
  139. DUMP_STACK_ENTRY (object);
  140. }
  141. }
  142. obj_type = INTERNAL_TYPE_DEF_ANY;
  143. }
  144. }
  145. ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Installing %p into Node %p [%4.4s]n",
  146. obj_desc, node, (char*)&node->name));
  147. /*
  148.  * Must increment the new value's reference count
  149.  * (if it is an internal object)
  150.  */
  151. acpi_ut_add_reference (obj_desc);
  152. /* Save the existing object (if any) for deletion later */
  153. previous_obj_desc = node->object;
  154. /* Install the object and set the type, flags */
  155. node->object   = obj_desc;
  156. node->type     = (u8) obj_type;
  157. node->flags    |= flags;
  158. /*
  159.  * Delete an existing attached object.
  160.  */
  161. if (previous_obj_desc) {
  162. /* One for the attach to the Node */
  163. acpi_ut_remove_reference (previous_obj_desc);
  164. /* Now delete */
  165. acpi_ut_remove_reference (previous_obj_desc);
  166. }
  167. return_ACPI_STATUS (AE_OK);
  168. }
  169. /*******************************************************************************
  170.  *
  171.  * FUNCTION:    Acpi_ns_detach_object
  172.  *
  173.  * PARAMETERS:  Node           - An object whose Value will be deleted
  174.  *
  175.  * RETURN:      None.
  176.  *
  177.  * DESCRIPTION: Delete the Value associated with a namespace object.  If the
  178.  *              Value is an allocated object, it is freed.  Otherwise, the
  179.  *              field is simply cleared.
  180.  *
  181.  ******************************************************************************/
  182. void
  183. acpi_ns_detach_object (
  184. acpi_namespace_node     *node)
  185. {
  186. acpi_operand_object     *obj_desc;
  187. FUNCTION_TRACE ("Ns_detach_object");
  188. obj_desc = node->object;
  189. if (!obj_desc) {
  190. return_VOID;
  191. }
  192. /* Clear the entry in all cases */
  193. node->object = NULL;
  194. ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Object=%p Value=%p Name %4.4sn",
  195. node, obj_desc, (char*)&node->name));
  196. /* Remove one reference on the object (and all subobjects) */
  197. acpi_ut_remove_reference (obj_desc);
  198. return_VOID;
  199. }
  200. /*******************************************************************************
  201.  *
  202.  * FUNCTION:    Acpi_ns_get_attached_object
  203.  *
  204.  * PARAMETERS:  Node             - Parent Node to be examined
  205.  *
  206.  * RETURN:      Current value of the object field from the Node whose
  207.  *              handle is passed
  208.  *
  209.  ******************************************************************************/
  210. void *
  211. acpi_ns_get_attached_object (
  212. acpi_namespace_node     *node)
  213. {
  214. FUNCTION_TRACE_PTR ("Ns_get_attached_object", node);
  215. if (!node) {
  216. /* handle invalid */
  217. ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Null Node ptrn"));
  218. return_PTR (NULL);
  219. }
  220. return_PTR (node->object);
  221. }