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

嵌入式Linux

开发平台:

Unix_Linux

  1. /******************************************************************************
  2.  *
  3.  * Module Name: psutils - Parser miscellaneous utilities (Parser only)
  4.  *              $Revision: 44 $
  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 "acparser.h"
  26. #include "amlcode.h"
  27. #define _COMPONENT          ACPI_PARSER
  28.  MODULE_NAME         ("psutils")
  29. #define PARSEOP_GENERIC     0x01
  30. #define PARSEOP_NAMED       0x02
  31. #define PARSEOP_DEFERRED    0x04
  32. #define PARSEOP_BYTELIST    0x08
  33. #define PARSEOP_IN_CACHE    0x80
  34. /*******************************************************************************
  35.  *
  36.  * FUNCTION:    Acpi_ps_init_op
  37.  *
  38.  * PARAMETERS:  Op              - A newly allocated Op object
  39.  *              Opcode          - Opcode to store in the Op
  40.  *
  41.  * RETURN:      Status
  42.  *
  43.  * DESCRIPTION: Allocate an acpi_op, choose op type (and thus size) based on
  44.  *              opcode
  45.  *
  46.  ******************************************************************************/
  47. void
  48. acpi_ps_init_op (
  49. acpi_parse_object       *op,
  50. u16                     opcode)
  51. {
  52. const acpi_opcode_info  *aml_op;
  53. FUNCTION_ENTRY ();
  54. op->data_type = ACPI_DESC_TYPE_PARSER;
  55. op->opcode = opcode;
  56. aml_op = acpi_ps_get_opcode_info (opcode);
  57. DEBUG_ONLY_MEMBERS (STRNCPY (op->op_name, aml_op->name,
  58.    sizeof (op->op_name)));
  59. }
  60. /*******************************************************************************
  61.  *
  62.  * FUNCTION:    Acpi_ps_alloc_op
  63.  *
  64.  * PARAMETERS:  Opcode          - Opcode that will be stored in the new Op
  65.  *
  66.  * RETURN:      Pointer to the new Op.
  67.  *
  68.  * DESCRIPTION: Allocate an acpi_op, choose op type (and thus size) based on
  69.  *              opcode.  A cache of opcodes is available for the pure
  70.  *              GENERIC_OP, since this is by far the most commonly used.
  71.  *
  72.  ******************************************************************************/
  73. acpi_parse_object*
  74. acpi_ps_alloc_op (
  75. u16                     opcode)
  76. {
  77. acpi_parse_object       *op = NULL;
  78. u32                     size;
  79. u8                      flags;
  80. const acpi_opcode_info  *op_info;
  81. FUNCTION_ENTRY ();
  82. op_info = acpi_ps_get_opcode_info (opcode);
  83. /* Allocate the minimum required size object */
  84. if (op_info->flags & AML_DEFER) {
  85. size = sizeof (acpi_parse2_object);
  86. flags = PARSEOP_DEFERRED;
  87. }
  88. else if (op_info->flags & AML_NAMED) {
  89. size = sizeof (acpi_parse2_object);
  90. flags = PARSEOP_NAMED;
  91. }
  92. else if (opcode == AML_INT_BYTELIST_OP) {
  93. size = sizeof (acpi_parse2_object);
  94. flags = PARSEOP_BYTELIST;
  95. }
  96. else {
  97. size = sizeof (acpi_parse_object);
  98. flags = PARSEOP_GENERIC;
  99. }
  100. if (size == sizeof (acpi_parse_object)) {
  101. /*
  102.  * The generic op is by far the most common (16 to 1)
  103.  */
  104. op = acpi_ut_acquire_from_cache (ACPI_MEM_LIST_PSNODE);
  105. }
  106. else {
  107. op = acpi_ut_acquire_from_cache (ACPI_MEM_LIST_PSNODE_EXT);
  108. }
  109. /* Initialize the Op */
  110. if (op) {
  111. acpi_ps_init_op (op, opcode);
  112. op->flags = flags;
  113. }
  114. return (op);
  115. }
  116. /*******************************************************************************
  117.  *
  118.  * FUNCTION:    Acpi_ps_free_op
  119.  *
  120.  * PARAMETERS:  Op              - Op to be freed
  121.  *
  122.  * RETURN:      None.
  123.  *
  124.  * DESCRIPTION: Free an Op object.  Either put it on the GENERIC_OP cache list
  125.  *              or actually free it.
  126.  *
  127.  ******************************************************************************/
  128. void
  129. acpi_ps_free_op (
  130. acpi_parse_object       *op)
  131. {
  132. PROC_NAME ("Ps_free_op");
  133. if (op->opcode == AML_INT_RETURN_VALUE_OP) {
  134. ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Free retval op: %pn", op));
  135. }
  136. if (op->flags == PARSEOP_GENERIC) {
  137. acpi_ut_release_to_cache (ACPI_MEM_LIST_PSNODE, op);
  138. }
  139. else {
  140. acpi_ut_release_to_cache (ACPI_MEM_LIST_PSNODE_EXT, op);
  141. }
  142. }
  143. /*******************************************************************************
  144.  *
  145.  * FUNCTION:    Acpi_ps_delete_parse_cache
  146.  *
  147.  * PARAMETERS:  None
  148.  *
  149.  * RETURN:      None
  150.  *
  151.  * DESCRIPTION: Free all objects that are on the parse cache list.
  152.  *
  153.  ******************************************************************************/
  154. void
  155. acpi_ps_delete_parse_cache (
  156. void)
  157. {
  158. FUNCTION_TRACE ("Ps_delete_parse_cache");
  159. acpi_ut_delete_generic_cache (ACPI_MEM_LIST_PSNODE);
  160. acpi_ut_delete_generic_cache (ACPI_MEM_LIST_PSNODE_EXT);
  161. return_VOID;
  162. }
  163. /*******************************************************************************
  164.  *
  165.  * FUNCTION:    Utility functions
  166.  *
  167.  * DESCRIPTION: Low level character and object functions
  168.  *
  169.  ******************************************************************************/
  170. /*
  171.  * Is "c" a namestring lead character?
  172.  */
  173. u8
  174. acpi_ps_is_leading_char (
  175. u32                     c)
  176. {
  177. return ((u8) (c == '_' || (c >= 'A' && c <= 'Z')));
  178. }
  179. /*
  180.  * Is "c" a namestring prefix character?
  181.  */
  182. u8
  183. acpi_ps_is_prefix_char (
  184. u32                     c)
  185. {
  186. return ((u8) (c == '\' || c == '^'));
  187. }
  188. /*
  189.  * Get op's name (4-byte name segment) or 0 if unnamed
  190.  */
  191. u32
  192. acpi_ps_get_name (
  193. acpi_parse_object       *op)
  194. {
  195. /* The "generic" object has no name associated with it */
  196. if (op->flags & PARSEOP_GENERIC) {
  197. return (0);
  198. }
  199. /* Only the "Extended" parse objects have a name */
  200. return (((acpi_parse2_object *) op)->name);
  201. }
  202. /*
  203.  * Set op's name
  204.  */
  205. void
  206. acpi_ps_set_name (
  207. acpi_parse_object       *op,
  208. u32                     name)
  209. {
  210. /* The "generic" object has no name associated with it */
  211. if (op->flags & PARSEOP_GENERIC) {
  212. return;
  213. }
  214. ((acpi_parse2_object *) op)->name = name;
  215. }