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

嵌入式Linux

开发平台:

Unix_Linux

  1. /******************************************************************************
  2.  *
  3.  * Module Name: psxface - Parser external interfaces
  4.  *              $Revision: 52 $
  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 "acdispat.h"
  27. #include "acinterp.h"
  28. #include "amlcode.h"
  29. #include "acnamesp.h"
  30. #define _COMPONENT          ACPI_PARSER
  31.  MODULE_NAME         ("psxface")
  32. /*******************************************************************************
  33.  *
  34.  * FUNCTION:    Acpi_psx_execute
  35.  *
  36.  * PARAMETERS:  Method_node         - A method object containing both the AML
  37.  *                                    address and length.
  38.  *              **Params            - List of parameters to pass to method,
  39.  *                                    terminated by NULL. Params itself may be
  40.  *                                    NULL if no parameters are being passed.
  41.  *              **Return_obj_desc   - Return object from execution of the
  42.  *                                    method.
  43.  *
  44.  * RETURN:      Status
  45.  *
  46.  * DESCRIPTION: Execute a control method
  47.  *
  48.  ******************************************************************************/
  49. acpi_status
  50. acpi_psx_execute (
  51. acpi_namespace_node     *method_node,
  52. acpi_operand_object     **params,
  53. acpi_operand_object     **return_obj_desc)
  54. {
  55. acpi_status             status;
  56. acpi_operand_object     *obj_desc;
  57. u32                     i;
  58. acpi_parse_object       *op;
  59. acpi_walk_state         *walk_state;
  60. FUNCTION_TRACE ("Psx_execute");
  61. /* Validate the Node and get the attached object */
  62. if (!method_node) {
  63. return_ACPI_STATUS (AE_NULL_ENTRY);
  64. }
  65. obj_desc = acpi_ns_get_attached_object (method_node);
  66. if (!obj_desc) {
  67. return_ACPI_STATUS (AE_NULL_OBJECT);
  68. }
  69. /* Init for new method, wait on concurrency semaphore */
  70. status = acpi_ds_begin_method_execution (method_node, obj_desc, NULL);
  71. if (ACPI_FAILURE (status)) {
  72. return_ACPI_STATUS (status);
  73. }
  74. if (params) {
  75. /*
  76.  * The caller "owns" the parameters, so give each one an extra
  77.  * reference
  78.  */
  79. for (i = 0; params[i]; i++) {
  80. acpi_ut_add_reference (params[i]);
  81. }
  82. }
  83. /*
  84.  * 1) Perform the first pass parse of the method to enter any
  85.  * named objects that it creates into the namespace
  86.  */
  87. ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
  88. "**** Begin Method Parse **** Entry=%p obj=%pn",
  89. method_node, obj_desc));
  90. /* Create and init a Root Node */
  91. op = acpi_ps_alloc_op (AML_SCOPE_OP);
  92. if (!op) {
  93. return_ACPI_STATUS (AE_NO_MEMORY);
  94. }
  95. /* Create and initialize a new walk state */
  96. walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT,
  97.    NULL, NULL, NULL);
  98. if (!walk_state) {
  99. return_ACPI_STATUS (AE_NO_MEMORY);
  100. }
  101. status = acpi_ds_init_aml_walk (walk_state, op, method_node, obj_desc->method.aml_start,
  102.   obj_desc->method.aml_length, NULL, NULL, 1);
  103. if (ACPI_FAILURE (status)) {
  104. /* TBD: delete walk state */
  105. return_ACPI_STATUS (status);
  106. }
  107. /* Parse the AML */
  108. status = acpi_ps_parse_aml (walk_state);
  109. acpi_ps_delete_parse_tree (op);
  110. /*
  111.  * 2) Execute the method.  Performs second pass parse simultaneously
  112.  */
  113. ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
  114. "**** Begin Method Execution **** Entry=%p obj=%pn",
  115. method_node, obj_desc));
  116. /* Create and init a Root Node */
  117. op = acpi_ps_alloc_op (AML_SCOPE_OP);
  118. if (!op) {
  119. return_ACPI_STATUS (AE_NO_MEMORY);
  120. }
  121. /* Init new op with the method name and pointer back to the NS node */
  122. acpi_ps_set_name (op, method_node->name);
  123. op->node = method_node;
  124. /* Create and initialize a new walk state */
  125. walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT,
  126.    NULL, NULL, NULL);
  127. if (!walk_state) {
  128. return_ACPI_STATUS (AE_NO_MEMORY);
  129. }
  130. status = acpi_ds_init_aml_walk (walk_state, op, method_node, obj_desc->method.aml_start,
  131.   obj_desc->method.aml_length, params, return_obj_desc, 3);
  132. if (ACPI_FAILURE (status)) {
  133. /* TBD: delete walk state */
  134. return_ACPI_STATUS (status);
  135. }
  136. /*
  137.  * The walk of the parse tree is where we actually execute the method
  138.  */
  139. status = acpi_ps_parse_aml (walk_state);
  140. acpi_ps_delete_parse_tree (op);
  141. if (params) {
  142. /* Take away the extra reference that we gave the parameters above */
  143. for (i = 0; params[i]; i++) {
  144. acpi_ut_update_object_reference (params[i], REF_DECREMENT);
  145. }
  146. }
  147. if (ACPI_FAILURE (status)) {
  148. DUMP_PATHNAME (method_node, "Ps_execute: method failed -",
  149. ACPI_LV_ERROR, _COMPONENT);
  150. }
  151. /*
  152.  * If the method has returned an object, signal this to the caller with
  153.  * a control exception code
  154.  */
  155. if (*return_obj_desc) {
  156. ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Method returned Obj_desc=%pn",
  157. *return_obj_desc));
  158. DUMP_STACK_ENTRY (*return_obj_desc);
  159. status = AE_CTRL_RETURN_VALUE;
  160. }
  161. return_ACPI_STATUS (status);
  162. }