mirror of
https://github.com/reactos/reactos.git
synced 2024-09-19 17:21:14 +00:00
9ea495ba33
svn path=/branches/header-work/; revision=45691
158 lines
4.2 KiB
C
158 lines
4.2 KiB
C
/******************************************************************************
|
|
*
|
|
* Module Name: psxface - Parser external interfaces
|
|
* $Revision: 1.1 $
|
|
*
|
|
*****************************************************************************/
|
|
|
|
/*
|
|
* Copyright (C) 2000, 2001 R. Byron Moore
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
|
|
#include <acpi.h>
|
|
|
|
#define _COMPONENT ACPI_PARSER
|
|
MODULE_NAME ("psxface")
|
|
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* FUNCTION: Acpi_psx_execute
|
|
*
|
|
* PARAMETERS: Method_node - A method object containing both the AML
|
|
* address and length.
|
|
* **Params - List of parameters to pass to method,
|
|
* terminated by NULL. Params itself may be
|
|
* NULL if no parameters are being passed.
|
|
* **Return_obj_desc - Return object from execution of the
|
|
* method.
|
|
*
|
|
* RETURN: Status
|
|
*
|
|
* DESCRIPTION: Execute a control method
|
|
*
|
|
****************************************************************************/
|
|
|
|
ACPI_STATUS
|
|
acpi_psx_execute (
|
|
ACPI_NAMESPACE_NODE *method_node,
|
|
ACPI_OPERAND_OBJECT **params,
|
|
ACPI_OPERAND_OBJECT **return_obj_desc)
|
|
{
|
|
ACPI_STATUS status;
|
|
ACPI_OPERAND_OBJECT *obj_desc;
|
|
u32 i;
|
|
ACPI_PARSE_OBJECT *op;
|
|
|
|
|
|
/* Validate the Node and get the attached object */
|
|
|
|
if (!method_node) {
|
|
return (AE_NULL_ENTRY);
|
|
}
|
|
|
|
obj_desc = acpi_ns_get_attached_object (method_node);
|
|
if (!obj_desc) {
|
|
return (AE_NULL_OBJECT);
|
|
}
|
|
|
|
/* Init for new method, wait on concurrency semaphore */
|
|
|
|
status = acpi_ds_begin_method_execution (method_node, obj_desc, NULL);
|
|
if (ACPI_FAILURE (status)) {
|
|
return (status);
|
|
}
|
|
|
|
if (params) {
|
|
/*
|
|
* The caller "owns" the parameters, so give each one an extra
|
|
* reference
|
|
*/
|
|
|
|
for (i = 0; params[i]; i++) {
|
|
acpi_cm_add_reference (params[i]);
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Perform the first pass parse of the method to enter any
|
|
* named objects that it creates into the namespace
|
|
*/
|
|
|
|
/* Create and init a Root Node */
|
|
|
|
op = acpi_ps_alloc_op (AML_SCOPE_OP);
|
|
if (!op) {
|
|
return (AE_NO_MEMORY);
|
|
}
|
|
|
|
status = acpi_ps_parse_aml (op, obj_desc->method.pcode,
|
|
obj_desc->method.pcode_length,
|
|
ACPI_PARSE_LOAD_PASS1 | ACPI_PARSE_DELETE_TREE,
|
|
method_node, params, return_obj_desc,
|
|
acpi_ds_load1_begin_op, acpi_ds_load1_end_op);
|
|
acpi_ps_delete_parse_tree (op);
|
|
|
|
/* Create and init a Root Node */
|
|
|
|
op = acpi_ps_alloc_op (AML_SCOPE_OP);
|
|
if (!op) {
|
|
return (AE_NO_MEMORY);
|
|
}
|
|
|
|
|
|
/* Init new op with the method name and pointer back to the NS node */
|
|
|
|
acpi_ps_set_name (op, method_node->name);
|
|
op->node = method_node;
|
|
|
|
/*
|
|
* The walk of the parse tree is where we actually execute the method
|
|
*/
|
|
status = acpi_ps_parse_aml (op, obj_desc->method.pcode,
|
|
obj_desc->method.pcode_length,
|
|
ACPI_PARSE_EXECUTE | ACPI_PARSE_DELETE_TREE,
|
|
method_node, params, return_obj_desc,
|
|
acpi_ds_exec_begin_op, acpi_ds_exec_end_op);
|
|
acpi_ps_delete_parse_tree (op);
|
|
|
|
if (params) {
|
|
/* Take away the extra reference that we gave the parameters above */
|
|
|
|
for (i = 0; params[i]; i++) {
|
|
acpi_cm_update_object_reference (params[i], REF_DECREMENT);
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
* Normal exit is with Status == AE_RETURN_VALUE when a Return_op has been
|
|
* executed, or with Status == AE_PENDING at end of AML block (end of
|
|
* Method code)
|
|
*/
|
|
|
|
if (*return_obj_desc) {
|
|
status = AE_CTRL_RETURN_VALUE;
|
|
}
|
|
|
|
|
|
return (status);
|
|
}
|
|
|
|
|