utobject.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:14k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /******************************************************************************
  2.  *
  3.  * Module Name: utobject - ACPI object create/delete/size/cache routines
  4.  *              $Revision: 57 $
  5.  *
  6.  *****************************************************************************/
  7. /*
  8.  *  Copyright (C) 2000, 2001 R. Byron Moore
  9.  *
  10.  *  This program is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation; either version 2 of the License, or
  13.  *  (at your option) any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program; if not, write to the Free Software
  22.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  23.  */
  24. #include "acpi.h"
  25. #include "acinterp.h"
  26. #include "acnamesp.h"
  27. #include "actables.h"
  28. #include "amlcode.h"
  29. #define _COMPONENT          ACPI_UTILITIES
  30.  MODULE_NAME         ("utobject")
  31. /*******************************************************************************
  32.  *
  33.  * FUNCTION:    Acpi_ut_create_internal_object_dbg
  34.  *
  35.  * PARAMETERS:  Address             - Address of the memory to deallocate
  36.  *              Component           - Component type of caller
  37.  *              Module              - Source file name of caller
  38.  *              Line                - Line number of caller
  39.  *              Type                - ACPI Type of the new object
  40.  *
  41.  * RETURN:      Object              - The new object.  Null on failure
  42.  *
  43.  * DESCRIPTION: Create and initialize a new internal object.
  44.  *
  45.  * NOTE:        We always allocate the worst-case object descriptor because
  46.  *              these objects are cached, and we want them to be
  47.  *              one-size-satisifies-any-request.  This in itself may not be
  48.  *              the most memory efficient, but the efficiency of the object
  49.  *              cache should more than make up for this!
  50.  *
  51.  ******************************************************************************/
  52. acpi_operand_object  *
  53. acpi_ut_create_internal_object_dbg (
  54. NATIVE_CHAR             *module_name,
  55. u32                     line_number,
  56. u32                     component_id,
  57. acpi_object_type8       type)
  58. {
  59. acpi_operand_object     *object;
  60. FUNCTION_TRACE_STR ("Ut_create_internal_object_dbg", acpi_ut_get_type_name (type));
  61. /* Allocate the raw object descriptor */
  62. object = acpi_ut_allocate_object_desc_dbg (module_name, line_number, component_id);
  63. if (!object) {
  64. /* Allocation failure */
  65. return_PTR (NULL);
  66. }
  67. /* Save the object type in the object descriptor */
  68. object->common.type = type;
  69. /* Init the reference count */
  70. object->common.reference_count = 1;
  71. /* Any per-type initialization should go here */
  72. return_PTR (object);
  73. }
  74. /*******************************************************************************
  75.  *
  76.  * FUNCTION:    Acpi_ut_valid_internal_object
  77.  *
  78.  * PARAMETERS:  Operand             - Object to be validated
  79.  *
  80.  * RETURN:      Validate a pointer to be an acpi_operand_object
  81.  *
  82.  ******************************************************************************/
  83. u8
  84. acpi_ut_valid_internal_object (
  85. void                    *object)
  86. {
  87. PROC_NAME ("Ut_valid_internal_object");
  88. /* Check for a null pointer */
  89. if (!object) {
  90. ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
  91. "**** Null Object Ptrn"));
  92. return (FALSE);
  93. }
  94. /* Check the descriptor type field */
  95. if (!VALID_DESCRIPTOR_TYPE (object, ACPI_DESC_TYPE_INTERNAL)) {
  96. /* Not an ACPI internal object, do some further checking */
  97. if (VALID_DESCRIPTOR_TYPE (object, ACPI_DESC_TYPE_NAMED)) {
  98. ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
  99. "**** Obj %p is a named obj, not ACPI objn", object));
  100. }
  101. else if (VALID_DESCRIPTOR_TYPE (object, ACPI_DESC_TYPE_PARSER)) {
  102. ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
  103. "**** Obj %p is a parser obj, not ACPI objn", object));
  104. }
  105. else {
  106. ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
  107. "**** Obj %p is of unknown typen", object));
  108. }
  109. return (FALSE);
  110. }
  111. /* The object appears to be a valid acpi_operand_object  */
  112. return (TRUE);
  113. }
  114. /*******************************************************************************
  115.  *
  116.  * FUNCTION:    Acpi_ut_allocate_object_desc_dbg
  117.  *
  118.  * PARAMETERS:  Module_name         - Caller's module name (for error output)
  119.  *              Line_number         - Caller's line number (for error output)
  120.  *              Component_id        - Caller's component ID (for error output)
  121.  *              Message             - Error message to use on failure
  122.  *
  123.  * RETURN:      Pointer to newly allocated object descriptor.  Null on error
  124.  *
  125.  * DESCRIPTION: Allocate a new object descriptor.  Gracefully handle
  126.  *              error conditions.
  127.  *
  128.  ******************************************************************************/
  129. void *
  130. acpi_ut_allocate_object_desc_dbg (
  131. NATIVE_CHAR             *module_name,
  132. u32                     line_number,
  133. u32                     component_id)
  134. {
  135. acpi_operand_object     *object;
  136. FUNCTION_TRACE ("Ut_allocate_object_desc_dbg");
  137. object = acpi_ut_acquire_from_cache (ACPI_MEM_LIST_OPERAND);
  138. if (!object) {
  139. _REPORT_ERROR (module_name, line_number, component_id,
  140.   ("Could not allocate an object descriptorn"));
  141. return_PTR (NULL);
  142. }
  143. /* Mark the descriptor type */
  144. object->common.data_type = ACPI_DESC_TYPE_INTERNAL;
  145. ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "%p Size %Xn",
  146. object, sizeof (acpi_operand_object)));
  147. return_PTR (object);
  148. }
  149. /*******************************************************************************
  150.  *
  151.  * FUNCTION:    Acpi_ut_delete_object_desc
  152.  *
  153.  * PARAMETERS:  Object          - Acpi internal object to be deleted
  154.  *
  155.  * RETURN:      None.
  156.  *
  157.  * DESCRIPTION: Free an ACPI object descriptor or add it to the object cache
  158.  *
  159.  ******************************************************************************/
  160. void
  161. acpi_ut_delete_object_desc (
  162. acpi_operand_object     *object)
  163. {
  164. FUNCTION_TRACE_PTR ("Ut_delete_object_desc", object);
  165. /* Object must be an acpi_operand_object  */
  166. if (object->common.data_type != ACPI_DESC_TYPE_INTERNAL) {
  167. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
  168. "Obj %p is not an ACPI objectn", object));
  169. return_VOID;
  170. }
  171. acpi_ut_release_to_cache (ACPI_MEM_LIST_OPERAND, object);
  172. return_VOID;
  173. }
  174. /*******************************************************************************
  175.  *
  176.  * FUNCTION:    Acpi_ut_delete_object_cache
  177.  *
  178.  * PARAMETERS:  None
  179.  *
  180.  * RETURN:      Status
  181.  *
  182.  * DESCRIPTION: Purge the global state object cache.  Used during subsystem
  183.  *              termination.
  184.  *
  185.  ******************************************************************************/
  186. void
  187. acpi_ut_delete_object_cache (
  188. void)
  189. {
  190. FUNCTION_TRACE ("Ut_delete_object_cache");
  191. acpi_ut_delete_generic_cache (ACPI_MEM_LIST_OPERAND);
  192. return_VOID;
  193. }
  194. /*******************************************************************************
  195.  *
  196.  * FUNCTION:    Acpi_ut_get_simple_object_size
  197.  *
  198.  * PARAMETERS:  *Internal_object    - Pointer to the object we are examining
  199.  *              *Ret_length         - Where the length is returned
  200.  *
  201.  * RETURN:      Status
  202.  *
  203.  * DESCRIPTION: This function is called to determine the space required to
  204.  *              contain a simple object for return to an API user.
  205.  *
  206.  *              The length includes the object structure plus any additional
  207.  *              needed space.
  208.  *
  209.  ******************************************************************************/
  210. acpi_status
  211. acpi_ut_get_simple_object_size (
  212. acpi_operand_object     *internal_object,
  213. u32                     *obj_length)
  214. {
  215. u32                     length;
  216. acpi_status             status = AE_OK;
  217. FUNCTION_TRACE_PTR ("Ut_get_simple_object_size", internal_object);
  218. /* Handle a null object (Could be a uninitialized package element -- which is legal) */
  219. if (!internal_object) {
  220. *obj_length = 0;
  221. return_ACPI_STATUS (AE_OK);
  222. }
  223. /* Start with the length of the Acpi object */
  224. length = sizeof (acpi_object);
  225. if (VALID_DESCRIPTOR_TYPE (internal_object, ACPI_DESC_TYPE_NAMED)) {
  226. /* Object is a named object (reference), just return the length */
  227. *obj_length = (u32) ROUND_UP_TO_NATIVE_WORD (length);
  228. return_ACPI_STATUS (status);
  229. }
  230. /*
  231.  * The final length depends on the object type
  232.  * Strings and Buffers are packed right up against the parent object and
  233.  * must be accessed bytewise or there may be alignment problems on
  234.  * certain processors
  235.  */
  236. switch (internal_object->common.type) {
  237. case ACPI_TYPE_STRING:
  238. length += internal_object->string.length + 1;
  239. break;
  240. case ACPI_TYPE_BUFFER:
  241. length += internal_object->buffer.length;
  242. break;
  243. case ACPI_TYPE_INTEGER:
  244. case ACPI_TYPE_PROCESSOR:
  245. case ACPI_TYPE_POWER:
  246. /*
  247.  * No extra data for these types
  248.  */
  249. break;
  250. case INTERNAL_TYPE_REFERENCE:
  251. /*
  252.  * The only type that should be here is internal opcode NAMEPATH_OP -- since
  253.  * this means an object reference
  254.  */
  255. if (internal_object->reference.opcode != AML_INT_NAMEPATH_OP) {
  256. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
  257. "Unsupported Reference opcode=%X in object %pn",
  258. internal_object->reference.opcode, internal_object));
  259. status = AE_TYPE;
  260. }
  261. else {
  262. /*
  263.  * Get the actual length of the full pathname to this object.
  264.  * The reference will be converted to the pathname to the object
  265.  */
  266. length += ROUND_UP_TO_NATIVE_WORD (acpi_ns_get_pathname_length (internal_object->reference.node));
  267. }
  268. break;
  269. default:
  270. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unsupported type=%X in object %pn",
  271. internal_object->common.type, internal_object));
  272. status = AE_TYPE;
  273. break;
  274. }
  275. /*
  276.  * Account for the space required by the object rounded up to the next
  277.  * multiple of the machine word size.  This keeps each object aligned
  278.  * on a machine word boundary. (preventing alignment faults on some
  279.  * machines.)
  280.  */
  281. *obj_length = (u32) ROUND_UP_TO_NATIVE_WORD (length);
  282. return_ACPI_STATUS (status);
  283. }
  284. /*******************************************************************************
  285.  *
  286.  * FUNCTION:    Acpi_ut_get_element_length
  287.  *
  288.  * PARAMETERS:  ACPI_PKG_CALLBACK
  289.  *
  290.  * RETURN:      Status          - the status of the call
  291.  *
  292.  * DESCRIPTION: Get the length of one package element.
  293.  *
  294.  ******************************************************************************/
  295. acpi_status
  296. acpi_ut_get_element_length (
  297. u8                      object_type,
  298. acpi_operand_object     *source_object,
  299. acpi_generic_state      *state,
  300. void                    *context)
  301. {
  302. acpi_status             status = AE_OK;
  303. acpi_pkg_info           *info = (acpi_pkg_info *) context;
  304. u32                     object_space;
  305. switch (object_type) {
  306. case 0:
  307. /*
  308.  * Simple object - just get the size (Null object/entry is handled
  309.  * here also) and sum it into the running package length
  310.  */
  311. status = acpi_ut_get_simple_object_size (source_object, &object_space);
  312. if (ACPI_FAILURE (status)) {
  313. return (status);
  314. }
  315. info->length += object_space;
  316. break;
  317. case 1:
  318. /* Package - nothing much to do here, let the walk handle it */
  319. info->num_packages++;
  320. state->pkg.this_target_obj = NULL;
  321. break;
  322. default:
  323. return (AE_BAD_PARAMETER);
  324. }
  325. return (status);
  326. }
  327. /*******************************************************************************
  328.  *
  329.  * FUNCTION:    Acpi_ut_get_package_object_size
  330.  *
  331.  * PARAMETERS:  *Internal_object    - Pointer to the object we are examining
  332.  *              *Ret_length         - Where the length is returned
  333.  *
  334.  * RETURN:      Status
  335.  *
  336.  * DESCRIPTION: This function is called to determine the space required to
  337.  *              contain a package object for return to an API user.
  338.  *
  339.  *              This is moderately complex since a package contains other
  340.  *              objects including packages.
  341.  *
  342.  ******************************************************************************/
  343. acpi_status
  344. acpi_ut_get_package_object_size (
  345. acpi_operand_object     *internal_object,
  346. u32                     *obj_length)
  347. {
  348. acpi_status             status;
  349. acpi_pkg_info           info;
  350. FUNCTION_TRACE_PTR ("Ut_get_package_object_size", internal_object);
  351. info.length      = 0;
  352. info.object_space = 0;
  353. info.num_packages = 1;
  354. status = acpi_ut_walk_package_tree (internal_object, NULL,
  355.  acpi_ut_get_element_length, &info);
  356. /*
  357.  * We have handled all of the objects in all levels of the package.
  358.  * just add the length of the package objects themselves.
  359.  * Round up to the next machine word.
  360.  */
  361. info.length += ROUND_UP_TO_NATIVE_WORD (sizeof (acpi_object)) *
  362.   info.num_packages;
  363. /* Return the total package length */
  364. *obj_length = info.length;
  365. return_ACPI_STATUS (status);
  366. }
  367. /*******************************************************************************
  368.  *
  369.  * FUNCTION:    Acpi_ut_get_object_size
  370.  *
  371.  * PARAMETERS:  *Internal_object    - Pointer to the object we are examining
  372.  *              *Ret_length         - Where the length will be returned
  373.  *
  374.  * RETURN:      Status
  375.  *
  376.  * DESCRIPTION: This function is called to determine the space required to
  377.  *              contain an object for return to an API user.
  378.  *
  379.  ******************************************************************************/
  380. acpi_status
  381. acpi_ut_get_object_size(
  382. acpi_operand_object     *internal_object,
  383. u32                     *obj_length)
  384. {
  385. acpi_status             status;
  386. FUNCTION_ENTRY ();
  387. if ((VALID_DESCRIPTOR_TYPE (internal_object, ACPI_DESC_TYPE_INTERNAL)) &&
  388. (IS_THIS_OBJECT_TYPE (internal_object, ACPI_TYPE_PACKAGE))) {
  389. status = acpi_ut_get_package_object_size (internal_object, obj_length);
  390. }
  391. else {
  392. status = acpi_ut_get_simple_object_size (internal_object, obj_length);
  393. }
  394. return (status);
  395. }