📄 dswload.c
字号:
/******************************************************************************
*
* Module Name: dswload - Dispatcher namespace load callbacks
* $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_DISPATCHER
MODULE_NAME ("dswload")
/*******************************************************************************
*
* FUNCTION: Acpi_ds_load1_begin_op
*
* PARAMETERS: Walk_state - Current state of the parse tree walk
* Op - Op that has been just been reached in the
* walk; Arguments have not been evaluated yet.
*
* RETURN: Status
*
* DESCRIPTION: Descending callback used during the loading of ACPI tables.
*
******************************************************************************/
ACPI_STATUS
acpi_ds_load1_begin_op (
u16 opcode,
ACPI_PARSE_OBJECT *op,
ACPI_WALK_STATE *walk_state,
ACPI_PARSE_OBJECT **out_op)
{
ACPI_NAMESPACE_NODE *node;
ACPI_STATUS status;
OBJECT_TYPE_INTERNAL data_type;
NATIVE_CHAR *path;
/* We are only interested in opcodes that have an associated name */
if (!acpi_ps_is_named_op (opcode)) {
*out_op = op;
return (AE_OK);
}
/* Check if this object has already been installed in the namespace */
if (op && op->node) {
*out_op = op;
return (AE_OK);
}
path = acpi_ps_get_next_namestring (walk_state->parser_state);
/* Map the raw opcode into an internal object type */
data_type = acpi_ds_map_named_opcode_to_data_type (opcode);
/*
* Enter the named type into the internal namespace. We enter the name
* as we go downward in the parse tree. Any necessary subobjects that involve
* arguments to the opcode must be created as we go back up the parse tree later.
*/
status = acpi_ns_lookup (walk_state->scope_info, path,
data_type, IMODE_LOAD_PASS1,
NS_NO_UPSEARCH, walk_state, &(node));
if (ACPI_FAILURE (status)) {
return (status);
}
if (!op) {
/* Create a new op */
op = acpi_ps_alloc_op (opcode);
if (!op) {
return (AE_NO_MEMORY);
}
}
/* Initialize */
((ACPI_PARSE2_OBJECT *)op)->name = node->name;
/*
* Put the Node in the "op" object that the parser uses, so we
* can get it again quickly when this scope is closed
*/
op->node = node;
acpi_ps_append_arg (acpi_ps_get_parent_scope (walk_state->parser_state), op);
*out_op = op;
return (status);
}
/*******************************************************************************
*
* FUNCTION: Acpi_ds_load1_end_op
*
* PARAMETERS: Walk_state - Current state of the parse tree walk
* Op - Op that has been just been completed in the
* walk; Arguments have now been evaluated.
*
* RETURN: Status
*
* DESCRIPTION: Ascending callback used during the loading of the namespace,
* both control methods and everything else.
*
******************************************************************************/
ACPI_STATUS
acpi_ds_load1_end_op (
ACPI_WALK_STATE *walk_state,
ACPI_PARSE_OBJECT *op)
{
OBJECT_TYPE_INTERNAL data_type;
/* We are only interested in opcodes that have an associated name */
if (!acpi_ps_is_named_op (op->opcode)) {
return (AE_OK);
}
/* Get the type to determine if we should pop the scope */
data_type = acpi_ds_map_named_opcode_to_data_type (op->opcode);
if (op->opcode == AML_NAME_OP) {
/* For Name opcode, check the argument */
if (op->value.arg) {
data_type = acpi_ds_map_opcode_to_data_type (
(op->value.arg)->opcode, NULL);
((ACPI_NAMESPACE_NODE *)op->node)->type =
(u8) data_type;
}
}
/* Pop the scope stack */
if (acpi_ns_opens_scope (data_type)) {
acpi_ds_scope_stack_pop (walk_state);
}
return (AE_OK);
}
/*******************************************************************************
*
* FUNCTION: Acpi_ds_load2_begin_op
*
* PARAMETERS: Walk_state - Current state of the parse tree walk
* Op - Op that has been just been reached in the
* walk; Arguments have not been evaluated yet.
*
* RETURN: Status
*
* DESCRIPTION: Descending callback used during the loading of ACPI tables.
*
******************************************************************************/
ACPI_STATUS
acpi_ds_load2_begin_op (
u16 opcode,
ACPI_PARSE_OBJECT *op,
ACPI_WALK_STATE *walk_state,
ACPI_PARSE_OBJECT **out_op)
{
ACPI_NAMESPACE_NODE *node;
ACPI_STATUS status;
OBJECT_TYPE_INTERNAL data_type;
NATIVE_CHAR *buffer_ptr;
void *original = NULL;
/* We only care about Namespace opcodes here */
if (!acpi_ps_is_namespace_op (opcode) &&
opcode != AML_NAMEPATH_OP) {
return (AE_OK);
}
/* Temp! same code as in psparse */
if (!acpi_ps_is_named_op (opcode)) {
return (AE_OK);
}
if (op) {
/*
* Get the name we are going to enter or lookup in the namespace
*/
if (opcode == AML_NAMEPATH_OP) {
/* For Namepath op, get the path string */
buffer_ptr = op->value.string;
if (!buffer_ptr) {
/* No name, just exit */
return (AE_OK);
}
}
else {
/* Get name from the op */
buffer_ptr = (NATIVE_CHAR *) &((ACPI_PARSE2_OBJECT *)op)->name;
}
}
else {
buffer_ptr = acpi_ps_get_next_namestring (walk_state->parser_state);
}
/* Map the raw opcode into an internal object type */
data_type = acpi_ds_map_named_opcode_to_data_type (opcode);
if (opcode == AML_DEF_FIELD_OP ||
opcode == AML_BANK_FIELD_OP ||
opcode == AML_INDEX_FIELD_OP) {
node = NULL;
status = AE_OK;
}
else if (opcode == AML_NAMEPATH_OP) {
/*
* The Name_path is an object reference to an existing object. Don't enter the
* name into the namespace, but look it up for use later
*/
status = acpi_ns_lookup (walk_state->scope_info, buffer_ptr,
data_type, IMODE_EXECUTE,
NS_SEARCH_PARENT, walk_state,
&(node));
}
else {
if (op && op->node) {
original = op->node;
node = op->node;
if (acpi_ns_opens_scope (data_type)) {
status = acpi_ds_scope_stack_push (node,
data_type,
walk_state);
if (ACPI_FAILURE (status)) {
return (status);
}
}
return (AE_OK);
}
/*
* Enter the named type into the internal namespace. We enter the name
* as we go downward in the parse tree. Any necessary subobjects that involve
* arguments to the opcode must be created as we go back up the parse tree later.
*/
status = acpi_ns_lookup (walk_state->scope_info, buffer_ptr,
data_type, IMODE_EXECUTE,
NS_NO_UPSEARCH, walk_state,
&(node));
}
if (ACPI_SUCCESS (status)) {
if (!op) {
/* Create a new op */
op = acpi_ps_alloc_op (opcode);
if (!op) {
return (AE_NO_MEMORY);
}
/* Initialize */
((ACPI_PARSE2_OBJECT *)op)->name = node->name;
*out_op = op;
}
/*
* Put the Node in the "op" object that the parser uses, so we
* can get it again quickly when this scope is closed
*/
op->node = node;
}
return (status);
}
/*******************************************************************************
*
* FUNCTION: Acpi_ds_load2_end_op
*
* PARAMETERS: Walk_state - Current state of the parse tree walk
* Op - Op that has been just been completed in the
* walk; Arguments have now been evaluated.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -