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

嵌入式Linux

开发平台:

Unix_Linux

  1. /******************************************************************************
  2.  *
  3.  * Module Name: psscope - Parser scope stack management routines
  4.  *              $Revision: 30 $
  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. #define _COMPONENT          ACPI_PARSER
  27.  MODULE_NAME         ("psscope")
  28. /*******************************************************************************
  29.  *
  30.  * FUNCTION:    Acpi_ps_get_parent_scope
  31.  *
  32.  * PARAMETERS:  Parser_state        - Current parser state object
  33.  *
  34.  * RETURN:      Pointer to an Op object
  35.  *
  36.  * DESCRIPTION: Get parent of current op being parsed
  37.  *
  38.  ******************************************************************************/
  39. acpi_parse_object *
  40. acpi_ps_get_parent_scope (
  41. acpi_parse_state        *parser_state)
  42. {
  43. return (parser_state->scope->parse_scope.op);
  44. }
  45. /*******************************************************************************
  46.  *
  47.  * FUNCTION:    Acpi_ps_has_completed_scope
  48.  *
  49.  * PARAMETERS:  Parser_state        - Current parser state object
  50.  *
  51.  * RETURN:      Boolean, TRUE = scope completed.
  52.  *
  53.  * DESCRIPTION: Is parsing of current argument complete?  Determined by
  54.  *              1) AML pointer is at or beyond the end of the scope
  55.  *              2) The scope argument count has reached zero.
  56.  *
  57.  ******************************************************************************/
  58. u8
  59. acpi_ps_has_completed_scope (
  60. acpi_parse_state        *parser_state)
  61. {
  62. return ((u8) ((parser_state->aml >= parser_state->scope->parse_scope.arg_end ||
  63.    !parser_state->scope->parse_scope.arg_count)));
  64. }
  65. /*******************************************************************************
  66.  *
  67.  * FUNCTION:    Acpi_ps_init_scope
  68.  *
  69.  * PARAMETERS:  Parser_state        - Current parser state object
  70.  *              Root                - the Root Node of this new scope
  71.  *
  72.  * RETURN:      Status
  73.  *
  74.  * DESCRIPTION: Allocate and init a new scope object
  75.  *
  76.  ******************************************************************************/
  77. acpi_status
  78. acpi_ps_init_scope (
  79. acpi_parse_state        *parser_state,
  80. acpi_parse_object       *root_op)
  81. {
  82. acpi_generic_state      *scope;
  83. FUNCTION_TRACE_PTR ("Ps_init_scope", root_op);
  84. scope = acpi_ut_create_generic_state ();
  85. if (!scope) {
  86. return_ACPI_STATUS (AE_NO_MEMORY);
  87. }
  88. scope->common.data_type     = ACPI_DESC_TYPE_STATE_RPSCOPE;
  89. scope->parse_scope.op       = root_op;
  90. scope->parse_scope.arg_count = ACPI_VAR_ARGS;
  91. scope->parse_scope.arg_end  = parser_state->aml_end;
  92. scope->parse_scope.pkg_end  = parser_state->aml_end;
  93. parser_state->scope         = scope;
  94. parser_state->start_op      = root_op;
  95. return_ACPI_STATUS (AE_OK);
  96. }
  97. /*******************************************************************************
  98.  *
  99.  * FUNCTION:    Acpi_ps_push_scope
  100.  *
  101.  * PARAMETERS:  Parser_state        - Current parser state object
  102.  *              Op                  - Current op to be pushed
  103.  *              Remaining_args      - List of args remaining
  104.  *              Arg_count           - Fixed or variable number of args
  105.  *
  106.  * RETURN:      Status
  107.  *
  108.  * DESCRIPTION: Push current op to begin parsing its argument
  109.  *
  110.  ******************************************************************************/
  111. acpi_status
  112. acpi_ps_push_scope (
  113. acpi_parse_state        *parser_state,
  114. acpi_parse_object       *op,
  115. u32                     remaining_args,
  116. u32                     arg_count)
  117. {
  118. acpi_generic_state      *scope;
  119. FUNCTION_TRACE_PTR ("Ps_push_scope", op);
  120. scope = acpi_ut_create_generic_state ();
  121. if (!scope) {
  122. return (AE_NO_MEMORY);
  123. }
  124. scope->common.data_type        = ACPI_DESC_TYPE_STATE_PSCOPE;
  125. scope->parse_scope.op          = op;
  126. scope->parse_scope.arg_list    = remaining_args;
  127. scope->parse_scope.arg_count   = arg_count;
  128. scope->parse_scope.pkg_end     = parser_state->pkg_end;
  129. /* Push onto scope stack */
  130. acpi_ut_push_generic_state (&parser_state->scope, scope);
  131. if (arg_count == ACPI_VAR_ARGS) {
  132. /* multiple arguments */
  133. scope->parse_scope.arg_end = parser_state->pkg_end;
  134. }
  135. else {
  136. /* single argument */
  137. scope->parse_scope.arg_end = ACPI_MAX_AML;
  138. }
  139. return_ACPI_STATUS (AE_OK);
  140. }
  141. /*******************************************************************************
  142.  *
  143.  * FUNCTION:    Acpi_ps_pop_scope
  144.  *
  145.  * PARAMETERS:  Parser_state        - Current parser state object
  146.  *              Op                  - Where the popped op is returned
  147.  *              Arg_list            - Where the popped "next argument" is
  148.  *                                    returned
  149.  *              Arg_count           - Count of objects in Arg_list
  150.  *
  151.  * RETURN:      Status
  152.  *
  153.  * DESCRIPTION: Return to parsing a previous op
  154.  *
  155.  ******************************************************************************/
  156. void
  157. acpi_ps_pop_scope (
  158. acpi_parse_state        *parser_state,
  159. acpi_parse_object       **op,
  160. u32                     *arg_list,
  161. u32                     *arg_count)
  162. {
  163. acpi_generic_state      *scope = parser_state->scope;
  164. FUNCTION_TRACE ("Ps_pop_scope");
  165. /*
  166.  * Only pop the scope if there is in fact a next scope
  167.  */
  168. if (scope->common.next) {
  169. scope = acpi_ut_pop_generic_state (&parser_state->scope);
  170. /* return to parsing previous op */
  171. *op                     = scope->parse_scope.op;
  172. *arg_list               = scope->parse_scope.arg_list;
  173. *arg_count              = scope->parse_scope.arg_count;
  174. parser_state->pkg_end   = scope->parse_scope.pkg_end;
  175. /* All done with this scope state structure */
  176. acpi_ut_delete_generic_state (scope);
  177. }
  178. else {
  179. /* empty parse stack, prepare to fetch next opcode */
  180. *op                     = NULL;
  181. *arg_list               = 0;
  182. *arg_count              = 0;
  183. }
  184. ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Popped Op %p Args %Xn", *op, *arg_count));
  185. return_VOID;
  186. }
  187. /*******************************************************************************
  188.  *
  189.  * FUNCTION:    Acpi_ps_cleanup_scope
  190.  *
  191.  * PARAMETERS:  Parser_state        - Current parser state object
  192.  *
  193.  * RETURN:      Status
  194.  *
  195.  * DESCRIPTION: Destroy available list, remaining stack levels, and return
  196.  *              root scope
  197.  *
  198.  ******************************************************************************/
  199. void
  200. acpi_ps_cleanup_scope (
  201. acpi_parse_state        *parser_state)
  202. {
  203. acpi_generic_state      *scope;
  204. FUNCTION_TRACE_PTR ("Ps_cleanup_scope", parser_state);
  205. if (!parser_state) {
  206. return;
  207. }
  208. /* Delete anything on the scope stack */
  209. while (parser_state->scope) {
  210. scope = acpi_ut_pop_generic_state (&parser_state->scope);
  211. acpi_ut_delete_generic_state (scope);
  212. }
  213. return_VOID;
  214. }